{"openapi":"3.1.0","info":{"title":"Aurea Backend Services API","description":"Authentication and Blockchain Wallet Management API","version":"1.0.0"},"components":{"schemas":{"WebhookEvent.ramp.kyc.updated.v1":{"type":"object","title":"ramp.kyc.updated","description":"A user's verification with the bank ramp changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.kyc.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["userId","kycStatus","onboardingStatus","verificationStatus","customerType","actionsRequired","regions","agreements","nextStep","updatedAt"],"properties":{"userId":{"type":"string","format":"uuid"},"kycStatus":{"type":["string","null"]},"onboardingStatus":{"type":["string","null"]},"verificationStatus":{"type":["string","null"],"description":"Pending, Approved or Declined, as the bank ramp reported it"},"customerType":{"type":["string","null"],"description":"Individual or Business"},"actionsRequired":{"type":"array","items":{"type":"string"},"description":"What the bank ramp asks the customer to do before the review continues; empty when nothing is asked"},"regions":{"type":"array","items":{"type":"object","required":["entity","region","status","rejection"],"properties":{"entity":{"type":"string"},"region":{"type":"string"},"status":{"type":["string","null"]},"rejection":{"type":["string","null"],"enum":["retry","final",null]}}}},"agreements":{"type":"array","items":{"type":"object","required":["name","version","accepted","acceptedAt"],"properties":{"name":{"type":"string"},"version":{"type":["integer","null"]},"accepted":{"type":"boolean"},"acceptedAt":{"type":["string","null"]}}}},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected"]},"updatedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"ramp.kyc.updated","x-aurea-event-version":1},"WebhookEvent.ramp.deposit.updated.v1":{"type":"object","title":"ramp.deposit.updated","description":"A fiat deposit to a user's virtual account changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.deposit.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["depositId","noahDepositId","userId","paymentMethodId","status","noahStatus","noahSubStatus","requestForInformation","refunds","paymentMethodType","paymentSystemId","fiatAmount","fiatCurrency","depositDate","updatedAt"],"properties":{"depositId":{"type":"string","format":"uuid"},"noahDepositId":{"type":"string"},"bankRampDepositId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"userId":{"type":"string","format":"uuid"},"paymentMethodId":{"type":"string","format":"uuid","description":"Aurea's id of the virtual account the deposit arrived on"},"status":{"type":"string","description":"Aurea's status: pending, completed or failed"},"noahStatus":{"type":["string","null"],"description":"The bank ramp's own status: Pending, Settled or Failed"},"bankRampStatus":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"noahSubStatus":{"type":["string","null"]},"bankRampSubStatus":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"requestForInformation":{"type":["object","null"],"required":["status","type"],"properties":{"status":{"type":["string","null"]},"type":{"type":["string","null"]}},"description":"The bank ramp's request for information while the payment is reviewed (status AwaitingCustomer, UnderReview, Closed or Completed; type Manual or ProofOfAddress); null when there is none."},"refunds":{"type":"array","description":"The bank ramp's refunds; empty when there is none.","items":{"type":"object","required":["refundId","amount","currency","status","requestedAt"],"properties":{"refundId":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"Exact decimal text"},"currency":{"type":["string","null"]},"status":{"type":["string","null"]},"requestedAt":{"type":["string","null"],"format":"date-time"}}}},"paymentMethodType":{"type":["string","null"]},"paymentSystemId":{"type":["string","null"]},"fiatAmount":{"type":["string","null"],"description":"Exact decimal text"},"fiatCurrency":{"type":"string"},"depositDate":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"ramp.deposit.updated","x-aurea-event-version":1},"WebhookEvent.ramp.payout.updated.v1":{"type":"object","title":"ramp.payout.updated","description":"A user's payout to a bank account changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.payout.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","userId","kind","status","cryptoCurrency","cryptoAuthorizedAmount","fiatAmount","fiatCurrency","noahTransactionId","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["hosted","rule"],"description":"hosted: paid through the bank ramp's checkout; rule: paid by the user's own deposit to a payout rule"},"status":{"type":"string"},"cryptoCurrency":{"type":"string"},"cryptoAuthorizedAmount":{"type":"string","description":"Decimal text"},"fiatAmount":{"type":"string","description":"Decimal text"},"fiatCurrency":{"type":"string"},"noahTransactionId":{"type":["string","null"]},"bankRampTransactionId":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"updatedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"ramp.payout.updated","x-aurea-event-version":1},"WebhookEvent.ramp.transaction.updated.v1":{"type":"object","title":"ramp.transaction.updated","description":"A bank ramp transaction of a user changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.transaction.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["transactionId","noahTransactionId","userId","transactionType","status","noahStatus","noahSubStatus","cryptoAmount","cryptoCurrency","fiatAmount","fiatCurrency","network","destinationAddress","transactionHash","depositId","direction","noahDepositId","requestForInformation","refunds","ruleId","ruleExecutionId","reversesTransactionId","adjustment","breakdown","networkFee","fiatFeeAmount","fiatRate","paymentSystemId","updatedAt"],"properties":{"transactionId":{"type":"string","format":"uuid"},"noahTransactionId":{"type":"string"},"bankRampTransactionId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"userId":{"type":"string","format":"uuid"},"transactionType":{"type":"string"},"status":{"type":"string"},"noahStatus":{"type":["string","null"]},"bankRampStatus":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"noahSubStatus":{"type":["string","null"]},"bankRampSubStatus":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"cryptoAmount":{"type":["string","null"],"description":"Exact decimal text"},"cryptoCurrency":{"type":["string","null"]},"fiatAmount":{"type":["string","null"],"description":"Exact decimal text"},"fiatCurrency":{"type":["string","null"]},"network":{"type":["string","null"]},"destinationAddress":{"type":["string","null"]},"transactionHash":{"type":["string","null"]},"depositId":{"type":["string","null"],"format":"uuid","description":"Aurea's id of the deposit that paid for it; for an on-ramp's on-chain delivery, the deposit of its rule execution"},"direction":{"type":["string","null"],"enum":["In","Out",null]},"noahDepositId":{"type":["string","null"]},"bankRampDepositId":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"requestForInformation":{"type":["object","null"],"required":["status","type"],"properties":{"status":{"type":["string","null"]},"type":{"type":["string","null"]}},"description":"The bank ramp's request for information while the payment is reviewed (status AwaitingCustomer, UnderReview, Closed or Completed; type Manual or ProofOfAddress); null when there is none."},"refunds":{"type":"array","description":"The bank ramp's refunds; empty when there is none.","items":{"type":"object","required":["refundId","amount","currency","status","requestedAt"],"properties":{"refundId":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"Exact decimal text"},"currency":{"type":["string","null"]},"status":{"type":["string","null"]},"requestedAt":{"type":["string","null"],"format":"date-time"}}}},"ruleId":{"type":["string","null"]},"ruleExecutionId":{"type":["string","null"]},"reversesTransactionId":{"type":["string","null"]},"adjustment":{"type":["object","null"],"required":["adjustedTransactionId","adjustmentId","reason"],"properties":{"adjustedTransactionId":{"type":["string","null"]},"adjustmentId":{"type":["string","null"]},"reason":{"type":["string","null"]}}},"breakdown":{"type":"array","items":{"type":"object","required":["type","amount","fixedAmount","variableAmount"],"properties":{"type":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"Exact decimal text"},"fixedAmount":{"type":["string","null"],"description":"Exact decimal text"},"variableAmount":{"type":["string","null"],"description":"Exact decimal text"}}}},"networkFee":{"type":["string","null"],"description":"Exact decimal text"},"fiatFeeAmount":{"type":["string","null"],"description":"Exact decimal text"},"fiatRate":{"type":["string","null"],"description":"Exact decimal text"},"paymentSystemId":{"type":["string","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"ramp.transaction.updated","x-aurea-event-version":1},"WebhookEvent.ramp.card_session.updated.v1":{"type":"object","title":"ramp.card_session.updated","description":"A card onramp session changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.card_session.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.card_session.updated","x-aurea-event-version":1},"WebhookEvent.earn.operation.updated.v1":{"type":"object","title":"earn.operation.updated","description":"An earn deposit or withdrawal changed state. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["earn.operation.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","productId","kind","route","state","walletAddress","chainId","amount","withdrawAll","txHashes","failureCode","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"]},"walletAddress":{"type":"string"},"chainId":{"type":"integer"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit; null for a withdrawal of everything"},"withdrawAll":{"type":"boolean"},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["string","null"]},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"earn.operation.updated","x-aurea-event-version":1},"WebhookEvent.earn.redemption.updated.v1":{"type":"object","title":"earn.redemption.updated","description":"A redemption an earn provider queued changed state. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["earn.redemption.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["redemptionId","operationId","productId","state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"properties":{"redemptionId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"productId":{"type":"string"},"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"]},"shares":{"type":"string","description":"In the vault share's smallest unit"},"assetsExpected":{"type":["string","null"]},"assetsPaid":{"type":["string","null"]},"requestId":{"type":["string","null"]},"paidTxHash":{"type":["string","null"]},"queuedAt":{"type":["string","null"],"format":"date-time"},"paidAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"earn.redemption.updated","x-aurea-event-version":1},"WebhookEvent.operation.created.v1":{"type":"object","title":"operation.created","description":"An operation was recorded (a send, an approval, a swap, a signature…), in the state its first step left it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["operation.created"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","type","state","subState","failureReason","legacyStatus","origin","userId","walletId","chain","chainId","isTestnet","asset","amount","destination","externalTxId","idempotencyKey","transactionId","preparedTxId","providerRef","tokenizedOperationId","txHashes","createdAt","updatedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"operation.created","x-aurea-event-version":1},"WebhookEvent.operation.state_changed.v1":{"type":"object","title":"operation.state_changed","description":"An operation moved: a new state, or a new sub-state of the same one. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["operation.state_changed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","type","state","subState","failureReason","legacyStatus","origin","userId","walletId","chain","chainId","isTestnet","asset","amount","destination","externalTxId","idempotencyKey","transactionId","preparedTxId","providerRef","tokenizedOperationId","txHashes","createdAt","updatedAt","finishedAt","previousState","previousSubState"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"previousState":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"Its state before this change"},"previousSubState":{"type":["string","null"],"description":"Its sub-state before this change"}}}},"x-aurea-event-type":"operation.state_changed","x-aurea-event-version":1},"WebhookEvent.operation.completed.v1":{"type":"object","title":"operation.completed","description":"An operation completed (its final state COMPLETED). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["operation.completed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","type","state","subState","failureReason","legacyStatus","origin","userId","walletId","chain","chainId","isTestnet","asset","amount","destination","externalTxId","idempotencyKey","transactionId","preparedTxId","providerRef","tokenizedOperationId","txHashes","createdAt","updatedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"operation.completed","x-aurea-event-version":1},"WebhookEvent.operation.failed.v1":{"type":"object","title":"operation.failed","description":"An operation failed (its final state FAILED). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["operation.failed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","type","state","subState","failureReason","legacyStatus","origin","userId","walletId","chain","chainId","isTestnet","asset","amount","destination","externalTxId","idempotencyKey","transactionId","preparedTxId","providerRef","tokenizedOperationId","txHashes","createdAt","updatedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"operation.failed","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.paused.v1":{"type":"object","title":"tokenized_asset.paused","description":"A tokenized asset the tenant offers was paused on a chain: buying, selling or both. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.paused"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["actionId","assetId","isTestnet","symbol","chainId","kind","detail","source","effectiveAt","observedAt"],"properties":{"actionId":{"type":"string","format":"uuid"},"assetId":{"type":"string","format":"uuid","description":"The asset's id in this environment"},"isTestnet":{"type":"boolean"},"symbol":{"type":"string","description":"The token's symbol, as its contract names it"},"chainId":{"type":["integer","null"],"description":"The chain a pause is on (1 or 56); null for a dividend or a multiplier, which are the asset's"},"kind":{"type":"string","enum":["paused","resumed","dividend","multiplier"]},"detail":{"type":"object","description":"paused: buyPaused, sellPaused, tokenPaused (no transfer moves it), reason (an Aurea code or null); resumed: pausedSince; dividend: amount, paymentDate, yield, frequency; multiplier: previous, current (decimals: underlying shares per token)","properties":{"buyPaused":{"type":"boolean"},"sellPaused":{"type":"boolean"},"tokenPaused":{"type":"boolean"},"reason":{"type":["string","null"]},"pausedSince":{"type":["string","null"],"format":"date-time"},"amount":{"type":"string"},"paymentDate":{"type":"string"},"yield":{"type":"string"},"frequency":{"type":"string"},"previous":{"type":"string"},"current":{"type":"string"}}},"source":{"type":"string","enum":["feed","chain"],"description":"feed: the market data feed said so; chain: the asset's contracts or oracle"},"effectiveAt":{"type":["string","null"],"format":"date-time","description":"When it took effect, when that is known"},"observedAt":{"type":"string","format":"date-time","description":"When the Hub saw it"}}}},"x-aurea-event-type":"tokenized_asset.paused","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.resumed.v1":{"type":"object","title":"tokenized_asset.resumed","description":"A tokenized asset the tenant offers trades again on a chain. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.resumed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["actionId","assetId","isTestnet","symbol","chainId","kind","detail","source","effectiveAt","observedAt"],"properties":{"actionId":{"type":"string","format":"uuid"},"assetId":{"type":"string","format":"uuid","description":"The asset's id in this environment"},"isTestnet":{"type":"boolean"},"symbol":{"type":"string","description":"The token's symbol, as its contract names it"},"chainId":{"type":["integer","null"],"description":"The chain a pause is on (1 or 56); null for a dividend or a multiplier, which are the asset's"},"kind":{"type":"string","enum":["paused","resumed","dividend","multiplier"]},"detail":{"type":"object","description":"paused: buyPaused, sellPaused, tokenPaused (no transfer moves it), reason (an Aurea code or null); resumed: pausedSince; dividend: amount, paymentDate, yield, frequency; multiplier: previous, current (decimals: underlying shares per token)","properties":{"buyPaused":{"type":"boolean"},"sellPaused":{"type":"boolean"},"tokenPaused":{"type":"boolean"},"reason":{"type":["string","null"]},"pausedSince":{"type":["string","null"],"format":"date-time"},"amount":{"type":"string"},"paymentDate":{"type":"string"},"yield":{"type":"string"},"frequency":{"type":"string"},"previous":{"type":"string"},"current":{"type":"string"}}},"source":{"type":"string","enum":["feed","chain"],"description":"feed: the market data feed said so; chain: the asset's contracts or oracle"},"effectiveAt":{"type":["string","null"],"format":"date-time","description":"When it took effect, when that is known"},"observedAt":{"type":"string","format":"date-time","description":"When the Hub saw it"}}}},"x-aurea-event-type":"tokenized_asset.resumed","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.corporate_action.v1":{"type":"object","title":"tokenized_asset.corporate_action","description":"A tokenized asset the tenant offers has a new dividend or a new shares multiplier. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.corporate_action"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["actionId","assetId","isTestnet","symbol","chainId","kind","detail","source","effectiveAt","observedAt"],"properties":{"actionId":{"type":"string","format":"uuid"},"assetId":{"type":"string","format":"uuid","description":"The asset's id in this environment"},"isTestnet":{"type":"boolean"},"symbol":{"type":"string","description":"The token's symbol, as its contract names it"},"chainId":{"type":["integer","null"],"description":"The chain a pause is on (1 or 56); null for a dividend or a multiplier, which are the asset's"},"kind":{"type":"string","enum":["paused","resumed","dividend","multiplier"]},"detail":{"type":"object","description":"paused: buyPaused, sellPaused, tokenPaused (no transfer moves it), reason (an Aurea code or null); resumed: pausedSince; dividend: amount, paymentDate, yield, frequency; multiplier: previous, current (decimals: underlying shares per token)","properties":{"buyPaused":{"type":"boolean"},"sellPaused":{"type":"boolean"},"tokenPaused":{"type":"boolean"},"reason":{"type":["string","null"]},"pausedSince":{"type":["string","null"],"format":"date-time"},"amount":{"type":"string"},"paymentDate":{"type":"string"},"yield":{"type":"string"},"frequency":{"type":"string"},"previous":{"type":"string"},"current":{"type":"string"}}},"source":{"type":"string","enum":["feed","chain"],"description":"feed: the market data feed said so; chain: the asset's contracts or oracle"},"effectiveAt":{"type":["string","null"],"format":"date-time","description":"When it took effect, when that is known"},"observedAt":{"type":"string","format":"date-time","description":"When the Hub saw it"}}}},"x-aurea-event-type":"tokenized_asset.corporate_action","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.operation.quoted.v1":{"type":"object","title":"tokenized_asset.operation.quoted","description":"A tokenized assets operation was created: built, and for a trade its binding quote held. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.operation.quoted"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","userId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":["string","null"],"enum":["buy","sell",null]},"unit":{"type":"string","enum":["token","shares","base"],"description":"base: tokens counted before their multiplier (a balance shows base × multiplier)"},"tokenAmount":{"type":["string","null"],"description":"Exact decimal text"},"valueUsd":{"type":["string","null"],"description":"Exact decimal text"},"paymentToken":{"type":["string","null"]},"paymentAmount":{"type":["string","null"],"description":"Exact decimal text"},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet; own: one of the user's"},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["string","null"],"format":"uuid"},"order":{"type":["object","null"],"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"Exact decimal text"},"expiresAt":{"type":["string","null"],"format":"date-time"},"filledTokenAmount":{"type":["string","null"],"description":"Exact decimal text"}}},"signingExpiresAt":{"type":["string","null"],"format":"date-time"},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["string","null"],"description":"Exact decimal text"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"settlement":{"type":"object","required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"properties":{"settlingSince":{"type":["string","null"],"format":"date-time"},"multiplier":{"type":["string","null"],"description":"Exact decimal text"},"tokenAmountAsBalance":{"type":["string","null"],"description":"Exact decimal text"},"toChainId":{"type":["integer","null"]}},"description":"Present on market and instant orders, chain transfers and in-kind operations (and their holdings' deliveries and returns) only"}}}},"x-aurea-event-type":"tokenized_asset.operation.quoted","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.operation.submitted.v1":{"type":"object","title":"tokenized_asset.operation.submitted","description":"A tokenized assets operation's first transaction was sent. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.operation.submitted"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","userId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":["string","null"],"enum":["buy","sell",null]},"unit":{"type":"string","enum":["token","shares","base"],"description":"base: tokens counted before their multiplier (a balance shows base × multiplier)"},"tokenAmount":{"type":["string","null"],"description":"Exact decimal text"},"valueUsd":{"type":["string","null"],"description":"Exact decimal text"},"paymentToken":{"type":["string","null"]},"paymentAmount":{"type":["string","null"],"description":"Exact decimal text"},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet; own: one of the user's"},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["string","null"],"format":"uuid"},"order":{"type":["object","null"],"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"Exact decimal text"},"expiresAt":{"type":["string","null"],"format":"date-time"},"filledTokenAmount":{"type":["string","null"],"description":"Exact decimal text"}}},"signingExpiresAt":{"type":["string","null"],"format":"date-time"},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["string","null"],"description":"Exact decimal text"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"settlement":{"type":"object","required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"properties":{"settlingSince":{"type":["string","null"],"format":"date-time"},"multiplier":{"type":["string","null"],"description":"Exact decimal text"},"tokenAmountAsBalance":{"type":["string","null"],"description":"Exact decimal text"},"toChainId":{"type":["integer","null"]}},"description":"Present on market and instant orders, chain transfers and in-kind operations (and their holdings' deliveries and returns) only"}}}},"x-aurea-event-type":"tokenized_asset.operation.submitted","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.operation.completed.v1":{"type":"object","title":"tokenized_asset.operation.completed","description":"A tokenized assets operation completed on chain. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.operation.completed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","userId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":["string","null"],"enum":["buy","sell",null]},"unit":{"type":"string","enum":["token","shares","base"],"description":"base: tokens counted before their multiplier (a balance shows base × multiplier)"},"tokenAmount":{"type":["string","null"],"description":"Exact decimal text"},"valueUsd":{"type":["string","null"],"description":"Exact decimal text"},"paymentToken":{"type":["string","null"]},"paymentAmount":{"type":["string","null"],"description":"Exact decimal text"},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet; own: one of the user's"},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["string","null"],"format":"uuid"},"order":{"type":["object","null"],"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"Exact decimal text"},"expiresAt":{"type":["string","null"],"format":"date-time"},"filledTokenAmount":{"type":["string","null"],"description":"Exact decimal text"}}},"signingExpiresAt":{"type":["string","null"],"format":"date-time"},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["string","null"],"description":"Exact decimal text"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"settlement":{"type":"object","required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"properties":{"settlingSince":{"type":["string","null"],"format":"date-time"},"multiplier":{"type":["string","null"],"description":"Exact decimal text"},"tokenAmountAsBalance":{"type":["string","null"],"description":"Exact decimal text"},"toChainId":{"type":["integer","null"]}},"description":"Present on market and instant orders, chain transfers and in-kind operations (and their holdings' deliveries and returns) only"}}}},"x-aurea-event-type":"tokenized_asset.operation.completed","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.operation.failed.v1":{"type":"object","title":"tokenized_asset.operation.failed","description":"A tokenized assets operation failed (failureCode says why). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.operation.failed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","userId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":["string","null"],"enum":["buy","sell",null]},"unit":{"type":"string","enum":["token","shares","base"],"description":"base: tokens counted before their multiplier (a balance shows base × multiplier)"},"tokenAmount":{"type":["string","null"],"description":"Exact decimal text"},"valueUsd":{"type":["string","null"],"description":"Exact decimal text"},"paymentToken":{"type":["string","null"]},"paymentAmount":{"type":["string","null"],"description":"Exact decimal text"},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet; own: one of the user's"},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["string","null"],"format":"uuid"},"order":{"type":["object","null"],"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"Exact decimal text"},"expiresAt":{"type":["string","null"],"format":"date-time"},"filledTokenAmount":{"type":["string","null"],"description":"Exact decimal text"}}},"signingExpiresAt":{"type":["string","null"],"format":"date-time"},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["string","null"],"description":"Exact decimal text"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"settlement":{"type":"object","required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"properties":{"settlingSince":{"type":["string","null"],"format":"date-time"},"multiplier":{"type":["string","null"],"description":"Exact decimal text"},"tokenAmountAsBalance":{"type":["string","null"],"description":"Exact decimal text"},"toChainId":{"type":["integer","null"]}},"description":"Present on market and instant orders, chain transfers and in-kind operations (and their holdings' deliveries and returns) only"}}}},"x-aurea-event-type":"tokenized_asset.operation.failed","x-aurea-event-version":1},"WebhookEvent.tokenized_asset.operation.expired.v1":{"type":"object","title":"tokenized_asset.operation.expired","description":"A tokenized assets operation's time ran out before it was carried out. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["tokenized_asset.operation.expired"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","userId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"properties":{"operationId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":["string","null"],"enum":["buy","sell",null]},"unit":{"type":"string","enum":["token","shares","base"],"description":"base: tokens counted before their multiplier (a balance shows base × multiplier)"},"tokenAmount":{"type":["string","null"],"description":"Exact decimal text"},"valueUsd":{"type":["string","null"],"description":"Exact decimal text"},"paymentToken":{"type":["string","null"]},"paymentAmount":{"type":["string","null"],"description":"Exact decimal text"},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet; own: one of the user's"},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["string","null"],"format":"uuid"},"order":{"type":["object","null"],"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"Exact decimal text"},"expiresAt":{"type":["string","null"],"format":"date-time"},"filledTokenAmount":{"type":["string","null"],"description":"Exact decimal text"}}},"signingExpiresAt":{"type":["string","null"],"format":"date-time"},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["string","null"],"description":"Exact decimal text"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"settlement":{"type":"object","required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"properties":{"settlingSince":{"type":["string","null"],"format":"date-time"},"multiplier":{"type":["string","null"],"description":"Exact decimal text"},"tokenAmountAsBalance":{"type":["string","null"],"description":"Exact decimal text"},"toChainId":{"type":["integer","null"]}},"description":"Present on market and instant orders, chain transfers and in-kind operations (and their holdings' deliveries and returns) only"}}}},"x-aurea-event-type":"tokenized_asset.operation.expired","x-aurea-event-version":1},"WebhookEvent.server_credential.revoked.v1":{"type":"object","title":"server_credential.revoked","description":"One of the tenant's server credentials was revoked: its tokens are refused from the next request (the credential as the API answers it). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["server_credential.revoked"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","tenantId","name","role","status","publicKey","thumbprint","allowedIps","expiresAt","createdAt","createdBy","updatedAt","updatedBy","lastUsedAt","revokedAt","revokedBy","revokeReason","roleNarrows"],"properties":{"id":{"type":"string","format":"uuid","description":"The credential, and the `kid` of the tokens it signs."},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"status":{"type":"string","enum":["active","expired","revoked"],"description":"active: its tokens are accepted; expired: past `expiresAt`; revoked: for good."},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"allowedIps":{"type":"array","items":{"type":"string"},"description":"The networks its tokens are accepted from; empty: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"Null: no expiry."},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"],"format":"uuid"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last accepted token (written at most once a minute)."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"},"revokeReason":{"type":["string","null"]},"roleNarrows":{"type":"boolean","description":"Whether its role decides which tenant-signed routes its tokens reach: true for every credential registered since 06/10/2026 (its role must hold each route's permission, else 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`); false for one registered before, which reaches every tenant-signed route as the tenant's API key does. Never changes."},"testOnly":{"type":"boolean","description":"Present, `true`, only on a credential registered for test networks only: its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Never changes. Absent on every other credential."}}}},"x-aurea-event-type":"server_credential.revoked","x-aurea-event-version":1},"WebhookEvent.account.created.v1":{"type":"object","title":"account.created","description":"An account was created (one call, or one of a bulk creation). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["account.created"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"account.created","x-aurea-event-version":1},"WebhookEvent.account.updated.v1":{"type":"object","title":"account.updated","description":"An account's name, tags, visibility, users or customerRefId changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["account.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"account.updated","x-aurea-event-version":1},"WebhookEvent.account.wallet_added.v1":{"type":"object","title":"account.wallet_added","description":"A wallet was made for an account, or put in it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["account.wallet_added"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["accountId","customerRefId","walletId","chain","family","isTestnet","address","how"],"properties":{"accountId":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"]},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"family":{"type":"string","description":"`evm` for every EVM chain, else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"how":{"type":"string","enum":["created","attached"],"description":"created: made for the account through the tenant's wallet path; attached: one of the owner's wallets put in it"}}}},"x-aurea-event-type":"account.wallet_added","x-aurea-event-version":1},"WebhookEvent.transfer.inbound.recorded.v1":{"type":"object","title":"transfer.inbound.recorded","description":"A transfer into one of the tenant's wallets was recorded once its block had the platform's confirmations (or came back after a re-organisation). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["transfer.inbound.recorded"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","walletId","chainId","txHash","logIndex","asset","amount","removed"],"properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid","description":"The tenant's wallet the transfer reached"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid","description":"The wallet's user when the transfer was recorded"},"chain":{"type":"string","description":"The chain's family, as wallets and tokens name it (gnosis, polygon, base…)"},"chainId":{"type":"integer","description":"The chain id: an EVM chain's, or Solana's (1399811149 mainnet, 1399811150 the test cluster)"},"isTestnet":{"type":"boolean"},"txHash":{"type":"string","description":"The transaction: EVM, its hash, lower case; Solana, its signature (base58, case kept)"},"logIndex":{"type":"integer","description":"EVM: the Transfer log's index in its block for a token, -1 for the native coin the transaction carried. Solana: the instruction's place in the transaction (top-level and inner instructions in the order they ran)"},"blockNumber":{"type":"integer","description":"EVM: the block; Solana: the slot"},"blockHash":{"type":"string","description":"EVM: the block's hash; Solana: the slot's blockhash"},"blockTime":{"type":["string","null"],"format":"date-time"},"from":{"type":"string","description":"The sender (EVM lower case; Solana base58: for a token, the source account's owner, for a mint, the mint's authority)"},"to":{"type":"string","description":"The wallet's address (EVM lower case; Solana base58)"},"asset":{"type":"string","description":"`native`, or the token: an EVM contract, lower case, or a Solana mint, base58"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"In the asset's smallest unit (wei for 18 decimals, lamports for SOL)"},"recordedAt":{"type":"string","format":"date-time"},"removed":{"type":"boolean","description":"A re-organisation of the chain took the transfer's block away; it counts nowhere until a new block carries it again"},"removedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"transfer.inbound.recorded","x-aurea-event-version":1},"WebhookEvent.transfer.inbound.removed.v1":{"type":"object","title":"transfer.inbound.removed","description":"A re-organisation of the chain took a recorded transfer's block away: it counts nowhere until a new block carries it again. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["transfer.inbound.removed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","walletId","chainId","txHash","logIndex","asset","amount","removed"],"properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid","description":"The tenant's wallet the transfer reached"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid","description":"The wallet's user when the transfer was recorded"},"chain":{"type":"string","description":"The chain's family, as wallets and tokens name it (gnosis, polygon, base…)"},"chainId":{"type":"integer","description":"The chain id: an EVM chain's, or Solana's (1399811149 mainnet, 1399811150 the test cluster)"},"isTestnet":{"type":"boolean"},"txHash":{"type":"string","description":"The transaction: EVM, its hash, lower case; Solana, its signature (base58, case kept)"},"logIndex":{"type":"integer","description":"EVM: the Transfer log's index in its block for a token, -1 for the native coin the transaction carried. Solana: the instruction's place in the transaction (top-level and inner instructions in the order they ran)"},"blockNumber":{"type":"integer","description":"EVM: the block; Solana: the slot"},"blockHash":{"type":"string","description":"EVM: the block's hash; Solana: the slot's blockhash"},"blockTime":{"type":["string","null"],"format":"date-time"},"from":{"type":"string","description":"The sender (EVM lower case; Solana base58: for a token, the source account's owner, for a mint, the mint's authority)"},"to":{"type":"string","description":"The wallet's address (EVM lower case; Solana base58)"},"asset":{"type":"string","description":"`native`, or the token: an EVM contract, lower case, or a Solana mint, base58"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"In the asset's smallest unit (wei for 18 decimals, lamports for SOL)"},"recordedAt":{"type":"string","format":"date-time"},"removed":{"type":"boolean","description":"A re-organisation of the chain took the transfer's block away; it counts nowhere until a new block carries it again"},"removedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"transfer.inbound.removed","x-aurea-event-version":1},"WebhookEvent.address_book.entry.requested.v1":{"type":"object","title":"address_book.entry.requested","description":"An address book entry waits for its approval: it was added, or its address changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.requested"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.requested","x-aurea-event-version":1},"WebhookEvent.address_book.entry.approved.v1":{"type":"object","title":"address_book.entry.approved","description":"An address book entry was approved: it cools until activeAt (active at once with no cooling period). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.approved"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.approved","x-aurea-event-version":1},"WebhookEvent.address_book.entry.activated.v1":{"type":"object","title":"address_book.entry.activated","description":"An address book entry's cooling period ended: the tenant's operations may send to it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.activated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.activated","x-aurea-event-version":1},"WebhookEvent.address_book.entry.rejected.v1":{"type":"object","title":"address_book.entry.rejected","description":"An address book entry was rejected (final). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.rejected"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.rejected","x-aurea-event-version":1},"WebhookEvent.address_book.entry.removed.v1":{"type":"object","title":"address_book.entry.removed","description":"An address book entry was removed (final). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.removed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.removed","x-aurea-event-version":1},"WebhookEvent.address_book.entry.proven.v1":{"type":"object","title":"address_book.entry.proven","description":"The owner of an external address book entry proved they hold it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.entry.proven"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.entry.proven","x-aurea-event-version":1},"WebhookEvent.address_book.destination.unlisted.v1":{"type":"object","title":"address_book.destination.unlisted","description":"An operation went to an address outside the tenant's address book (mode log), or was refused for it (mode enforce). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["address_book.destination.unlisted"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["point","verdict","mode","refused","family","network","chain","chainId","address","sourceWalletId","occurredAt"],"properties":{"point":{"type":"string","description":"The signing point"},"verdict":{"type":"string","enum":["unlisted","unresolved","one_time"],"description":"unlisted: outside the book; unresolved: its chain or network could not be told; one_time: outside the book, allowed by the tenant's one-time addresses"},"mode":{"type":"string","enum":["log","enforce"]},"refused":{"type":"boolean"},"family":{"type":["string","null"]},"network":{"type":["string","null"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"address":{"type":["string","null"]},"sourceWalletId":{"type":["string","null"],"format":"uuid"},"occurredAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"address_book.destination.unlisted","x-aurea-event-version":1},"WebhookEvent.transaction.created.v1":{"type":"object","title":"transaction.created","description":"A transaction was recorded (a send or a swap), before or as it was broadcast. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["transaction.created"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["transactionId","userId","walletId","chain","isTestnet","type","status","fromAddress","toAddress","amount","token","txHash","blockNumber","feeAmount","createdAt","updatedAt"],"properties":{"transactionId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"type":{"type":["string","null"],"description":"transfer, token_transfer, swap, contract_call or contract_deployment"},"status":{"type":"string","enum":["pending","confirmed","failed","cancelled"]},"fromAddress":{"type":["string","null"]},"toAddress":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"token":{"type":"object","required":["address","symbol","decimals"],"properties":{"address":{"type":["string","null"]},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]}}},"txHash":{"type":["string","null"],"description":"null until the transaction is broadcast"},"blockNumber":{"type":["string","null"],"description":"The block that carried it, once mined"},"feeAmount":{"type":["string","null"],"description":"Exact decimal text"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"transaction.created","x-aurea-event-version":1},"WebhookEvent.transaction.status_changed.v1":{"type":"object","title":"transaction.status_changed","description":"A transaction's status changed: confirmed, failed or cancelled (and from what). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["transaction.status_changed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["transactionId","userId","walletId","chain","isTestnet","type","status","fromAddress","toAddress","amount","token","txHash","blockNumber","feeAmount","createdAt","updatedAt","previousStatus"],"properties":{"transactionId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"type":{"type":["string","null"],"description":"transfer, token_transfer, swap, contract_call or contract_deployment"},"status":{"type":"string","enum":["pending","confirmed","failed","cancelled"]},"fromAddress":{"type":["string","null"]},"toAddress":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"token":{"type":"object","required":["address","symbol","decimals"],"properties":{"address":{"type":["string","null"]},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]}}},"txHash":{"type":["string","null"],"description":"null until the transaction is broadcast"},"blockNumber":{"type":["string","null"],"description":"The block that carried it, once mined"},"feeAmount":{"type":["string","null"],"description":"Exact decimal text"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"previousStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"Its status before this change"}}}},"x-aurea-event-type":"transaction.status_changed","x-aurea-event-version":1},"WebhookEvent.transaction.flagged.v1":{"type":"object","title":"transaction.flagged","description":"A signature a wallet was about to make was previewed with a medium or high risk: shown to the user, acknowledged, or refused. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["transaction.flagged"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","simulationId","digest","level","flags","outcome"],"properties":{"walletId":{"type":"string","format":"uuid","description":"The MPC wallet"},"simulationId":{"type":"string","description":"The preview (POST /v1/transactions/simulate)"},"digest":{"type":"string","description":"The digest previewed, 0x and 64 hex"},"level":{"type":"string","enum":["medium","high"]},"flags":{"type":"array","items":{"type":"string"},"description":"The risk flags' codes (UNLIMITED_APPROVAL, KNOWN_DRAINER, ADDRESS_LOOKALIKE, …)"},"outcome":{"type":"string","enum":["shown","acknowledged","blocked"],"description":"shown: previewed to the user; acknowledged: signed after the user acknowledged it; blocked: its signature was refused"}}}},"x-aurea-event-type":"transaction.flagged","x-aurea-event-version":1},"WebhookEvent.wallet.created.v1":{"type":"object","title":"wallet.created","description":"A wallet was made for one of the tenant's users. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.created"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","walletType","keyManagementScheme","isPrimary","createdAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"walletType":{"type":["string","null"]},"keyManagementScheme":{"type":"string","description":"How the wallet's key is held: aes_single, sss_2of2_akv, hsm or frost_ed25519 (the Hub holds it; frost_ed25519: a Solana key split between two Aurea signing nodes), client_side_pending (moving to the user's device), client_side (the device), mpc_tss (shared with the device)"},"isPrimary":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.created","x-aurea-event-version":1},"WebhookEvent.wallet.frozen.v1":{"type":"object","title":"wallet.frozen","description":"A wallet was frozen: it signs nothing until the freeze is lifted or ends. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.frozen"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","freezeId","frozenByPlatform","frozenByRole","frozenAt","until","liftedAt","liftedByRole"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"freezeId":{"type":"string","format":"uuid"},"frozenByPlatform":{"type":"boolean","description":"Placed by Aurea's administrators (only they lift it)"},"frozenByRole":{"type":"string","description":"The role that placed it; policy for a FREEZE verdict"},"frozenAt":{"type":"string","format":"date-time"},"until":{"type":["string","null"],"format":"date-time","description":"When it ends by itself; null: until lifted"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedByRole":{"type":["string","null"]}}}},"x-aurea-event-type":"wallet.frozen","x-aurea-event-version":1},"WebhookEvent.wallet.unfrozen.v1":{"type":"object","title":"wallet.unfrozen","description":"A wallet's freeze was lifted. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.unfrozen"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","freezeId","frozenByPlatform","frozenByRole","frozenAt","until","liftedAt","liftedByRole"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"freezeId":{"type":"string","format":"uuid"},"frozenByPlatform":{"type":"boolean","description":"Placed by Aurea's administrators (only they lift it)"},"frozenByRole":{"type":"string","description":"The role that placed it; policy for a FREEZE verdict"},"frozenAt":{"type":"string","format":"date-time"},"until":{"type":["string","null"],"format":"date-time","description":"When it ends by itself; null: until lifted"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedByRole":{"type":["string","null"]}}}},"x-aurea-event-type":"wallet.unfrozen","x-aurea-event-version":1},"WebhookEvent.wallet.custody_changed.v1":{"type":"object","title":"wallet.custody_changed","description":"How a wallet's key is held changed (and from what). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.custody_changed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","fromScheme","toScheme","step","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"fromScheme":{"type":"string","description":"How the wallet's key is held: aes_single, sss_2of2_akv, hsm or frost_ed25519 (the Hub holds it; frost_ed25519: a Solana key split between two Aurea signing nodes), client_side_pending (moving to the user's device), client_side (the device), mpc_tss (shared with the device)"},"toScheme":{"type":"string","description":"How the wallet's key is held: aes_single, sss_2of2_akv, hsm or frost_ed25519 (the Hub holds it; frost_ed25519: a Solana key split between two Aurea signing nodes), client_side_pending (moving to the user's device), client_side (the device), mpc_tss (shared with the device)"},"step":{"type":"string","enum":["key_export_requested","client_custody_confirmed","key_export_cancelled","key_export_force_cancelled","key_split"],"description":"key_export_requested: the user asked to hold the key; client_custody_confirmed: the device proved it holds it and the Hub's copy is deleted; key_export_cancelled / key_export_force_cancelled: the move was given up (by the user / by an administrator); key_split: the Hub's key was split between its database and its key vault"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.custody_changed","x-aurea-event-version":1},"WebhookEvent.wallet.setup.aux_started.v1":{"type":"object","title":"wallet.setup.aux_started","description":"An MPC wallet's setup started its second ceremony (the wallet is not signing-ready yet). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.setup.aux_started"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","curve","scheme","state","reason","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"],"description":"The setup's state after the step: aux_running (the key's second ceremony started), ready_for_backup (the wallet can sign: keep its backup next), backup_confirmed (proven, or reported by the client), active (the client reported the setup complete), retired (a pending wallet given up after its balance read zero: a new one can be made)"},"reason":{"type":["string","null"],"enum":["restart","orphan",null],"description":"For retired only: restart (its owner restarted the setup) or orphan (left behind by a newer wallet for 30 days); null otherwise"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.setup.aux_started","x-aurea-event-version":1},"WebhookEvent.wallet.setup.ready_for_backup.v1":{"type":"object","title":"wallet.setup.ready_for_backup","description":"An MPC wallet can sign: the user keeps its backup next. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.setup.ready_for_backup"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","curve","scheme","state","reason","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"],"description":"The setup's state after the step: aux_running (the key's second ceremony started), ready_for_backup (the wallet can sign: keep its backup next), backup_confirmed (proven, or reported by the client), active (the client reported the setup complete), retired (a pending wallet given up after its balance read zero: a new one can be made)"},"reason":{"type":["string","null"],"enum":["restart","orphan",null],"description":"For retired only: restart (its owner restarted the setup) or orphan (left behind by a newer wallet for 30 days); null otherwise"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.setup.ready_for_backup","x-aurea-event-version":1},"WebhookEvent.wallet.setup.backup_confirmed.v1":{"type":"object","title":"wallet.setup.backup_confirmed","description":"An MPC wallet's backup is confirmed (proven, or reported by the client). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.setup.backup_confirmed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","curve","scheme","state","reason","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"],"description":"The setup's state after the step: aux_running (the key's second ceremony started), ready_for_backup (the wallet can sign: keep its backup next), backup_confirmed (proven, or reported by the client), active (the client reported the setup complete), retired (a pending wallet given up after its balance read zero: a new one can be made)"},"reason":{"type":["string","null"],"enum":["restart","orphan",null],"description":"For retired only: restart (its owner restarted the setup) or orphan (left behind by a newer wallet for 30 days); null otherwise"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.setup.backup_confirmed","x-aurea-event-version":1},"WebhookEvent.wallet.setup.completed.v1":{"type":"object","title":"wallet.setup.completed","description":"An MPC wallet's setup is complete (reported by the client). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.setup.completed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","curve","scheme","state","reason","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"],"description":"The setup's state after the step: aux_running (the key's second ceremony started), ready_for_backup (the wallet can sign: keep its backup next), backup_confirmed (proven, or reported by the client), active (the client reported the setup complete), retired (a pending wallet given up after its balance read zero: a new one can be made)"},"reason":{"type":["string","null"],"enum":["restart","orphan",null],"description":"For retired only: restart (its owner restarted the setup) or orphan (left behind by a newer wallet for 30 days); null otherwise"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.setup.completed","x-aurea-event-version":1},"WebhookEvent.wallet.setup.retired.v1":{"type":"object","title":"wallet.setup.retired","description":"A pending MPC wallet was retired (its balance read zero): a new one can be made. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["wallet.setup.retired"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chain","isTestnet","address","curve","scheme","state","reason","changedAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"],"description":"The setup's state after the step: aux_running (the key's second ceremony started), ready_for_backup (the wallet can sign: keep its backup next), backup_confirmed (proven, or reported by the client), active (the client reported the setup complete), retired (a pending wallet given up after its balance read zero: a new one can be made)"},"reason":{"type":["string","null"],"enum":["restart","orphan",null],"description":"For retired only: restart (its owner restarted the setup) or orphan (left behind by a newer wallet for 30 days); null otherwise"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"wallet.setup.retired","x-aurea-event-version":1},"WebhookEvent.account.bound.v1":{"type":"object","title":"account.bound","description":"An account at a bank partner was bound to the address it delivers to: opened, re-pointed, opened on the KYC approval, or changed by a refresh. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["account.bound"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["bindingId","accountKind","accountId","userId","customerId","walletId","address","network","isSandbox","reason","previousAddress","boundAt"],"properties":{"bindingId":{"type":"string","format":"uuid"},"accountKind":{"type":"string","enum":["bank_payin","remittance_account","bank_link"],"description":"bank_payin: a user's pay-in account (bank transfer in, stablecoin out); remittance_account: a Remittance customer's account; bank_link: a wallet linked for a euro IBAN at the bank ramp"},"accountId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"customerId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":["string","null"]},"isSandbox":{"type":"boolean"},"reason":{"type":"string","enum":["opened","repointed","auto_bound","account_changed"],"description":"opened: the account's first binding; repointed: it now delivers to another address; auto_bound: opened by itself when the KYC approval arrived; account_changed: a refresh was answered with another account for the same address"},"previousAddress":{"type":["string","null"],"description":"repointed / account_changed: the address bound before"},"boundAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"account.bound","x-aurea-event-version":1},"WebhookEvent.policy.set_published.v1":{"type":"object","title":"policy.set_published","description":"A policy set became the tenant's active one (the one it replaced is archived). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.set_published"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["setId","version","status","ruleCount","requiredApprovals","activatedAt","archivedAt","previousStatus","replacedSetId","changedAt"],"properties":{"setId":{"type":"string","format":"uuid"},"version":{"type":"integer"},"status":{"type":"string","enum":["active","archived"]},"ruleCount":{"type":"integer"},"requiredApprovals":{"type":"integer"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"previousStatus":{"type":"string","enum":["draft","awaiting_quorum","active"],"description":"Its status before this change"},"replacedSetId":{"type":["string","null"],"format":"uuid","description":"set_published: the set it replaced as the active one; set_archived: the set that replaced it (null when it was withdrawn)"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.set_published","x-aurea-event-version":1},"WebhookEvent.policy.set_archived.v1":{"type":"object","title":"policy.set_archived","description":"A policy set was archived: withdrawn before it was active, or replaced by a new active one. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.set_archived"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["setId","version","status","ruleCount","requiredApprovals","activatedAt","archivedAt","previousStatus","replacedSetId","changedAt"],"properties":{"setId":{"type":"string","format":"uuid"},"version":{"type":"integer"},"status":{"type":"string","enum":["active","archived"]},"ruleCount":{"type":"integer"},"requiredApprovals":{"type":"integer"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"previousStatus":{"type":"string","enum":["draft","awaiting_quorum","active"],"description":"Its status before this change"},"replacedSetId":{"type":["string","null"],"format":"uuid","description":"set_published: the set it replaced as the active one; set_archived: the set that replaced it (null when it was withdrawn)"},"changedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.set_archived","x-aurea-event-version":1},"WebhookEvent.policy.decision_refused.v1":{"type":"object","title":"policy.decision_refused","description":"The tenant's enforced policy refused an operation at a signing point: nothing was signed or sent. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.decision_refused"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["operationId","point","code","verdict","ruleId","reason","missing","walletId","chain","chainId","freezeId","refusedAt"],"properties":{"operationId":{"type":["string","null"],"format":"uuid","description":"The operation refused (GET /v1/operations/{id}); null when none was recorded"},"point":{"type":"string","description":"The signing point that asked"},"code":{"type":"string","pattern":"^POLICY_[A-Z_]+$","description":"The refusal's code, as the API answered it: POLICY_BLOCKED, POLICY_FROZEN, POLICY_SCREENING_UNAVAILABLE, POLICY_APPROVAL_REQUIRED, POLICY_UNAVAILABLE, or one the policy's refusals add later"},"verdict":{"type":["string","null"],"enum":["ALLOW","BLOCK","REQUIRE_APPROVAL","FREEZE","SCREEN",null]},"ruleId":{"type":["string","null"],"format":"uuid"},"reason":{"type":["string","null"],"description":"Why it decided: rule_matched, missing_data, no_matching_rule, explicit_rule_required, no_policy_set or engine_error; null when it could not decide"},"missing":{"type":"array","items":{"type":"string"},"description":"The fields the operation lacked, when that decided"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"freezeId":{"type":["string","null"],"format":"uuid"},"refusedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.decision_refused","x-aurea-event-version":1},"WebhookEvent.approval.requested.v1":{"type":"object","title":"approval.requested","description":"An operation waits for its approvers (the policy held it). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["approval.requested"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["approvalId","operationId","status","origin","initiatorId","ruleId","policySetVersion","threshold","approvals","rejections","approverIds","excludeInitiator","chain","chainId","asset","amount","amountRef","destination","expiresAt","createdAt","decidedAt"],"properties":{"approvalId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"]},"origin":{"type":"string"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer"},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"null: any of the tenant's approvers"},"excludeInitiator":{"type":"boolean"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"Its value in EUR, when known"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"approval.requested","x-aurea-event-version":1},"WebhookEvent.approval.approved.v1":{"type":"object","title":"approval.approved","description":"An approval request reached its threshold: the operation goes on. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["approval.approved"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["approvalId","operationId","status","origin","initiatorId","ruleId","policySetVersion","threshold","approvals","rejections","approverIds","excludeInitiator","chain","chainId","asset","amount","amountRef","destination","expiresAt","createdAt","decidedAt"],"properties":{"approvalId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"]},"origin":{"type":"string"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer"},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"null: any of the tenant's approvers"},"excludeInitiator":{"type":"boolean"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"Its value in EUR, when known"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"approval.approved","x-aurea-event-version":1},"WebhookEvent.approval.rejected.v1":{"type":"object","title":"approval.rejected","description":"An approval request was rejected: the operation is REJECTED. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["approval.rejected"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["approvalId","operationId","status","origin","initiatorId","ruleId","policySetVersion","threshold","approvals","rejections","approverIds","excludeInitiator","chain","chainId","asset","amount","amountRef","destination","expiresAt","createdAt","decidedAt"],"properties":{"approvalId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"]},"origin":{"type":"string"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer"},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"null: any of the tenant's approvers"},"excludeInitiator":{"type":"boolean"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"Its value in EUR, when known"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"approval.rejected","x-aurea-event-version":1},"WebhookEvent.approval.expired.v1":{"type":"object","title":"approval.expired","description":"An approval request's window ended before its threshold: the operation FAILED. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["approval.expired"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["approvalId","operationId","status","origin","initiatorId","ruleId","policySetVersion","threshold","approvals","rejections","approverIds","excludeInitiator","chain","chainId","asset","amount","amountRef","destination","expiresAt","createdAt","decidedAt"],"properties":{"approvalId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"]},"origin":{"type":"string"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer"},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"null: any of the tenant's approvers"},"excludeInitiator":{"type":"boolean"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"Its value in EUR, when known"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"approval.expired","x-aurea-event-version":1},"WebhookEvent.approval.withdrawn.v1":{"type":"object","title":"approval.withdrawn","description":"An approval request ended because its operation was cancelled while it waited. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["approval.withdrawn"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["approvalId","operationId","status","origin","initiatorId","ruleId","policySetVersion","threshold","approvals","rejections","approverIds","excludeInitiator","chain","chainId","asset","amount","amountRef","destination","expiresAt","createdAt","decidedAt"],"properties":{"approvalId":{"type":"string","format":"uuid"},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"]},"origin":{"type":"string"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer"},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"null: any of the tenant's approvers"},"excludeInitiator":{"type":"boolean"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"Its value in EUR, when known"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"approval.withdrawn","x-aurea-event-version":1},"WebhookEvent.aml_case.opened.v1":{"type":"object","title":"aml_case.opened","description":"A screening in enforce matched a sanctions list: what it screened is held for review, refused, or (a received transfer) its wallet quarantined, and this case decides. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["aml_case.opened"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"aml_case.opened","x-aurea-event-version":1},"WebhookEvent.aml_case.released.v1":{"type":"object","title":"aml_case.released","description":"An AML case released its match (BYPASSED): a held operation goes on; a received transfer's wallet signs again. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["aml_case.released"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"aml_case.released","x-aurea-event-version":1},"WebhookEvent.aml_case.confirmed.v1":{"type":"object","title":"aml_case.confirmed","description":"An AML case confirmed its match: a held operation is rejected; a received transfer's wallet stays quarantined. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["aml_case.confirmed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"aml_case.confirmed","x-aurea-event-version":1},"WebhookEvent.ramp.iban.updated.v1":{"type":"object","title":"ramp.iban.updated","description":"A user's IBAN with the bank ramp changed: provisioned, moved to another address, or closed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.iban.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["ibanId","userId","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"iban":{"type":["string","null"],"description":"No spaces, upper case; null while the bank ramp provisions it"},"bic":{"type":["string","null"]},"currency":{"type":"string"},"network":{"type":"string","description":"The chain the IBAN's payments mint on"},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to"},"status":{"type":"string","description":"requested, active or closed"},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.iban.updated","x-aurea-event-version":1},"WebhookEvent.ramp.payout_order.updated.v1":{"type":"object","title":"ramp.payout_order.updated","description":"A payout order a user's address signed, to a bank account, changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.payout_order.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","orderId","userId","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","failureCode","transactionHashes","sentAt","placedAt","processedAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id: Aurea makes it"},"userId":{"type":"string","format":"uuid"},"status":{"type":"string","description":"prepared, sending, placed, pending_signatures, processed, rejected, failed, expired or unknown"},"state":{"type":["string","null"],"description":"The bank ramp's own state: placed, pending, processed or rejected"},"signer":{"type":["string","null"]},"source":{"type":["string","null"]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from"},"network":{"type":"string"},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":["string","null"],"description":"Exact decimal text"},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form"}}},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"}},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.payout_order.updated","x-aurea-event-version":1},"WebhookEvent.ramp.instruction.updated.v1":{"type":"object","title":"ramp.instruction.updated","description":"A user's pay-in instruction changed: given, paid (matched), expired or cancelled; or its stablecoin delivery ended. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.instruction.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["instructionId","userId","asset","requestedAmount","amountToPay","status","delivery","deliveryStatus","deliveryFailure","payBy","matchedAt","updatedAt"],"properties":{"instructionId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"asset":{"type":"string"},"requestedAmount":{"type":"string","description":"What the user asked for, exact decimal text"},"amountToPay":{"type":"string","description":"The exact amount the payer was told to send"},"status":{"type":"string","description":"open, matched, expired or cancelled"},"delivery":{"type":"string","description":"balance, or stablecoin (converted and sent to an address)"},"deliveryStatus":{"type":["string","null"],"description":"A stablecoin delivery's outcome: delivered or failed (what was paid in stays on the user's balance); null until it has one"},"deliveryFailure":{"type":["string","null"]},"payBy":{"type":"string","format":"date-time"},"matchedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.instruction.updated","x-aurea-event-version":1},"WebhookEvent.ramp.offramp.updated.v1":{"type":"object","title":"ramp.offramp.updated","description":"A user's sale of a stablecoin for local money changed state. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.offramp.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["offrampId","userId","network","asset","amount","payoutAsset","destinationType","state","withdrawalId","failure","updatedAt"],"properties":{"offrampId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string","description":"The stablecoin sent, exact decimal text"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","description":"bank, momo or wallet"},"state":{"type":"string","description":"awaiting_transfer, sent, received, paying, paid, failed or cancelled"},"withdrawalId":{"type":["string","null"],"format":"uuid"},"failure":{"type":["string","null"]},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.offramp.updated","x-aurea-event-version":1},"WebhookEvent.ramp.withdrawal.updated.v1":{"type":"object","title":"ramp.withdrawal.updated","description":"A withdrawal to a bank account, a mobile money number or a wallet changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.withdrawal.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","userId","purpose","attempt","retryOf","status","asset","amount","sourceAsset","sourceAmount","fee","rate","markup","destination","failureCode","nextAttemptAt","sentAt","terminalAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"purpose":{"type":"string","description":"off_ramp, on_ramp or treasury"},"attempt":{"type":"integer"},"retryOf":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","description":"prepared, sending, paused, unknown, refused, held, pending, succeeded, failed or reversed"},"asset":{"type":"string"},"amount":{"type":"string","description":"What the beneficiary receives, exact decimal text"},"sourceAsset":{"type":"string"},"sourceAmount":{"type":["string","null"],"description":"What the balance gave, once known"},"fee":{"type":["string","null"],"description":"The bank ramp's fee, once known"},"rate":{"type":["string","null"],"description":"The rate applied, once known"},"markup":{"type":["string","null"],"description":"The tenant's markup, once known"},"destination":{"type":"object","additionalProperties":{"type":"string"},"description":"The destination, masked"},"failureCode":{"type":["string","null"]},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"terminalAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.withdrawal.updated","x-aurea-event-version":1},"WebhookEvent.ramp.desk_order.updated.v1":{"type":"object","title":"ramp.desk_order.updated","description":"A desk order between a stablecoin and a bank account changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.desk_order.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["orderId","userId","purpose","direction","status","fromAsset","fromAmount","toAsset","toAmount","rate","markup","beneficiary","funding","proofRejectedReason","refundStatus","failureCode","expiresAt","terminalAt","updatedAt"],"properties":{"orderId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"purpose":{"type":"string","description":"off_ramp, on_ramp or treasury"},"direction":{"type":"string","description":"to_bank or from_bank"},"status":{"type":"string"},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"markup":{"type":["string","null"],"description":"The tenant's markup"},"beneficiary":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"The to-bank beneficiary, masked"},"funding":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"A from-bank order: the account to pay, the reference, the amount and the deadline"},"proofRejectedReason":{"type":["string","null"]},"refundStatus":{"type":["string","null"],"description":"pending or returned"},"failureCode":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"terminalAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.desk_order.updated","x-aurea-event-version":1},"WebhookEvent.ramp.collection.reversed.v1":{"type":"object","title":"ramp.collection.reversed","description":"A pay-in was taken back by the paying bank: its amount left the user's balance. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["ramp.collection.reversed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["collectionId","userId","instructionId","asset","amount","reversedAt"],"properties":{"collectionId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"instructionId":{"type":["string","null"],"format":"uuid"},"asset":{"type":"string"},"amount":{"type":"string","description":"What was taken back from the user's balance"},"reversedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"ramp.collection.reversed","x-aurea-event-version":1},"WebhookEvent.fiat.profile.updated.v1":{"type":"object","title":"fiat.profile.updated","description":"A fiat account profile's verification changed: its state, its reasons or what it still needs. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["fiat.profile.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["profileId","owner","state","previousState","reasons","missing","paymentReady","virtualAccountsReady"],"properties":{"profileId":{"type":"string","format":"uuid"},"owner":{"type":"string","enum":["tenant","user"]},"state":{"type":"string"},"previousState":{"type":["string","null"]},"reasons":{"type":"array","items":{"type":"string"}},"missing":{"type":"array","items":{"type":"string"}},"paymentReady":{"type":["boolean","null"]},"virtualAccountsReady":{"type":["boolean","null"]}}}},"x-aurea-event-type":"fiat.profile.updated","x-aurea-event-version":1},"WebhookEvent.fiat.bank_account.updated.v1":{"type":"object","title":"fiat.bank_account.updated","description":"A profile's bank account, or its verification by small deposits, changed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["fiat.bank_account.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["bankAccountId","profileId","status","verificationId","verificationState","microDepositStatus","microDebitStatus","confirmationAttempts","country","currency"],"properties":{"bankAccountId":{"type":"string","format":"uuid"},"profileId":{"type":["string","null"],"format":"uuid"},"status":{"type":["string","null"],"description":"The bank account's status"},"verificationId":{"type":["string","null"],"format":"uuid"},"verificationState":{"type":["string","null"]},"microDepositStatus":{"type":["string","null"]},"microDebitStatus":{"type":["string","null"]},"confirmationAttempts":{"type":["integer","null"]},"country":{"type":["string","null"]},"currency":{"type":["string","null"]}}}},"x-aurea-event-type":"fiat.bank_account.updated","x-aurea-event-version":1},"WebhookEvent.fiat.virtual_account.updated.v1":{"type":"object","title":"fiat.virtual_account.updated","description":"A virtual bank account, or a profile's application for them, changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["fiat.virtual_account.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["virtualAccountId","applicationId","profileId","currency","status"],"properties":{"virtualAccountId":{"type":["string","null"],"format":"uuid"},"applicationId":{"type":["string","null"],"format":"uuid"},"profileId":{"type":["string","null"],"format":"uuid"},"currency":{"type":["string","null"]},"status":{"type":"string"}}}},"x-aurea-event-type":"fiat.virtual_account.updated","x-aurea-event-version":1},"WebhookEvent.fiat.balance.movement.v1":{"type":"object","title":"fiat.balance.movement","description":"Money arrived on or left a profile's balance or virtual bank account. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["fiat.balance.movement"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["movementId","balanceId","virtualAccountId","direction","amount","currency","kind","operationId","transferId","recordedAt"],"properties":{"movementId":{"type":"string","format":"uuid"},"balanceId":{"type":["string","null"],"format":"uuid"},"virtualAccountId":{"type":["string","null"],"format":"uuid"},"direction":{"type":"string"},"amount":{"type":"string","description":"A decimal string with the currency's decimals"},"currency":{"type":"string"},"kind":{"type":["string","null"]},"operationId":{"type":["string","null"],"format":"uuid"},"transferId":{"type":["string","null"],"format":"uuid"},"recordedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"fiat.balance.movement","x-aurea-event-version":1},"WebhookEvent.fiat.transfer.updated.v1":{"type":"object","title":"fiat.transfer.updated","description":"A transfer to a beneficiary changed status. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["fiat.transfer.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["transferId","status","previousStatus","failureCode","amount","currency","beneficiaryId"],"properties":{"transferId":{"type":"string","format":"uuid"},"status":{"type":"string"},"previousStatus":{"type":["string","null"]},"failureCode":{"type":["string","null"]},"amount":{"type":"string","description":"A decimal string with the currency's decimals"},"currency":{"type":"string"},"beneficiaryId":{"type":["string","null"],"format":"uuid"}}}},"x-aurea-event-type":"fiat.transfer.updated","x-aurea-event-version":1},"WebhookEvent.remittance.payout.requested.v1":{"type":"object","title":"remittance.payout.requested","description":"A Remittance payout was prepared and waits for its approvers (never its preparer). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.requested"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.requested","x-aurea-event-version":1},"WebhookEvent.remittance.payout.approved.v1":{"type":"object","title":"remittance.payout.approved","description":"A Remittance payout's last approver approved it: it may now be signed. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.approved"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.approved","x-aurea-event-version":1},"WebhookEvent.remittance.payout.rejected.v1":{"type":"object","title":"remittance.payout.rejected","description":"An approver rejected a Remittance payout. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.rejected"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.rejected","x-aurea-event-version":1},"WebhookEvent.remittance.payout.expired.v1":{"type":"object","title":"remittance.payout.expired","description":"A Remittance payout's approval window ended before its last approval. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.expired"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.expired","x-aurea-event-version":1},"WebhookEvent.remittance.payout.cancelled.v1":{"type":"object","title":"remittance.payout.cancelled","description":"A Remittance payout was cancelled before its signature. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.cancelled"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.cancelled","x-aurea-event-version":1},"WebhookEvent.remittance.payout.submitted.v1":{"type":"object","title":"remittance.payout.submitted","description":"A Remittance payout was signed and its deposit sent to the partner. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.submitted"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.submitted","x-aurea-event-version":1},"WebhookEvent.remittance.payout.completed.v1":{"type":"object","title":"remittance.payout.completed","description":"The partner paid a Remittance payout. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.completed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.completed","x-aurea-event-version":1},"WebhookEvent.remittance.payout.failed.v1":{"type":"object","title":"remittance.payout.failed","description":"A Remittance payout failed after its approval (the partner, the transfer or a screening). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["remittance.payout.failed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["payoutId","customerId","beneficiaryId","status","partner","amount","currency","purpose","cryptoCurrency","chain","chainId","approvalsRequired","approvals","preparedBy","txHash","failureReason","createdAt","finishedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"customerId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending_approval","approved","submitted","completed","rejected","expired","cancelled","failed"]},"partner":{"type":"string","enum":["noah","jenzy"]},"amount":{"type":"string","description":"What the beneficiary receives, a decimal with two places"},"currency":{"type":"string","description":"ISO 4217"},"purpose":{"type":"string"},"cryptoCurrency":{"type":"string","description":"The stablecoin the payout is paid from"},"chain":{"type":"string"},"chainId":{"type":"integer"},"approvalsRequired":{"type":"integer","description":"The approvers it needs besides its preparer"},"approvals":{"type":"integer","description":"The approvers who approved"},"preparedBy":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"],"description":"The deposit transfer, once sent"},"failureReason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"x-aurea-event-type":"remittance.payout.failed","x-aurea-event-version":1},"WebhookEvent.policy.hold.v1":{"type":"object","title":"policy.hold","description":"The cosigner held a payment its tenant's signed policy does not allow as it is: nothing was signed; next says what completes it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.hold"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["holdId","walletId","digest","reason","next","until","expiresAt","heldAt"],"properties":{"holdId":{"type":"string","description":"The hold (POST /v1/approvals/{holdId}/decision)"},"walletId":{"type":"string"},"digest":{"type":"string","description":"The digest held, 64 hex characters"},"reason":{"type":"string","description":"destination_not_active, destination_cooling, over_limit, over_daily or needs_quorum"},"next":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["step_up","wait_until","add_destination","ask_admin","contact_support"],"description":"The button a client shows: step_up (confirm with a passkey), wait_until (available at `until`), add_destination (add the recipient to the wallet's address book), ask_admin (the tenant's administrators approve it), contact_support (help@aureahub.com)"},"until":{"type":["string","null"],"format":"date-time"},"email":{"type":["string","null"]}}},"until":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"heldAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.hold","x-aurea-event-version":1},"WebhookEvent.policy.hold_released.v1":{"type":"object","title":"policy.hold_released","description":"A held payment may be signed now: its administrators approved it (by quorum) or its time came (by time). Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.hold_released"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["holdId","walletId","by","releasedAt"],"properties":{"holdId":{"type":"string"},"walletId":{"type":"string"},"by":{"type":"string","enum":["quorum","time"]},"releasedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.hold_released","x-aurea-event-version":1},"WebhookEvent.policy.hold_expired.v1":{"type":"object","title":"policy.hold_expired","description":"A held payment was not completed within 24 hours: it is no longer approvable. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.hold_expired"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["holdId","walletId","expiredAt"],"properties":{"holdId":{"type":"string"},"walletId":{"type":"string"},"expiredAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.hold_expired","x-aurea-event-version":1},"WebhookEvent.policy.cosigner_version.v1":{"type":"object","title":"policy.cosigner_version","description":"The cosigner accepted a version of the tenant's signed policy; it binds from effectiveAt. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["policy.cosigner_version"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["version","policyHash","effectiveAt"],"properties":{"version":{"type":"string","description":"The version number, a decimal string"},"policyHash":{"type":"string"},"effectiveAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"policy.cosigner_version","x-aurea-event-version":1},"WebhookEvent.recovery.requested.v1":{"type":"object","title":"recovery.requested","description":"A recovery of the wallet was asked for: it waits for the delay, and the owner can cancel it. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.requested"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","opensAt","closesAt","cancelledAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"opensAt":{"type":"string","format":"date-time","description":"When the recovery may be signed (the delay's end)"},"closesAt":{"type":"string","format":"date-time","description":"When the window closes unless the recovery was signed"},"cancelledAt":{"type":["string","null"],"format":"date-time","description":"When the owner cancelled it; null when not cancelled"}}}},"x-aurea-event-type":"recovery.requested","x-aurea-event-version":1},"WebhookEvent.recovery.opened.v1":{"type":"object","title":"recovery.opened","description":"A recovery's delay ended: it can be signed until the window closes. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.opened"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","opensAt","closesAt","cancelledAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"opensAt":{"type":"string","format":"date-time","description":"When the recovery may be signed (the delay's end)"},"closesAt":{"type":"string","format":"date-time","description":"When the window closes unless the recovery was signed"},"cancelledAt":{"type":["string","null"],"format":"date-time","description":"When the owner cancelled it; null when not cancelled"}}}},"x-aurea-event-type":"recovery.opened","x-aurea-event-version":1},"WebhookEvent.recovery.cancelled.v1":{"type":"object","title":"recovery.cancelled","description":"The owner cancelled a recovery of the wallet. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.cancelled"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","opensAt","closesAt","cancelledAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"opensAt":{"type":"string","format":"date-time","description":"When the recovery may be signed (the delay's end)"},"closesAt":{"type":"string","format":"date-time","description":"When the window closes unless the recovery was signed"},"cancelledAt":{"type":["string","null"],"format":"date-time","description":"When the owner cancelled it; null when not cancelled"}}}},"x-aurea-event-type":"recovery.cancelled","x-aurea-event-version":1},"WebhookEvent.recovery.completed.v1":{"type":"object","title":"recovery.completed","description":"A recovery of the wallet was signed within its window. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.completed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","opensAt","closesAt","cancelledAt"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"opensAt":{"type":"string","format":"date-time","description":"When the recovery may be signed (the delay's end)"},"closesAt":{"type":"string","format":"date-time","description":"When the window closes unless the recovery was signed"},"cancelledAt":{"type":["string","null"],"format":"date-time","description":"When the owner cancelled it; null when not cancelled"}}}},"x-aurea-event-type":"recovery.completed","x-aurea-event-version":1},"WebhookEvent.recovery.safe_queued.v1":{"type":"object","title":"recovery.safe_queued","description":"A change of a protected account's owners was queued in its delay module: anyone can execute it after the delay, the owner can cancel it before. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.safe_queued"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chainId","safe","module","queueNonce","txHash","executableAt","transactionHash","call","flag"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"safe":{"type":"string","description":"The protected account (a smart account the wallet owns), 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"queueNonce":{"type":"string","description":"The queued transaction's nonce in the module, decimal"},"txHash":{"type":"string","description":"The queued transaction's hash in the module (getTransactionHash), 0x hex"},"executableAt":{"type":"string","format":"date-time","description":"When anyone can execute it: queued + the module's cooldown"},"transactionHash":{"type":["string","null"],"description":"The chain transaction that queued (safe_queued) or executed (safe_executed) it"},"call":{"type":"string","description":"What the queued transaction asks of the account: swapOwner or addOwnerWithThreshold (the two recovery calls), or other"},"flag":{"type":["string","null"],"description":"OWNERSHIP_CHANGE when the queued transaction is not one of the two recovery calls; null otherwise"}}}},"x-aurea-event-type":"recovery.safe_queued","x-aurea-event-version":1},"WebhookEvent.recovery.safe_executed.v1":{"type":"object","title":"recovery.safe_executed","description":"A queued change of a protected account's owners was executed after its delay. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.safe_executed"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chainId","safe","module","queueNonce","txHash","executableAt","transactionHash","call","flag"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"safe":{"type":"string","description":"The protected account (a smart account the wallet owns), 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"queueNonce":{"type":"string","description":"The queued transaction's nonce in the module, decimal"},"txHash":{"type":"string","description":"The queued transaction's hash in the module (getTransactionHash), 0x hex"},"executableAt":{"type":"string","format":"date-time","description":"When anyone can execute it: queued + the module's cooldown"},"transactionHash":{"type":["string","null"],"description":"The chain transaction that queued (safe_queued) or executed (safe_executed) it"},"call":{"type":"string","description":"What the queued transaction asks of the account: swapOwner or addOwnerWithThreshold (the two recovery calls), or other"},"flag":{"type":["string","null"],"description":"OWNERSHIP_CHANGE when the queued transaction is not one of the two recovery calls; null otherwise"}}}},"x-aurea-event-type":"recovery.safe_executed","x-aurea-event-version":1},"WebhookEvent.recovery.safe_cancelled.v1":{"type":"object","title":"recovery.safe_cancelled","description":"The owner cancelled the queued changes of a protected account's owners before their delay ended. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["recovery.safe_cancelled"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["walletId","userId","chainId","safe","module","queueNonce","txHash","executableAt","transactionHash","call","flag","cancelledQueueNonces"],"properties":{"walletId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"safe":{"type":"string","description":"The protected account (a smart account the wallet owns), 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"queueNonce":{"type":"string","description":"The queued transaction's nonce in the module, decimal"},"txHash":{"type":"string","description":"The queued transaction's hash in the module (getTransactionHash), 0x hex"},"executableAt":{"type":"string","format":"date-time","description":"When anyone can execute it: queued + the module's cooldown"},"transactionHash":{"type":["string","null"],"description":"The chain transaction that queued (safe_queued) or executed (safe_executed) it"},"call":{"type":"string","description":"What the queued transaction asks of the account: swapOwner or addOwnerWithThreshold (the two recovery calls), or other"},"flag":{"type":["string","null"],"description":"OWNERSHIP_CHANGE when the queued transaction is not one of the two recovery calls; null otherwise"},"cancelledQueueNonces":{"type":"array","items":{"type":"string"},"description":"Every queued recovery the cancel skipped, by its nonce in the module (decimal)"}}}},"x-aurea-event-type":"recovery.safe_cancelled","x-aurea-event-version":1},"WebhookEvent.identity.verification.updated.v1":{"type":"object","title":"identity.verification.updated","description":"A person's or company's identity verification changed: its state (started, in review, verified, rejected, expired) or its screening. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["identity.verification.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["verificationId","userId","kind","purpose","state","previousState","nextStep","reason","aml","updatedAt"],"properties":{"verificationId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid","description":"The tenant's user verified"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","description":"What the verification is for: bank_ramp"},"state":{"type":"string","enum":["started","in_review","verified","rejected","expired"]},"previousState":{"type":"string","enum":["started","in_review","verified","rejected","expired"]},"nextStep":{"type":"string","enum":["start_verification","continue_verification","wait_for_review","approved","rejected","expired"]},"reason":{"type":["string","null"],"description":"Why the state is what it is, as a code (manual_review, aml_review, kyb_review, reopened, risk_reevaluated, kyc_expired, failed, rejected, cancelled, kyb_rejected, kyb_cancelled, or the decision's reason code); null when none"},"aml":{"type":["object","null"],"required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","ESCALATED"]}},"description":"The screening's status; null until a screening has a result"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"identity.verification.updated","x-aurea-event-version":1},"WebhookEvent.identity.handoff.updated.v1":{"type":"object","title":"identity.handoff.updated","description":"A verified user was handed to a relying partner: the account it opened for them, once recorded. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["identity.handoff.updated"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["verificationId","userId","purpose","state","account","updatedAt"],"properties":{"verificationId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"purpose":{"type":"string"},"state":{"type":"string","enum":["pending","sent","account_open","failed"]},"account":{"type":["object","null"],"required":["iban","bic","holder","bank"],"properties":{"iban":{"type":"string"},"bic":{"type":"string"},"holder":{"type":"string"},"bank":{"type":"string"}},"description":"The account the relying partner opened for the user; null until it is open"},"updatedAt":{"type":"string","format":"date-time"}}}},"x-aurea-event-type":"identity.handoff.updated","x-aurea-event-version":1},"WebhookEvent.webhook.test.v1":{"type":"object","title":"webhook.test","description":"A test an administrator sent; never subscribed to. Version 1.","required":["id","type","environment","occurredAt","createdAt","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f]{32}$","description":"The event's id: the same on every attempt, every resend and every endpoint, so a receiver can drop a repeat"},"type":{"type":"string","enum":["webhook.test"]},"environment":{"type":"string","enum":["production","sandbox"]},"occurredAt":{"type":"string","format":"date-time","description":"When the change happened"},"createdAt":{"type":"string","format":"date-time","description":"When the Hub queued the event"},"data":{"type":"object","required":["tenantId","webhookId","message"],"properties":{"tenantId":{"type":"string","format":"uuid"},"webhookId":{"type":"string","format":"uuid"},"message":{"type":"string"}}}},"x-aurea-event-type":"webhook.test","x-aurea-event-version":1},"WebhookJsonWebKeySet":{"type":"object","required":["keys"],"description":"The public keys that sign the x-webhook-jws header of the Hub's webhook deliveries (RFC 7517): the key in use first, then the next one, published before it signs anything.","properties":{"keys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid","use","alg"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint"},"use":{"type":"string","enum":["sig"]},"alg":{"type":"string","enum":["ES256"]}}}}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT token from login/register endpoint"},"tenantSignature":{"type":"apiKey","in":"header","name":"x-tenant-api-key","description":"A call from the tenant's server, signed with its API secret: x-tenant-api-key, x-timestamp (Unix seconds, within 300 s) and x-signature = hex HMAC-SHA256(apiSecret, METHOD + \"\\n\" + PATH with query + \"\\n\" + x-timestamp + \"\\n\" + hex SHA-256 of the exact body). A signature is accepted once."},"serverTokenHeader":{"type":"apiKey","in":"header","name":"X-Aurea-Server-Token","description":"On the routes where Authorization carries the signed-in user's session and the tenant's server signs too (Aave, Earn and tokenized assets): instead of the x-tenant-api-key, x-timestamp and x-signature headers (never with them: 400 SERVER_AUTH_SCHEMES_CONFLICT), the compact JWS a server credential of the user's own tenant signs ES256 — the same token, claims and checks as `Authorization: Bearer` on the tenant-signed routes (see Register a server credential), with `uri` the method and path of this request. Refusals: 401 with details.code (the server token's codes, and SERVER_CREDENTIAL_TENANT_MISMATCH for another tenant's credential) and a `WWW-Authenticate: AureaServerToken` challenge."}}},"paths":{"/health":{"get":{"tags":["health"],"description":"Health check endpoint","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"timestamp":{"type":"string"},"uptime":{"type":"number"}}}}}}}}},"/health/ready":{"get":{"tags":["health"],"description":"Readiness: whether the API reaches its database. 200 when `SELECT 1` answers within 2 s, 503 otherwise. The outcome is kept for 5 s. No authentication.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["ok"]}}}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["unavailable"]},"checks":{"type":"object","properties":{"database":{"type":"string","enum":["unreachable"]}}}}}}}}}}},"/health/platform-gate":{"get":{"tags":["health"],"description":"Whether the platform sign-in gate holds its identity provider's signing keys: 200 with `platformGate` off, not_configured or ready; 503 with keys_unavailable (the keys are being read again in the background). No authentication.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"platformGate":{"type":"string","enum":["off","not_configured","ready"]}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"platformGate":{"type":"string","enum":["keys_unavailable"]}}}}}}}}},"/v1/auth/register":{"post":{"summary":"Register new user","tags":["auth"],"description":"Register a new user with optional wallet creation","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","email","password"],"properties":{"tenantApiKey":{"type":"string","minLength":32,"description":"Tenant API key for authentication"},"username":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$","description":"Username (3-100 alphanumeric, underscore, hyphen)"},"email":{"type":"string","format":"email","description":"Email address"},"password":{"type":"string","minLength":8,"description":"Password (min 8 chars, uppercase, lowercase, digit)"},"wallet":{"type":"object","properties":{"option":{"type":"string","enum":["create","import","skip"],"description":"Wallet creation option"},"chain":{"type":"string","description":"Blockchain network"},"privateKey":{"type":"string","pattern":"^(0x)?[a-fA-F0-9]{64}$","description":"Private key for import (required if option is \"import\")"}}},"referralCode":{"type":"string","maxLength":100,"description":"Optional referral code supplied at registration"},"termsAcceptedAt":{"type":"string","format":"date-time","description":"ISO8601 UTC timestamp of T&C acceptance on the client"}}}}},"required":true},"responses":{"201":{"description":"User registered successfully","content":{"application/json":{"schema":{"description":"User registered successfully","type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"user":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"}}},"wallet":{"type":["object","null"],"properties":{"id":{"type":"string"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Bad request - validation error","content":{"application/json":{"schema":{"description":"Bad request - validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"409":{"description":"Conflict - username or email already exists","content":{"application/json":{"schema":{"description":"Conflict - username or email already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/auth/login":{"post":{"summary":"User login","tags":["auth"],"description":"Login user with optional wallet creation","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"tenantApiKey":{"type":"string","minLength":32,"description":"Tenant API key for authentication"},"username":{"type":"string","minLength":3,"maxLength":100,"description":"Username"},"password":{"type":"string","minLength":1,"description":"Password"},"createWallet":{"type":"object","properties":{"chain":{"type":"string","description":"Create wallet on this chain during login"}}}}}}},"required":true},"responses":{"200":{"description":"Login successful","content":{"application/json":{"schema":{"description":"Login successful","type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"user":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"}}},"wallet":{"type":["object","null"],"properties":{"id":{"type":"string"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Bad request - validation error","content":{"application/json":{"schema":{"description":"Bad request - validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid credentials","content":{"application/json":{"schema":{"description":"Unauthorized - invalid credentials","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/auth/refresh":{"post":{"summary":"Refresh access token","tags":["auth"],"description":"Refresh access token using refresh token","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["refreshToken"],"properties":{"refreshToken":{"type":"string","description":"Refresh token"}}}}},"required":true},"responses":{"200":{"description":"Token refreshed successfully","content":{"application/json":{"schema":{"description":"Token refreshed successfully","type":"object","properties":{"accessToken":{"type":"string"},"expiresIn":{"type":"number"},"refreshToken":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid or expired refresh token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or expired refresh token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/auth/logout":{"post":{"summary":"Log out (revoke a refresh token)","tags":["auth"],"description":"Ends a session on the server: the refresh token given is revoked, so it can no longer be exchanged for an access token (with rotation, its whole family). Access tokens already issued stay valid until they expire. Revoking a token already revoked answers the same.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["refreshToken"],"properties":{"refreshToken":{"type":"string","description":"The refresh token to revoke"}}}}},"required":true},"responses":{"200":{"description":"The refresh token is revoked","content":{"application/json":{"schema":{"description":"The refresh token is revoked","type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"401":{"description":"Unauthorized - the token does not verify, has expired, or is not a refresh token","content":{"application/json":{"schema":{"description":"Unauthorized - the token does not verify, has expired, or is not a refresh token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/auth/google":{"post":{"summary":"Google Sign-In","tags":["auth"],"description":"Sign in or register via Google OAuth2 ID token","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["idToken"],"properties":{"idToken":{"type":"string","minLength":1,"description":"Google ID token from the mobile SDK"},"tenantApiKey":{"type":"string","minLength":32,"description":"Tenant API key for authentication"}}}}},"required":true},"responses":{"200":{"description":"Google Sign-In successful","content":{"application/json":{"schema":{"description":"Google Sign-In successful","type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"user":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"}}},"wallet":{"type":["object","null"],"properties":{"id":{"type":"string"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"isNewUser":{"type":"boolean"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid or unverified token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or unverified token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"409":{"description":"Conflict - email already linked to a different Google account","content":{"application/json":{"schema":{"description":"Conflict - email already linked to a different Google account","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}},"422":{"description":"Unprocessable - email not verified","content":{"application/json":{"schema":{"description":"Unprocessable - email not verified","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/auth/apple":{"post":{"summary":"Apple Sign-In","tags":["auth"],"description":"Sign in or register via Apple identity token","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["idToken"],"properties":{"idToken":{"type":"string","minLength":1,"description":"Apple identity token from the mobile SDK"},"tenantApiKey":{"type":"string","minLength":32,"description":"Tenant API key for authentication"}}}}},"required":true},"responses":{"200":{"description":"Apple Sign-In successful","content":{"application/json":{"schema":{"description":"Apple Sign-In successful","type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"user":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"}}},"isNewUser":{"type":"boolean"}}}}}},"400":{"description":"Bad request — bundleId not configured for tenant","content":{"application/json":{"schema":{"description":"Bad request — bundleId not configured for tenant","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized — invalid or expired identity token","content":{"application/json":{"schema":{"description":"Unauthorized — invalid or expired identity token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Unprocessable — email not verified","content":{"application/json":{"schema":{"description":"Unprocessable — email not verified","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/auth/mfa":{"get":{"summary":"The caller's second factor","tags":["auth"],"description":"Whether the caller's account asks a second factor at sign-in (`mode`: off, log — asked once enrolled —, enforce — required), whether one is enrolled, an enrolment waiting for its first code, and the recovery codes left. Every role but the End User.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["mode","required","enrolled","pending","methods","recoveryCodesLeft"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"]},"required":{"type":"boolean"},"enrolled":{"type":"boolean"},"pending":{"type":"boolean"},"methods":{"type":"array","items":{"type":"string"}},"recoveryCodesLeft":{"type":"integer"}}}}}}}}},"/v1/auth/mfa/totp":{"post":{"summary":"Start enrolling an authenticator app (TOTP)","tags":["auth"],"description":"A new secret, shown once, for an authenticator app (scan `otpauthUri` as a QR code). It becomes the account's second factor once its first code is confirmed, within 15 minutes; a factor already enrolled stays until then. 409 MFA_OFF where second factors are not in use; 403 MFA_NOT_AVAILABLE for an End User.","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["secret","otpauthUri","expiresAt"],"properties":{"secret":{"type":"string","description":"The secret, base32"},"otpauthUri":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"403":{"description":"An End User's account","content":{"application/json":{"schema":{"description":"An End User's account","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Second factors are not in use for this account","content":{"application/json":{"schema":{"description":"Second factors are not in use for this account","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove the authenticator app","tags":["auth"],"description":"Removes the account's second factor and its recovery codes, with a current code. Refused (409 MFA_REMOVAL_REFUSED) where a second factor is required: enrol a new one instead.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["code"],"additionalProperties":false,"properties":{"code":{"type":"string","pattern":"^[0-9]{6}$","description":"A current code of the authenticator app"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Removed"},"400":{"description":"The code is not correct","content":{"application/json":{"schema":{"description":"The code is not correct","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"An End User's account","content":{"application/json":{"schema":{"description":"An End User's account","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"No second factor is enrolled, second factors are off, or one is required","content":{"application/json":{"schema":{"description":"No second factor is enrolled, second factors are off, or one is required","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/mfa/totp/confirm":{"post":{"summary":"Confirm the authenticator app with its first code","tags":["auth"],"description":"The enrolment's first code: the new secret becomes the account's second factor (an older one is replaced), and ten recovery codes are shown once. 400 MFA_CODE_INVALID; 409 MFA_NO_PENDING when no enrolment is waiting.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["code"],"additionalProperties":false,"properties":{"code":{"type":"string","pattern":"^[0-9]{6}$","description":"A current code of the authenticator app"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["enrolled","recoveryCodes"],"properties":{"enrolled":{"type":"boolean"},"recoveryCodes":{"type":"array","items":{"type":"string"},"description":"Ten recovery codes, each usable once instead of a code: shown only now, store them safely"}}}}}},"400":{"description":"The code is not correct","content":{"application/json":{"schema":{"description":"The code is not correct","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"An End User's account","content":{"application/json":{"schema":{"description":"An End User's account","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"No enrolment is waiting, or second factors are off","content":{"application/json":{"schema":{"description":"No enrolment is waiting, or second factors are off","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/mfa/recovery-codes":{"post":{"summary":"New recovery codes","tags":["auth"],"description":"Ten new recovery codes (the old ones stop working), with a current code of the authenticator app.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["code"],"additionalProperties":false,"properties":{"code":{"type":"string","pattern":"^[0-9]{6}$","description":"A current code of the authenticator app"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["recoveryCodes"],"properties":{"recoveryCodes":{"type":"array","items":{"type":"string"},"description":"Ten recovery codes, each usable once instead of a code: shown only now, store them safely"}}}}}},"400":{"description":"The code is not correct","content":{"application/json":{"schema":{"description":"The code is not correct","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"An End User's account","content":{"application/json":{"schema":{"description":"An End User's account","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"No second factor is enrolled, or second factors are off","content":{"application/json":{"schema":{"description":"No second factor is enrolled, or second factors are off","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/mfa/verify":{"post":{"summary":"Sign in: the second step","tags":["auth"],"description":"When POST /v1/auth/login answers 401 with `details.code` MFA_REQUIRED, the sign-in goes on here within 5 minutes: the `mfaToken` it gave and a current code of the authenticator app, or one of the recovery codes. The answer is the login's. A wrong code counts as a failed sign-in (429 with Retry-After after too many). Signed as the login is.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["mfaToken"],"additionalProperties":false,"properties":{"mfaToken":{"type":"string","maxLength":2048},"code":{"type":"string","pattern":"^[0-9]{6}$"},"recoveryCode":{"type":"string","minLength":10,"maxLength":16}}}}},"required":true},"responses":{"200":{"description":"Login successful","content":{"application/json":{"schema":{"description":"Login successful","type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"number"},"user":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"}}},"wallet":{"type":["object","null"],"properties":{"id":{"type":"string"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}}}}}},"401":{"description":"MFA_CHALLENGE_INVALID (expired or not ours: sign in again) or MFA_CODE_INVALID","content":{"application/json":{"schema":{"description":"MFA_CHALLENGE_INVALID (expired or not ours: sign in again) or MFA_CODE_INVALID","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/passkeys":{"get":{"summary":"The caller's passkeys","tags":["auth"],"description":"The caller's passkeys, newest first (revoked ones included), and `stepUp`: the step-up mode of the caller's tenant (`log`: recorded, `enforce`: required before a policy set is published or rolled back to, and before one's passkeys change) and whether passkeys are available on this platform. Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data","stepUp"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","name","status","deviceType","backedUp","transports","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"multiDevice: a synced passkey (a password manager or a platform's keychain); singleDevice: bound to one authenticator"},"backedUp":{"type":"boolean"},"transports":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last step-up it confirmed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}},"stepUp":{"type":"object","required":["mode","available"],"properties":{"mode":{"type":"string","enum":["log","enforce"]},"available":{"type":"boolean"}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Register a passkey","tags":["auth"],"description":"The authenticator's answer to the registration's options (`credential`: the RegistrationResponseJSON — `PublicKeyCredential.toJSON()`), verified against its challenge, the relying party its options named and that relying party's origins, with user verification. A credential is registered once; at most ten active passkeys. Refusals: 400 `PASSKEY_CHALLENGE_INVALID`, `PASSKEY_REGISTRATION_INVALID`, `PASSKEY_NAME_INVALID`; 403 `STEP_UP_REQUIRED`, `STEP_UP_INVALID`; 409 `PASSKEY_IN_USE`, `PASSKEY_LIMIT`. Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["ceremonyId","name","credential"],"additionalProperties":false,"properties":{"ceremonyId":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1,"maxLength":100},"credential":{"type":"object","additionalProperties":true,"description":"RegistrationResponseJSON"},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"A step-up token for this action (POST /v1/auth/step-up), when the caller already has a passkey: under the tenant's step-up mode `enforce` it is required (403 `STEP_UP_REQUIRED`, `STEP_UP_INVALID`); under `log` a missing or wrong one is recorded and nothing is refused."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","status","deviceType","backedUp","transports","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"multiDevice: a synced passkey (a password manager or a platform's keychain); singleDevice: bound to one authenticator"},"backedUp":{"type":"boolean"},"transports":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last step-up it confirmed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/passkeys/registration/options":{"post":{"summary":"Start registering a passkey","tags":["auth"],"description":"The options for `navigator.credentials.create({ publicKey })` (the WebAuthn JSON form: decode `challenge` and `user.id` from base64url), and `ceremonyId`, which the answer names (POST /v1/auth/passkeys). Five minutes, once. Attestation none, user verification required. `stepUpAction` is `passkey.register` when the caller has a passkey already: the new one is then confirmed with one of theirs. `rpId` names the relying party (your tenant's passkey address); absent, Aurea's own. Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"additionalProperties":false,"description":"Optional: send no body for Aurea's own relying party.","properties":{"rpId":{"type":"string","minLength":1,"maxLength":253,"description":"The relying party id the options are for: your tenant's passkey address (`rpId` of GET /v1/admin/tenants/{id}/passkey-address), for your own app's passkeys; absent, Aurea's own. Any other: 400 `PASSKEY_RP_NOT_ALLOWED`."}}}}},"description":"Optional: send no body for Aurea's own relying party."},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ceremonyId","expiresAt","stepUpAction","publicKey"],"properties":{"ceremonyId":{"type":"string","format":"uuid"},"expiresAt":{"type":"string","format":"date-time"},"stepUpAction":{"type":["string","null"],"enum":["passkey.register",null]},"publicKey":{"type":"object","additionalProperties":true,"description":"PublicKeyCredentialCreationOptionsJSON (WebAuthn Level 3)"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/passkeys/{passkeyId}/revoke":{"post":{"summary":"Revoke a passkey","tags":["auth"],"description":"One of the caller's passkeys, revoked for good. Refusals: 404 `PASSKEY_NOT_FOUND`; 409 `PASSKEY_REVOKED`; 403 `STEP_UP_REQUIRED`, `STEP_UP_INVALID`. Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"additionalProperties":false,"properties":{"reason":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"A step-up token for this action (POST /v1/auth/step-up), when the caller already has a passkey: under the tenant's step-up mode `enforce` it is required (403 `STEP_UP_REQUIRED`, `STEP_UP_INVALID`); under `log` a missing or wrong one is recorded and nothing is refused."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"passkeyId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","status","deviceType","backedUp","transports","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"deviceType":{"type":"string","enum":["singleDevice","multiDevice"],"description":"multiDevice: a synced passkey (a password manager or a platform's keychain); singleDevice: bound to one authenticator"},"backedUp":{"type":"boolean"},"transports":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last step-up it confirmed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/step-up/options":{"post":{"summary":"Start a step-up for one action","tags":["auth"],"description":"The options for `navigator.credentials.get({ publicKey })` (decode `challenge` and each `allowCredentials[].id` from base64url) for one action on one target — the challenge commits to it — and `ceremonyId`. Actions: `approval.approve` and `approval.reject` {operationId} (an approver of the caller's tenant: the operation's newest approval request and its canonical payload for that action), `policy_set.publish` and `policy_set.rollback` {setId} (`tenant.policies.write`; a platform role names {tenantId}), `passkey.register` {} and `passkey.revoke` {passkeyId} (one's own), `agent_execution.approve` and `agent_execution.reject` {executionId} (an approver of the tenant's agent payments, on one of its agent payments). `rpId` names the relying party (your tenant's passkey address); absent, Aurea's own — only the caller's passkeys of that relying party may answer. Refusals: 400 `STEP_UP_ACTION_INVALID`, `PASSKEY_RP_NOT_ALLOWED`; 403 `STEP_UP_ACTION_FORBIDDEN`; 404 `STEP_UP_TARGET_NOT_FOUND`; 409 `STEP_UP_NO_PASSKEY`. Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["action"],"additionalProperties":false,"properties":{"action":{"type":"string","enum":["approval.approve","approval.reject","policy_set.publish","policy_set.rollback","passkey.register","passkey.revoke","agent_execution.approve","agent_execution.reject","bank_ramp.payout","bank_ramp.destination_change"]},"operationId":{"type":"string","format":"uuid"},"setId":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"passkeyId":{"type":"string","format":"uuid"},"executionId":{"type":"string","format":"uuid"},"rpId":{"type":"string","minLength":1,"maxLength":253,"description":"The relying party id the options are for: your tenant's passkey address (`rpId` of GET /v1/admin/tenants/{id}/passkey-address), for your own app's passkeys; absent, Aurea's own. Any other: 400 `PASSKEY_RP_NOT_ALLOWED`."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ceremonyId","action","expiresAt","publicKey"],"properties":{"ceremonyId":{"type":"string","format":"uuid"},"action":{"type":"string","enum":["approval.approve","approval.reject","policy_set.publish","policy_set.rollback","passkey.register","passkey.revoke","agent_execution.approve","agent_execution.reject","bank_ramp.payout","bank_ramp.destination_change"]},"expiresAt":{"type":"string","format":"date-time"},"publicKey":{"type":"object","additionalProperties":true,"description":"PublicKeyCredentialRequestOptionsJSON (WebAuthn Level 3)"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/step-up":{"post":{"summary":"Confirm a step-up with a passkey","tags":["auth"],"description":"The assertion that answers the step-up's options (`credential`: the AuthenticationResponseJSON), verified with the caller's passkey it names — one of the relying party its options named — (user verification, its counter, its signature over the challenge). Answers `stepUpToken`: two minutes, used once, by the caller, for that action on that target only — send it with the action (`stepUpToken`). Refusal: 403 `STEP_UP_INVALID` (unknown, used or expired options, another passkey, a signature that does not verify). Every role but the End User (403 `PASSKEY_NOT_AVAILABLE`), and the End User too once the platform allows it (not by default); 503 `PASSKEYS_NOT_CONFIGURED` when the platform has no relying party.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["ceremonyId","credential"],"additionalProperties":false,"properties":{"ceremonyId":{"type":"string","format":"uuid"},"credential":{"type":"object","additionalProperties":true,"description":"AuthenticationResponseJSON"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["stepUpToken","action","expiresAt"],"properties":{"stepUpToken":{"type":"string"},"action":{"type":"string","enum":["approval.approve","approval.reject","policy_set.publish","policy_set.rollback","passkey.register","passkey.revoke","agent_execution.approve","agent_execution.reject","bank_ramp.payout","bank_ramp.destination_change"]},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/forgot-password":{"post":{"summary":"Request a password-reset email","tags":["auth"],"description":"Sends a password-reset link to the email if an eligible account exists. Always returns the same response (anti-enumeration). Requires tenant HMAC headers. No-op unless the tenant has passwordReset.enabled = true.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"locale":{"type":"string","enum":["en","it"]}}}}},"required":true},"responses":{"200":{"description":"The same answer whether or not an account has that email (no enumeration)","content":{"application/json":{"schema":{"description":"The same answer whether or not an account has that email (no enumeration)","type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"The tenant signature is missing or wrong","content":{"application/json":{"schema":{"type":"object","description":"The tenant signature is missing or wrong","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Password reset is not enabled for this tenant (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Password reset is not enabled for this tenant (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many requests for this email or address (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many requests for this email or address (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/auth/reset-password/validate":{"get":{"summary":"Check whether a reset token is still valid","tags":["auth"],"description":"Token-authenticated (no tenant HMAC). Used by the reset screen on load to show the form or an expired message. Does NOT consume the token.","parameters":[{"schema":{"type":"string"},"in":"query","name":"token","required":true}],"responses":{"200":{"description":"Whether the token is unused and unexpired (an unknown token is not valid)","content":{"application/json":{"schema":{"description":"Whether the token is unused and unexpired (an unknown token is not valid)","type":"object","additionalProperties":true,"properties":{"valid":{"type":"boolean"}}}}}},"400":{"description":"No token","content":{"application/json":{"schema":{"type":"object","description":"No token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The token is not the length of a reset token","content":{"application/json":{"schema":{"type":"object","description":"The token is not the length of a reset token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many checks from this address (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many checks from this address (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/auth/reset-password":{"post":{"summary":"Complete a password reset with a token","tags":["auth"],"description":"Token-authenticated (no tenant HMAC required — the single-use token resolves its own tenant). Validates the token, sets the new password, invalidates all prior sessions, and emails a security notice. Optional `locale` (en|it).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["token","newPassword"],"properties":{"token":{"type":"string"},"newPassword":{"type":"string","minLength":8},"locale":{"type":"string","enum":["en","it"]}}}}},"required":true},"responses":{"200":{"description":"The password is changed and the user is signed in: a new access token and refresh token. Where the account's second factor is asked at sign-in (two-factor sign-in on), no tokens: `details.code` MFA_REQUIRED with the `mfaToken` to answer at POST /v1/auth/mfa/verify, as after the login's password, or MFA_ENROLLMENT_REQUIRED","content":{"application/json":{"schema":{"description":"The password is changed and the user is signed in: a new access token and refresh token. Where the account's second factor is asked at sign-in (two-factor sign-in on), no tokens: `details.code` MFA_REQUIRED with the `mfaToken` to answer at POST /v1/auth/mfa/verify, as after the login's password, or MFA_ENROLLMENT_REQUIRED","type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"integer","description":"Seconds the access token lasts"},"userId":{"type":"string"},"message":{"type":"string","description":"With `details` only: what follows the reset"},"details":{"type":"object","description":"Only where the account's second factor is asked at sign-in (instead of the tokens)","additionalProperties":true,"properties":{"code":{"type":"string","enum":["MFA_REQUIRED","MFA_ENROLLMENT_REQUIRED"]},"mfaToken":{"type":"string","description":"MFA_REQUIRED: the challenge for POST /v1/auth/mfa/verify, answered once"},"methods":{"type":"array","items":{"type":"string"}},"expiresIn":{"type":"integer","description":"Seconds the mfaToken lasts"}}}}}}}},"400":{"description":"The body is not valid, or (`{ error }`) the link is invalid or has expired, or the password appears in a known data breach","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or (`{ error }`) the link is invalid or has expired, or the password appears in a known data breach","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The password does not follow the password rule","content":{"application/json":{"schema":{"type":"object","description":"The password does not follow the password rule","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many attempts from this address (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many attempts from this address (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/auth/admin/send-reset":{"post":{"summary":"Operator-triggered password-reset email for a user","tags":["auth"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId"],"properties":{"tenantId":{"type":"string"},"userId":{"type":"string"}}}}},"required":true},"responses":{"200":{"description":"The reset link was made; `sent` says whether the email service accepted the email (false when the user has no email or no password, or when no email service is configured)","content":{"application/json":{"schema":{"description":"The reset link was made; `sent` says whether the email service accepted the email (false when the user has no email or no password, or when no email service is configured)","type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"},"sent":{"type":"boolean"}}}}}},"202":{"description":"Held for the Admin Quorum: another platform administrator approves it","content":{"application/json":{"schema":{"description":"Held for the Admin Quorum: another platform administrator approves it","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"The body is not valid, or (`{ error }`) a platform administrator named no tenantId","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or (`{ error }`) a platform administrator named no tenantId","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot reset a user's password (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot reset a user's password (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such tenant or user, or (`{ error }`) password reset is not enabled for the tenant","content":{"application/json":{"schema":{"type":"object","description":"No such tenant or user, or (`{ error }`) password reset is not enabled for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/auth/email-change/confirm":{"post":{"tags":["auth"],"description":"Confirm an email change from the link sent to the new address (the token is the credential: no JWT, no tenant signature). Changes the address, closes the user's sessions and emails the old address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Address changed","content":{"application/json":{"schema":{"description":"Address changed","type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}},"400":{"description":"The link is invalid, used or expired","content":{"application/json":{"schema":{"description":"The link is invalid, used or expired","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"Another account now has the address","content":{"application/json":{"schema":{"description":"Another account now has the address","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/auth/social-link/confirm":{"post":{"tags":["auth"],"description":"Confirm, from the link emailed to an account's address, that a Google or Apple sign-in may be linked to that account (the token is the credential: no JWT, no tenant signature). Where Aurea enables this check for your tenant, a Google or Apple sign-in whose email matches an existing account whose address is not proven answers 409 and emails this link instead of signing in; once confirmed, the next sign-in with that Google or Apple account signs in to it. The link's page (GET /confirm-social-link) calls this from its button, never on opening.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Linked: sign in again with that provider","content":{"application/json":{"schema":{"description":"Linked: sign in again with that provider","type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"provider":{"type":"string","enum":["google","apple"]}},"required":["ok","provider"]}}}},"400":{"description":"The link is invalid, used or expired, or the account is no longer active","content":{"application/json":{"schema":{"description":"The link is invalid, used or expired, or the account is no longer active","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"The link can no longer be made: the account's address changed, the account is linked to another account of that provider, or that provider account is linked to another account","content":{"application/json":{"schema":{"description":"The link can no longer be made: the account's address changed, the account is linked to another account of that provider, or that provider account is linked to another account","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}":{"get":{"tags":["tenants","admin"],"description":"Get detailed tenant information by ID. Admin-only endpoint. API key is shown with prefix only for security.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Tenant found","content":{"application/json":{"schema":{"description":"Tenant found","type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"apiKeyPrefix":{"type":"string","description":"First 8 characters of API key"},"configuration":{"type":"object","additionalProperties":true},"status":{"type":"string","enum":["active","suspended","inactive"]},"logoUrl":{"type":["string","null"]},"type":{"type":"string","enum":["bank","fintech","merchant","wallet_app","exchange","other"],"description":"What the organisation is; absent when not said"},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"Where the organisation is (ISO 3166-1 alpha-2); absent when not said"},"onboardingState":{"type":"string","enum":["not_started","in_progress","completed"],"description":"Its onboarding with Aurea, set by Aurea's administrators; absent when not tracked"},"supportEmail":{"type":"string","description":"The support address its users are given; absent when none"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","apiKeyPrefix","configuration","status","createdAt","updatedAt"]}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/api-key":{"get":{"tags":["tenants","admin"],"description":"Retrieve the full API key for a tenant. Admin-only endpoint. The complete key is returned — handle with care.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Full API key returned.","content":{"application/json":{"schema":{"description":"Full API key returned.","type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"apiKeyPrefix":{"type":"string","description":"First 8 characters of API key"},"configuration":{"type":"object","additionalProperties":true},"status":{"type":"string","enum":["active","suspended","inactive"]},"logoUrl":{"type":["string","null"]},"type":{"type":"string","enum":["bank","fintech","merchant","wallet_app","exchange","other"],"description":"What the organisation is; absent when not said"},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"Where the organisation is (ISO 3166-1 alpha-2); absent when not said"},"onboardingState":{"type":"string","enum":["not_started","in_progress","completed"],"description":"Its onboarding with Aurea, set by Aurea's administrators; absent when not tracked"},"supportEmail":{"type":"string","description":"The support address its users are given; absent when none"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"apiKey":{"type":"string","description":"Full API key (only shown on creation/rotation)"}},"required":["id","name","apiKeyPrefix","configuration","status","createdAt","updatedAt","apiKey"]}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/rotate-key":{"post":{"tags":["tenants","admin"],"description":"Generate a new API key for the tenant. Admin-only endpoint. The old API key is immediately invalidated. The new API key is shown once - store it securely.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"API key rotated successfully. Store the new API key securely.","content":{"application/json":{"schema":{"description":"API key rotated successfully. Store the new API key securely.","type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"apiKeyPrefix":{"type":"string","description":"First 8 characters of API key"},"configuration":{"type":"object","additionalProperties":true},"status":{"type":"string","enum":["active","suspended","inactive"]},"logoUrl":{"type":["string","null"]},"type":{"type":"string","enum":["bank","fintech","merchant","wallet_app","exchange","other"],"description":"What the organisation is; absent when not said"},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"Where the organisation is (ISO 3166-1 alpha-2); absent when not said"},"onboardingState":{"type":"string","enum":["not_started","in_progress","completed"],"description":"Its onboarding with Aurea, set by Aurea's administrators; absent when not tracked"},"supportEmail":{"type":"string","description":"The support address its users are given; absent when none"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"apiKey":{"type":"string","description":"Full API key (only shown on creation/rotation)"}},"required":["id","name","apiKeyPrefix","configuration","status","createdAt","updatedAt","apiKey"]}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/api-secret":{"get":{"tags":["tenants","admin"],"description":"Retrieve the full HMAC signing secret for a tenant. Admin-only endpoint. Handle with care — this value authenticates all HMAC-signed requests.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Full API secret returned.","content":{"application/json":{"schema":{"description":"Full API secret returned.","type":"object","properties":{"apiSecret":{"type":"string"}}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/rotate-secret":{"post":{"tags":["tenants","admin"],"description":"Generate a new HMAC signing secret for the tenant. Admin-only endpoint. The old secret is immediately invalidated. Store the new secret securely.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"API secret rotated successfully. Store the new secret securely.","content":{"application/json":{"schema":{"description":"API secret rotated successfully. Store the new secret securely.","type":"object","properties":{"apiSecret":{"type":"string"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/blockchain-configs":{"get":{"tags":["tenants","admin"],"description":"Get all blockchain configurations for a specific tenant. Admin-only endpoint. Shows which blockchain networks are enabled and their RPC endpoints.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of blockchain configurations","content":{"application/json":{"schema":{"description":"List of blockchain configurations","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"rpcUrl":{"type":"string"},"chainId":{"type":"number"},"explorerUrl":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","chain","rpcUrl","chainId","isTestnet","isEnabled","gasSettings","metadata","createdAt","updatedAt"]}}}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"post":{"tags":["tenants","admin"],"description":"Create a new blockchain configuration for a tenant. Admin-only endpoint.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"maxLength":100},"chainId":{"type":"integer","minimum":1},"rpcUrl":{"type":"string","format":"uri","maxLength":500},"explorerUrl":{"type":["string","null"],"format":"uri","maxLength":500},"isTestnet":{"type":"boolean"},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}}},"required":["chain","chainId","rpcUrl","isTestnet"]}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant ID"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Blockchain configuration created successfully","content":{"application/json":{"schema":{"description":"Blockchain configuration created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"rpcUrl":{"type":"string"},"chainId":{"type":"number"},"explorerUrl":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","chain","rpcUrl","chainId","isTestnet","isEnabled","gasSettings","metadata","createdAt","updatedAt"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"409":{"description":"Conflict - Blockchain configuration already exists for this chain ID","content":{"application/json":{"schema":{"description":"Conflict - Blockchain configuration already exists for this chain ID","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/admin/tenants/{id}/blockchain-configs/{chainId}":{"patch":{"tags":["tenants","admin"],"description":"Update blockchain configuration for a specific chain and tenant. Admin-only endpoint. Allows customization of RPC endpoints, gas settings, and enable/disable chains.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"rpcUrl":{"type":"string","format":"uri","maxLength":500},"explorerUrl":{"type":["string","null"],"format":"uri","maxLength":500},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant ID"},{"schema":{"type":"string","pattern":"^\\d+$"},"in":"path","name":"chainId","required":true,"description":"Blockchain chain ID (e.g., 1 for Ethereum, 100 for Gnosis)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Blockchain configuration updated successfully","content":{"application/json":{"schema":{"description":"Blockchain configuration updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"rpcUrl":{"type":"string"},"chainId":{"type":"number"},"explorerUrl":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","chain","rpcUrl","chainId","isTestnet","isEnabled","gasSettings","metadata","createdAt","updatedAt"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or blockchain configuration not found","content":{"application/json":{"schema":{"description":"Tenant or blockchain configuration not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"delete":{"tags":["tenants","admin"],"description":"Delete a blockchain configuration for a specific chain and tenant. Admin-only endpoint.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant ID"},{"schema":{"type":"string","pattern":"^\\d+$"},"in":"path","name":"chainId","required":true,"description":"Blockchain chain ID"}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Blockchain configuration deleted successfully","content":{"application/json":{"schema":{"description":"Blockchain configuration deleted successfully","type":"object","properties":{}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or blockchain configuration not found","content":{"application/json":{"schema":{"description":"Tenant or blockchain configuration not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{tenantId}/tokens":{"get":{"tags":["tenants","admin"],"description":"List all tokens for a specific tenant with optional filters. Admin-only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"chain","required":false,"description":"Filter by blockchain"},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type"},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isActive","required":false,"description":"Filter by active status"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Number of items per page (1-100, default: 50)"},{"schema":{"type":"string"},"in":"query","name":"offset","required":false,"description":"Number of items to skip (default: 0)"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of tokens for the tenant","content":{"application/json":{"schema":{"description":"List of tokens for the tenant","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"name":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":["string","null"]},"decimals":{"type":"integer"},"isNative":{"type":"boolean"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","symbol","name","chain","isTestnet","chainId","decimals","isNative","isActive","createdAt","updatedAt"]}},"pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}},"required":["total","limit","offset","hasMore"]}},"required":["data","pagination"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"post":{"tags":["tenants","admin"],"description":"Create a new token for a specific tenant. Admin-only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string","minLength":1,"maxLength":20},"name":{"type":"string","minLength":1,"maxLength":255},"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false},"chainId":{"type":"integer","minimum":1},"address":{"type":["string","null"],"pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"decimals":{"type":"integer","minimum":0,"maximum":18,"default":18},"isNative":{"type":"boolean","default":false},"logoUri":{"type":"string","format":"uri"},"coingeckoId":{"type":"string","minLength":1,"maxLength":100}},"required":["symbol","name","chain","chainId","decimals","isNative"]}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Token created successfully","content":{"application/json":{"schema":{"description":"Token created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"name":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":["string","null"]},"decimals":{"type":"integer"},"isNative":{"type":"boolean"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","symbol","name","chain","isTestnet","chainId","decimals","isNative","isActive","createdAt","updatedAt"]}}}},"400":{"description":"Invalid input data, or an EVM address whose mixed-case EIP-55 checksum is wrong (details.code TOKEN_ADDRESS_CHECKSUM_INVALID)","content":{"application/json":{"schema":{"description":"Invalid input data, or an EVM address whose mixed-case EIP-55 checksum is wrong (details.code TOKEN_ADDRESS_CHECKSUM_INVALID)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"409":{"description":"Token already exists","content":{"application/json":{"schema":{"description":"Token already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"422":{"description":"No contract exists at the address on the token's chain (details.code TOKEN_ADDRESS_NOT_A_CONTRACT)","content":{"application/json":{"schema":{"description":"No contract exists at the address on the token's chain (details.code TOKEN_ADDRESS_NOT_A_CONTRACT)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}},"503":{"description":"The address could not be checked: the chain's node did not answer (details.code TOKEN_ADDRESS_UNVERIFIED; retry)","content":{"application/json":{"schema":{"description":"The address could not be checked: the chain's node did not answer (details.code TOKEN_ADDRESS_UNVERIFIED; retry)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}}}}},"/v1/admin/tenants/{tenantId}/tokens/{tokenId}":{"patch":{"tags":["tenants","admin"],"description":"Update a token for a specific tenant. Admin-only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"address":{"type":["string","null"],"pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"decimals":{"type":"integer","minimum":0,"maximum":18},"logoUri":{"type":["string","null"],"format":"uri"},"coingeckoId":{"type":["string","null"],"minLength":1,"maxLength":100},"isActive":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tokenId","required":true,"description":"Token ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Token updated successfully","content":{"application/json":{"schema":{"description":"Token updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"name":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":["string","null"]},"decimals":{"type":"integer"},"isNative":{"type":"boolean"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","symbol","name","chain","isTestnet","chainId","decimals","isNative","isActive","createdAt","updatedAt"]}}}},"400":{"description":"Invalid input data, or an EVM address whose mixed-case EIP-55 checksum is wrong (details.code TOKEN_ADDRESS_CHECKSUM_INVALID)","content":{"application/json":{"schema":{"description":"Invalid input data, or an EVM address whose mixed-case EIP-55 checksum is wrong (details.code TOKEN_ADDRESS_CHECKSUM_INVALID)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or token not found","content":{"application/json":{"schema":{"description":"Tenant or token not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"422":{"description":"No contract exists at the address on the token's chain (details.code TOKEN_ADDRESS_NOT_A_CONTRACT)","content":{"application/json":{"schema":{"description":"No contract exists at the address on the token's chain (details.code TOKEN_ADDRESS_NOT_A_CONTRACT)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}},"503":{"description":"The address could not be checked: the chain's node did not answer (details.code TOKEN_ADDRESS_UNVERIFIED; retry)","content":{"application/json":{"schema":{"description":"The address could not be checked: the chain's node did not answer (details.code TOKEN_ADDRESS_UNVERIFIED; retry)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"required":["error","message"]}}}}}},"delete":{"tags":["tenants","admin"],"description":"Hard delete a token for a specific tenant. Admin-only.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tokenId","required":true,"description":"Token ID"}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Token deleted successfully","content":{"application/json":{"schema":{"description":"Token deleted successfully","type":"object","properties":{}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or token not found","content":{"application/json":{"schema":{"description":"Tenant or token not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{tenantId}/tokens/{tokenId}/active":{"patch":{"tags":["tenants","admin"],"description":"Toggle the active status of a token for a specific tenant. Admin-only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isActive":{"type":"boolean"}},"required":["isActive"]}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tokenId","required":true,"description":"Token ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Token active status updated successfully","content":{"application/json":{"schema":{"description":"Token active status updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"name":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":["string","null"]},"decimals":{"type":"integer"},"isNative":{"type":"boolean"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","symbol","name","chain","isTestnet","chainId","decimals","isNative","isActive","createdAt","updatedAt"]}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"description":"Invalid input data","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or token not found","content":{"application/json":{"schema":{"description":"Tenant or token not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/admin/tenants/{tenantId}/users":{"get":{"tags":["tenants","admin"],"description":"List all users for a specific tenant. Admin-only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Page size (1-100, default 50)"},{"schema":{"type":"string"},"in":"query","name":"offset","required":false,"description":"Offset (default 0)"},{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type (true = testnet, false = mainnet)"},{"schema":{"type":"string","enum":["active","inactive"]},"in":"query","name":"status","required":false,"description":"Filter by user status. If omitted, returns users of all statuses."},{"schema":{"type":"string"},"in":"query","name":"username","required":false,"description":"Search by username (case-insensitive partial match)"},{"schema":{"type":"string","maxLength":100},"in":"query","name":"referral_code","required":false,"description":"Filter users by referral code (exact match)"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of tenant users","content":{"application/json":{"schema":{"description":"List of tenant users","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}},"pagination":{"type":"object","properties":{"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"hasMore":{"type":"boolean"}}}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"post":{"tags":["tenants","admin"],"description":"Create a user in a specific tenant. Admin-only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string","minLength":3,"maxLength":100},"password":{"type":"string","minLength":8,"maxLength":100},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["user","tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"User created successfully","content":{"application/json":{"schema":{"description":"User created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"]},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"Username or email already exists","content":{"application/json":{"schema":{"description":"Username or email already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/admin/tenants/{tenantId}/users/{userId}":{"delete":{"tags":["tenants","admin"],"description":"Delete (soft delete) a user from a specific tenant. Admin-only.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true,"description":"User ID"}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"User deleted successfully","content":{"application/json":{"schema":{"description":"User deleted successfully","type":"object","properties":{}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Forbidden - Admin role required","content":{"application/json":{"schema":{"description":"Forbidden - Admin role required","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant or user not found","content":{"application/json":{"schema":{"description":"Tenant or user not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/tenant/public":{"get":{"tags":["tenants"],"description":"Get public tenant configuration (logo URL and primary color). Requires HMAC signing only — no JWT needed. Intended for use before login.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"walletMode":{"type":"string"},"appleSignInEnabled":{"type":"boolean"},"googleWebClientId":{"type":["null","string"]},"onboarding":{"type":["null","object"],"additionalProperties":true}}}}}}}}},"/v1/tenant":{"get":{"tags":["tenants"],"description":"Get information about the current user's tenant. Returns tenant details based on JWT token. API key is not exposed.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current tenant information","content":{"application/json":{"schema":{"description":"Current tenant information","type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"configuration":{"type":"object","additionalProperties":true},"status":{"type":"string","enum":["active","suspended","inactive"]},"logoUrl":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","configuration","status","createdAt","updatedAt"]}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/tenant/blockchain-configs":{"get":{"tags":["tenants"],"description":"Get enabled blockchain configurations for the current user's tenant. Returns only enabled chains with their RPC endpoints and settings.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of enabled blockchain configurations","content":{"application/json":{"schema":{"description":"List of enabled blockchain configurations","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"rpcUrl":{"type":"string"},"chainId":{"type":"number"},"explorerUrl":{"type":["string","null"]},"isTestnet":{"type":"boolean"},"isEnabled":{"type":"boolean"},"gasSettings":{"type":"object"},"metadata":{"type":"object"},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","chain","rpcUrl","chainId","isTestnet","isEnabled","gasSettings","metadata","createdAt","updatedAt"]}}}}}}},"401":{"description":"Unauthorized - Missing or invalid JWT token","content":{"application/json":{"schema":{"description":"Unauthorized - Missing or invalid JWT token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant not found","content":{"application/json":{"schema":{"description":"Tenant not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/tenant/available-features":{"get":{"summary":"Get available features for the current tenant","tags":["tenants"],"description":"Returns feature flags derived from the tenant configuration. Use this to gate optional UI flows on the client.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Feature flags for the current tenant","content":{"application/json":{"schema":{"description":"Feature flags for the current tenant","type":"object","properties":{"moneriumIban":{"type":"boolean","description":"True when the tenant uses Gnosis Pay (bankingProvider=gnosis) and Monerium IBAN is available."},"eurAccountIban":{"type":"boolean","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"dappsEnabled":{"type":"boolean","description":"True when the dApps browser feature is enabled for this tenant."},"nonCustodialWallets":{"type":"boolean","description":"True when this tenant requires non-custodial wallets (walletMode=non_custodial)."},"modules":{"type":"object","description":"The tenant's modules: true where the module is on. A module that is off answers 403 MODULE_NOT_ENABLED on its routes.","required":["bank_ramp","card_onramp","fiat","earn","tokenized","swap_dapps","ai_agents","remittance"],"properties":{"bank_ramp":{"type":"boolean"},"card_onramp":{"type":"boolean"},"fiat":{"type":"boolean"},"earn":{"type":"boolean"},"tokenized":{"type":"boolean"},"swap_dapps":{"type":"boolean"},"ai_agents":{"type":"boolean"},"remittance":{"type":"boolean"},"identity_verification":{"type":"boolean"}}}},"required":["moneriumIban","dappsEnabled","nonCustodialWallets","modules"]}}}}}}},"/v1/users/":{"post":{"tags":["users"],"description":"Create a new user","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$"},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8,"maxLength":100},"role":{"type":"string","enum":["user","tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]}},"required":["username","password"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"User created successfully","content":{"application/json":{"schema":{"description":"User created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"409":{"description":"Username or email already exists","content":{"application/json":{"schema":{"description":"Username or email already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}},"get":{"tags":["users"],"description":"List users with pagination","parameters":[{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Number of users per page (1-100, default: 50)"},{"schema":{"type":"string"},"in":"query","name":"offset","required":false,"description":"Number of users to skip (default: 0)"},{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type: 'true' for testnet users only, 'false' for mainnet users only. If omitted, returns all users."},{"schema":{"type":"string","enum":["active","inactive"]},"in":"query","name":"status","required":false,"description":"Filter by user status. If omitted, returns users of all statuses."},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Required for platform admins (JWT tenantId is null). Ignored for tenantadmin users."},{"schema":{"type":"string","maxLength":100},"in":"query","name":"referral_code","required":false,"description":"Filter users by referral code (exact match)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of users","content":{"application/json":{"schema":{"description":"List of users","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}},"pagination":{"type":"object","properties":{"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"hasMore":{"type":"boolean"}}}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/users/me/fcm-token":{"patch":{"tags":["users"],"description":"Register or update the device's push notification token for the authenticated user (`pushToken`; `fcmToken`, its older name, is still accepted). A token is held once within the tenant: a device that signs in as another user of the tenant is re-assigned to that user. Both names follow the same rule; 400 `PUSH_TOKEN_CONFLICT` when both are sent and differ.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"pushToken":{"type":"string","minLength":1,"description":"The device's push notification token, as the device's push service gave it to your app. Required unless `fcmToken`, its older name, is sent."},"fcmToken":{"type":"string","minLength":1,"deprecated":true,"description":"The older name of `pushToken`, still accepted. Send one of the two (one is required); both only when equal (otherwise 400 `PUSH_TOKEN_CONFLICT`)."},"platform":{"type":"string","enum":["ios","android","web"],"description":"Device platform. Defaults to 'ios' when omitted."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The push token registered. `message` names the field the request used.","content":{"application/json":{"schema":{"description":"The push token registered. `message` names the field the request used.","type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}}}}}},"/v1/users/me":{"patch":{"tags":["users"],"description":"Update the authenticated user's own username and/or display name. Both fields are optional but at least one must be present. Username must be unique within the tenant and match ^[a-zA-Z0-9_-]{3,100}$.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$","description":"New username (must be unique within the tenant)"},"displayName":{"type":["string","null"],"maxLength":100,"description":"Human-readable display name (may be null to clear it)"}},"anyOf":[{"required":["username"]},{"required":["displayName"]}]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Profile updated successfully","content":{"application/json":{"schema":{"description":"Profile updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"403":{"description":"Forbidden — platform admins cannot use this endpoint","content":{"application/json":{"schema":{"description":"Forbidden — platform admins cannot use this endpoint","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"409":{"description":"Username already taken within this tenant","content":{"application/json":{"schema":{"description":"Username already taken within this tenant","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/users/{id}/qr-code":{"get":{"tags":["users"],"description":"Get user QR code for receiving payments. Returns a data URL (base64-encoded PNG image) containing a deep link in the format: bper://send?username={username}&tenant={tenantId}. Mobile apps should scan this QR code to initiate a transaction to this user.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"QR code retrieved successfully. The qrCode field contains a data URL (e.g., 'data:image/png;base64,...') that encodes the deep link 'bper://send?username={username}&tenant={tenantId}'","content":{"application/json":{"schema":{"description":"QR code retrieved successfully. The qrCode field contains a data URL (e.g., 'data:image/png;base64,...') that encodes the deep link 'bper://send?username={username}&tenant={tenantId}'","type":"object","properties":{"qrCode":{"type":"string","description":"Base64-encoded PNG image as a data URL. When scanned, reveals the deep link format: bper://send?username={username}&tenant={tenantId}","example":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."}},"required":["qrCode"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/users/{id}":{"get":{"tags":["users"],"description":"Get user by ID","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Required for platform admins (JWT tenantId is null). Ignored for tenantadmin users."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User found","content":{"application/json":{"schema":{"description":"User found","type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"put":{"tags":["users"],"description":"Update user","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8,"maxLength":100},"currentPassword":{"type":"string","minLength":1,"maxLength":100,"description":"The caller's current password, when it changes its own password or email. Required where the tenant asks for it (otherwise 400 CURRENT_PASSWORD_REQUIRED); ignored on another user's account."}},"anyOf":[{"required":["email"]},{"required":["password"]}]}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Required for platform admins (JWT tenantId is null). Ignored for tenantadmin users."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User updated successfully","content":{"application/json":{"schema":{"description":"User updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","username","status","role","createdAt","updatedAt"]}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"Email already exists","content":{"application/json":{"schema":{"description":"Email already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}},"delete":{"tags":["users"],"description":"Delete user (soft delete)","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Required for platform admins (JWT tenantId is null). Ignored for tenantadmin users."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"User deleted successfully","content":{"application/json":{"schema":{"description":"User deleted successfully","type":"object","properties":{}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/users/search":{"get":{"tags":["users"],"description":"Search users by username: the recipient lookup of a payment flow. Each result always carries `username` and `wallets`, and each wallet its `address`: that is all a caller who is not an administrator receives, and all a new integration should rely on. The other fields are returned to tenant administrators and to tenants on the legacy search only. A caller who is not an administrator receives at most 10 users, and the username is matched as written.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"username","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Search results with associated wallets","content":{"application/json":{"schema":{"description":"Search results with associated wallets","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"qrCode":{"type":["string","null"]},"wallets":{"type":"array","items":{"type":"object","description":"A wallet of the user. `address` is always present; the other fields only for administrators and tenants on the legacy search.","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"label":{"type":["string","null"]}}}}}}}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/users/advanced-search":{"get":{"tags":["users"],"description":"Advanced user search by wallet ID, wallet address, or username. Returns users with their associated wallets. Supports filtering by testnet/mainnet wallets. Each result always carries `username` and `wallets`, and each wallet its `address`: that is all a caller who is not an administrator receives, and all a new integration should rely on. The other fields are returned to tenant administrators and to tenants on the legacy search only. A caller who is not an administrator searches by `username` and `wallet_address` only (any other filter is refused), receives at most 10 users per page, and the username is matched as written.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"wallet_id","required":false,"description":"Search by wallet ID (exact match)"},{"schema":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"in":"query","name":"wallet_address","required":false,"description":"Search by wallet address (case-insensitive exact match). Accepts EVM (0x...) or Solana (base58) addresses."},{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"username","required":false,"description":"Search by username (case-insensitive partial match)"},{"schema":{"type":"string","maxLength":100},"in":"query","name":"referral_code","required":false,"description":"Filter by referral code (exact match)"},{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type: 'true' for testnet wallets only, 'false' for mainnet wallets only. If omitted, returns users from both networks."},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Number of users per page (1-100, default: 50)"},{"schema":{"type":"string"},"in":"query","name":"offset","required":false,"description":"Number of users to skip (default: 0)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Paginated search results with wallets","content":{"application/json":{"schema":{"description":"Paginated search results with wallets","type":"object","properties":{"data":{"type":"array","items":{"type":"object","description":"A user found. `username` and `wallets` are always present; the other fields only for administrators and tenants on the legacy search.","properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"status":{"type":"string","enum":["active","suspended","inactive"]},"role":{"type":"string","enum":["user","admin","tenantadmin","platform_support","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"wallets":{"type":"array","items":{"type":"object","description":"A wallet of the user. `address` is always present; the other fields only for administrators and tenants on the legacy search.","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"label":{"type":["string","null"]}}}},"email":{"type":["string","null"]},"qrCode":{"type":["string","null"],"description":"Base64-encoded PNG QR code as data URL. Contains deep link: bper://send?username={username}&tenant={tenantId}"},"displayName":{"type":["string","null"],"description":"Optional human-readable display name set by the user."}}}},"pagination":{"type":"object","properties":{"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"hasMore":{"type":"boolean"}}}}}}}},"400":{"description":"Validation error or missing search parameters","content":{"application/json":{"schema":{"description":"Validation error or missing search parameters","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/users/{id}/wallets":{"get":{"tags":["users"],"description":"Get all wallets associated with a specific user","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of user wallets","content":{"application/json":{"schema":{"description":"List of user wallets","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"label":{"type":["string","null"]}},"required":["id","chain","address","isPrimary"]}}},"required":["data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"description":"User not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}}},"/v1/users/{id}/release-username":{"post":{"summary":"Free a deactivated user's username for a new registration","tags":["users"],"description":"Exists where the platform refuses to register a deactivated user's username again; otherwise not answered here. Only a deactivated user's username can be released, once.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["userId","released"],"properties":{"userId":{"type":"string","format":"uuid"},"released":{"type":"boolean"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{tenantId}/users/{userId}/mfa":{"delete":{"summary":"Remove a user's second factor","tags":["users"],"description":"An administrator removes a user's authenticator app and recovery codes (a lost phone): the user enrols again at its next sign-in. The rules of the other account actions apply (a tenant admin does not act on another tenant admin).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["removed"],"properties":{"removed":{"type":"boolean"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"403":{"description":"An account the caller may not act on","content":{"application/json":{"schema":{"description":"An account the caller may not act on","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"No such user in the tenant","content":{"application/json":{"schema":{"description":"No such user in the tenant","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{tenantId}/users/{userId}/passkeys":{"delete":{"summary":"Revoke a user's passkeys","tags":["users"],"description":"An administrator revokes every active passkey of a user (a lost device): the user registers a new one, its first needing no step-up. The rules of the other account actions apply (a tenant admin does not act on another tenant admin). Never one's own passkeys: 403 PASSKEY_RESET_SELF — revoke each of yours with POST /v1/auth/passkeys/{passkeyId}/revoke.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"integer","description":"How many active passkeys were revoked."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/passkey-address":{"get":{"summary":"Your tenant's passkey address","tags":["auth"],"description":"The relying party id and the origins your own apps use for passkeys and the step-up, in addition to Aurea's own. Ask the options for it with `rpId` (POST /v1/auth/passkeys/registration/options, POST /v1/auth/step-up/options); a passkey registered for it is asserted for it only. For your tenant's operators. 404 `PASSKEY_ADDRESS_TENANT_NOT_FOUND`: no such tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["tenantId","rpId","origins","updatedAt"],"properties":{"tenantId":{"type":"string","format":"uuid"},"rpId":{"type":["string","null"],"description":"The relying party id (RP ID) of your own apps' passkeys — a domain of yours — or null when your tenant has none: then passkeys and the step-up work on Aurea's own relying party only. Ask Aurea to set it up."},"origins":{"type":"array","items":{"type":"string"},"description":"The https origins of your apps that may register and assert passkeys for `rpId` (each on `rpId` or one of its subdomains); empty when there is no `rpId`."},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{tenantId}/users/{userId}/password-reset":{"post":{"tags":["tenants","admin"],"description":"Email the user a single-use link to choose a new password, and close the user's sessions. This is how an administrator gets a user a new password: an administrator never sets one (where Aurea enables this rule for your tenant, PUT /v1/users/:id with a password is refused). The link works whether or not the tenant has turned on self-service forgot-password, and lasts the tenant's reset-link lifetime (60 minutes unless configured); it replaces any link the user had. The user's current password keeps working until a new one is chosen; choosing it closes the sessions again and emails a notice. A tenant admin cannot send it to another tenant admin; an Aurea admin can send it to anyone.","parameters":[{"schema":{"type":"string","enum":["en","it"],"default":"en"},"in":"query","name":"locale","required":false,"description":"Language of the emails (default en)"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true,"description":"User ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Link sent (or attempted: see emailSent) and sessions closed","content":{"application/json":{"schema":{"description":"Link sent (or attempted: see emailSent) and sessions closed","type":"object","properties":{"emailSent":{"type":"boolean","description":"Whether the email service accepted the email"},"expiresAt":{"type":"string","format":"date-time"},"sessionsClosed":{"type":"boolean","enum":[true]}},"required":["emailSent","expiresAt","sessionsClosed"]}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","content":{"application/json":{"schema":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant or user not found","content":{"application/json":{"schema":{"description":"Tenant or user not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"The user is not active, has no email address, or signs in with Google or Apple only","content":{"application/json":{"schema":{"description":"The user is not active, has no email address, or signs in with Google or Apple only","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/admin/tenants/{tenantId}/users/{userId}/email-change":{"post":{"tags":["tenants","admin"],"description":"Ask to change the user's email address. The new address gets a single-use confirmation link (24 hours) and the current address a notice; users.email changes only when the link is used, and then the user's sessions and outstanding reset links end and the old address is told. A new request replaces the pending one. An administrator never sets an email directly (where Aurea enables this rule for your tenant, PUT /v1/users/:id with an email is refused). A tenant admin cannot ask for another tenant admin; an Aurea admin can for anyone.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","maxLength":255},"locale":{"type":"string","enum":["en","it"],"default":"en","description":"Language of the emails (default en)"}},"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true,"description":"User ID"}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Waiting for the new address to confirm","content":{"application/json":{"schema":{"description":"Waiting for the new address to confirm","type":"object","properties":{"status":{"type":"string","enum":["pending"]},"newEmail":{"type":"string","format":"email","description":"The address waiting to confirm"},"requestedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"When the confirmation link stops working"},"requestedByRole":{"type":"string","enum":["admin","tenantadmin","owner","non_signing_admin"]},"confirmationSent":{"type":"boolean","description":"Whether the email service accepted the confirmation to the new address"},"noticeSent":{"type":["null","boolean"],"description":"Whether it accepted the notice to the current address; null when the user has none"}},"required":["status","newEmail","requestedAt","expiresAt","requestedByRole","confirmationSent","noticeSent"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","content":{"application/json":{"schema":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant or user not found","content":{"application/json":{"schema":{"description":"Tenant or user not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"The user is not active, already has this address, or another account has it","content":{"application/json":{"schema":{"description":"The user is not active, already has this address, or another account has it","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"422":{"description":"Invalid email address","content":{"application/json":{"schema":{"description":"Invalid email address","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}},"get":{"tags":["tenants","admin"],"description":"The user's email change waiting for confirmation, if any (pending: null when none).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true,"description":"User ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The pending change, or null","content":{"application/json":{"schema":{"description":"The pending change, or null","type":"object","properties":{"pending":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","enum":["pending"]},"newEmail":{"type":"string","format":"email","description":"The address waiting to confirm"},"requestedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"When the confirmation link stops working"},"requestedByRole":{"type":"string","enum":["admin","tenantadmin","owner","non_signing_admin"]}},"required":["status","newEmail","requestedAt","expiresAt","requestedByRole"]},{"type":"null"}]}},"required":["pending"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Not this tenant's administrator, or an Aurea admin account (for a tenant admin)","content":{"application/json":{"schema":{"description":"Not this tenant's administrator, or an Aurea admin account (for a tenant admin)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"404":{"description":"Tenant or user not found","content":{"application/json":{"schema":{"description":"Tenant or user not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}}}},"delete":{"tags":["tenants","admin"],"description":"Withdraw the user's pending email change: its confirmation link stops working.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"tenantId","required":true,"description":"Tenant ID"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true,"description":"User ID"}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"Withdrawn","content":{"application/json":{"schema":{"description":"Withdrawn","type":"object","properties":{}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"description":"Unauthorized","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["message"]}}}},"403":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","content":{"application/json":{"schema":{"description":"Not this tenant's administrator, an Aurea admin account, or (for a tenant admin) another tenant admin","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"404":{"description":"Tenant or user not found","content":{"application/json":{"schema":{"description":"Tenant or user not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}},"409":{"description":"The user is not active","content":{"application/json":{"schema":{"description":"The user is not active","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["message"]}}}}}}},"/v1/wallets/":{"post":{"tags":["wallets"],"description":"Create a new blockchain wallet","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"description":"Chain: an EVM family slug (ethereum, polygon, gnosis, bsc, arbitrum, optimism, base, avalanche, celo, flowevm) or solana. A testnet's chains row id (polygon-amoy, celo-sepolia) is accepted: the wallet is stored under the family slug on that testnet."},"name":{"type":"string","minLength":1,"maxLength":100,"description":"Optional user-friendly label for the wallet"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean","default":false,"description":"Network type: false for mainnet (default), true for testnet"}},"required":["chain"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Wallet created successfully","content":{"application/json":{"schema":{"description":"Wallet created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"walletType":{"type":"string","enum":["eoa","contract","multisig"]},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"409":{"description":"Wallet address already exists","content":{"application/json":{"schema":{"description":"Wallet address already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}},"get":{"tags":["wallets"],"description":"List all wallets for authenticated user","parameters":[{"schema":{"type":"string"},"in":"query","name":"chain","required":false,"description":"Filter by chain: a family slug, or a testnet's chains row id (polygon-amoy), which also selects the testnet"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false,"description":"Number of items per page"},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false,"description":"Number of items to skip"},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type: false for mainnet (default), true for testnet"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of wallets","content":{"application/json":{"schema":{"description":"List of wallets","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"walletType":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"hasBanking":{"type":"boolean"}}}},"pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}}}}}}}}}},"/v1/wallets/import":{"post":{"tags":["wallets"],"description":"Import an existing blockchain wallet (supports private key, mnemonic, or watch-only)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"description":"Chain: an EVM family slug (ethereum, polygon, gnosis, bsc, arbitrum, optimism, base, avalanche, celo, flowevm) or solana. A testnet's chains row id (polygon-amoy, celo-sepolia) is accepted: the wallet is stored under the family slug on that testnet."},"privateKey":{"type":"string","pattern":"^(0x)?[0-9a-fA-F]{64}$"},"mnemonic":{"type":"string"},"derivationPath":{"type":"string","pattern":"^m(\\/\\d+'?)+$"},"accountIndex":{"type":"integer","minimum":0,"maximum":2147483647},"label":{"type":"string","minLength":1,"maxLength":100},"watchOnly":{"type":"boolean"},"address":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean","default":false,"description":"Network type: false for mainnet (default), true for testnet"}},"required":["chain"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Wallet imported successfully","content":{"application/json":{"schema":{"description":"Wallet imported successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"walletType":{"type":"string","enum":["eoa","contract","multisig"]},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid input (private key, mnemonic, address, or derivation path)","content":{"application/json":{"schema":{"description":"Invalid input (private key, mnemonic, address, or derivation path)","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"409":{"description":"Wallet address already exists","content":{"application/json":{"schema":{"description":"Wallet address already exists","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/wallets/{id}":{"get":{"tags":["wallets"],"description":"Get wallet by ID","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Wallet found","content":{"application/json":{"schema":{"description":"Wallet found","type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"walletType":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"description":"Wallet not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}},"delete":{"tags":["wallets"],"description":"Delete a wallet","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Wallet deleted successfully","content":{"application/json":{"schema":{"description":"Wallet deleted successfully","type":"object","properties":{}}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"description":"Wallet not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/wallets/{id}/balance":{"get":{"tags":["wallets"],"description":"Get wallet balance (native + tokens). Optionally specify a chain to query balance on a different network than the wallet's registered chain. Use isTestnet parameter to switch between mainnet and testnet data.","parameters":[{"schema":{"type":"string"},"in":"query","name":"chain","required":false,"description":"Query the wallet's address on another chain of the same network: a family slug, or a testnet's chains row id (polygon-amoy). A chain on the other network returns 400."},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Wallet balance","content":{"application/json":{"schema":{"description":"Wallet balance","type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"},"nativeBalance":{"type":"object","properties":{"balance":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"}}},"tokens":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":["string","null"]},"name":{"type":["string","null"]},"balance":{"type":"string"},"decimals":{"type":"integer"},"type":{"type":"string","enum":["erc20","erc721","erc1155"]}}}},"lastUpdated":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"description":"Wallet not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/wallets/balances/aggregate":{"get":{"tags":["wallets"],"description":"Get aggregated wallet balances across all supported chains for the authenticated user. Use isTestnet parameter to switch between mainnet and testnet data.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"refresh","required":false,"description":"If true, force fetch from blockchain and update cache. If false, try to use cached data."},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"Network type: false for mainnet (default), true for testnet"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Aggregated balances across all chains","content":{"application/json":{"schema":{"description":"Aggregated balances across all chains","type":"object","properties":{"summary":{"type":"object","properties":{"totalChains":{"type":"integer","description":"Number of chains with wallets"},"totalWallets":{"type":"integer","description":"Total number of wallets"},"totalTokens":{"type":"integer","description":"Total unique tokens across all chains"}},"required":["totalChains","totalWallets","totalTokens"]},"byChain":{"type":"object","description":"Balances grouped by blockchain","additionalProperties":{"type":["null","object"],"properties":{"walletAddress":{"type":"string"},"tokens":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"name":{"type":["string","null"]},"address":{"type":["string","null"]},"balance":{"type":"string"},"formattedBalance":{"type":"string"},"decimals":{"type":"integer"}},"required":["symbol","name","address","balance","formattedBalance","decimals"]}}},"required":["walletAddress","tokens"]}},"byToken":{"type":"object","description":"Balances aggregated by token symbol","additionalProperties":{"type":"object","properties":{"name":{"type":["string","null"]},"logoUri":{"type":["string","null"],"description":"Token logo URI from the token registry"},"priceChange24h":{"type":["number","null"],"description":"24-hour price change percentage from CoinGecko. null if not yet fetched."},"totalBalance":{"type":"string","description":"Total balance across all chains (for native tokens only, otherwise first chain balance)"},"totalInEur":{"type":["number","null"],"description":"Sum of balanceInEur across all chains. null if no price is configured for this token."},"totalInUsd":{"type":["number","null"],"description":"Sum of balanceInUsd across all chains. null if no price is configured for this token."},"chains":{"type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"balance":{"type":"string"},"formattedBalance":{"type":"string"},"tokenAddress":{"type":["string","null"]},"balanceInEur":{"type":["number","null"],"description":"formattedBalance × token priceEur. null if no EUR price is configured."},"balanceInUsd":{"type":["number","null"],"description":"formattedBalance × token priceUsd. null if no USD price is configured."}},"required":["chain","balance","formattedBalance","tokenAddress"]}}},"required":["name","totalBalance","chains"]}},"lastUpdated":{"type":"string","format":"date-time","description":"ISO timestamp of when the data was fetched or last cached"}},"required":["summary","byChain","byToken"]}}}}}}},"/v1/wallets/{id}/primary":{"patch":{"tags":["wallets"],"description":"Set wallet as primary for its chain","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isPrimary":{"type":"boolean"}},"required":["isPrimary"]}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Wallet updated successfully","content":{"application/json":{"schema":{"description":"Wallet updated successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"walletType":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"description":"Wallet not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/wallets/{id}/set-primary":{"patch":{"tags":["wallets"],"description":"Set a wallet as primary for its chain and network type. Atomically demotes all other wallets for the same user, chain, and network (mainnet/testnet), then promotes the target wallet.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Wallet promoted to primary successfully","content":{"application/json":{"schema":{"description":"Wallet promoted to primary successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"chain":{"type":"string"},"address":{"type":"string"},"walletType":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["null","string"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"hasBanking":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"403":{"description":"Wallet does not belong to the authenticated user","content":{"application/json":{"schema":{"description":"Wallet does not belong to the authenticated user","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}},"404":{"description":"Wallet not found","content":{"application/json":{"schema":{"description":"Wallet not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/wallets/request-export-token":{"post":{"summary":"Request key export token","tags":["wallets"],"description":"Initiates wallet key migration to client-side custody. Verifies user password, creates a one-time export token (TTL 10 min), and transitions the wallet to client_side_pending.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"password":{"type":"string","minLength":1}},"required":["walletId","password"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"exportToken":{"type":"string","description":"Raw hex export token — pass in X-Export-Token header to POST /export-key"}}}}}}}}},"/v1/wallets/export-key":{"post":{"summary":"Export encrypted private key to device","tags":["wallets"],"description":"Exports the wallet private key encrypted with ECIES (X25519 ECDH + AES-256-GCM). Requires the X-Export-Token header. Can only be called once per wallet. Answered only where Aurea enables key export.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"clientEphemeralPublicKey":{"type":"string","minLength":1,"description":"Base64-encoded X25519 ephemeral public key (32 bytes)"}},"required":["walletId","clientEphemeralPublicKey"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-export-token","required":true,"description":"Raw hex export token from POST /request-export-token"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"keyType":{"type":"string","enum":["evm","solana"]},"encryptedPayload":{"type":"string"},"ephemeralPublicKey":{"type":"string"},"iv":{"type":"string"},"tag":{"type":"string"},"exportedAt":{"type":"string"}}}}}}}}},"/v1/wallets/migration-challenge":{"get":{"summary":"Get migration challenge for client signing","tags":["wallets"],"description":"Issues a 32-byte random challenge (TTL 5 min) that the client must sign with the exported private key to prove custody before server shares are nulled.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"challenge":{"type":"string","description":"Hex-encoded 32-byte challenge"},"expiresAt":{"type":"string"}}}}}}}}},"/v1/wallets/confirm-client-custody":{"post":{"summary":"Confirm client custody of wallet key","tags":["wallets"],"description":"Validates the client's signed challenge, then atomically nulls server-side key shares, sets key_management_scheme to client_side, and removes permit nonce reservations. After this call the server can no longer sign on behalf of this wallet.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"signedChallenge":{"type":"string","minLength":1,"description":"Hex-encoded ECDSA or Ed25519 signature of the challenge"}},"required":["walletId","signedChallenge"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"migrated":{"type":"boolean"}}}}}}}}},"/v1/wallets/cancel-migration":{"post":{"summary":"Cancel key migration","tags":["wallets"],"description":"Reverts the wallet from client_side_pending back to server-custodial. Blocked with 409 if the key has already been transmitted (key_exported_at IS NOT NULL).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"password":{"type":"string","minLength":1}},"required":["walletId","password"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"cancelled":{"type":"boolean"}}}}}}}}},"/v1/wallets/register-device":{"post":{"summary":"Register device public key for wallet","tags":["wallets"],"description":"Associates a device's public key with a wallet by verifying a challenge signature. Used for push-notification-based signing flows.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"signedChallenge":{"type":"string","minLength":1},"devicePublicKey":{"type":"string","minLength":1,"description":"Base64-encoded device public key"}},"required":["walletId","signedChallenge","devicePublicKey"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"registered":{"type":"boolean"}}}}}}}}},"/v1/wallets/client/challenge":{"get":{"summary":"Get challenge for new client-side wallet","tags":["wallets"],"description":"Issues a 32-byte random challenge (TTL 10 min) that the client must sign with its newly generated private key to prove ownership before the wallet is registered. Used by non-custodial tenants.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"chain","required":true},{"schema":{"type":"string","minLength":1},"in":"query","name":"address","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"challenge":{"type":"string","description":"Hex-encoded 32-byte challenge"},"expiresAt":{"type":"string"}}}}}}}}},"/v1/wallets/client":{"post":{"summary":"Register new client-side wallet","tags":["wallets"],"description":"Verifies the signed challenge from GET /client/challenge and creates a wallet row with key_management_scheme = 'client_side'. No key material is stored server-side. Used by non-custodial tenants.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"description":"Chain: an EVM family slug, solana, or evm to register the address on every EVM chain. A testnet's chains row id (polygon-amoy) is accepted: the wallet is stored under the family slug on that testnet."},"address":{"type":"string","minLength":1},"signedChallenge":{"type":"string","minLength":1},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":"string"}},"required":["chain","address","signedChallenge"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"chain":{"type":"string"},"address":{"type":"string"},"walletType":{"type":"string"},"isPrimary":{"type":"boolean"},"isTestnet":{"type":"boolean"},"label":{"type":["string","null"]},"isWatchOnly":{"type":"boolean"},"keyManagementScheme":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}}}}}}},"/v1/wallets/custodial-migration":{"get":{"summary":"The custodial wallets the caller moves to a wallet the tenant's mode allows","tags":["wallets"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["mode","walletMode","due"],"properties":{"mode":{"type":"string","enum":["log","enforce"]},"walletMode":{"type":"string","enum":["custodial","non_custodial","mpc"]},"due":{"type":"array","items":{"type":"object","required":["walletId","chain","isTestnet","address","targets","next","retire"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"targets":{"type":"array","items":{"type":"object","required":["walletId","address","chain"],"properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"}}}},"next":{"type":"object","required":["action"],"additionalProperties":true,"description":"The button the client shows: create_wallet (make an MPC wallet of `curve` with `route`), move_funds (send this wallet's funds to `toAddress`, then retire it), move_to_device (the key export to the device, `route`), contact_support (help@aureahub.com)","properties":{"action":{"type":"string","enum":["create_wallet","move_funds","move_to_device","contact_support"]}}},"retire":{"type":["string","null"]}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/wallets/custodial-migration/{walletId}/retire":{"post":{"summary":"Retire a custodial wallet whose funds moved to the caller's MPC wallet","tags":["wallets"],"description":"Checks the current password and that every chain's balance of the wallet is zero, then deactivates it (its key kept, its signing refused) and records the MPC wallet that took its place. Where the platform runs this step in log, answers what it would do and changes nothing.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["outcome","walletId","targetWalletId"],"properties":{"outcome":{"type":"string","enum":["retired","would_retire","would_refuse"]},"walletId":{"type":"string","format":"uuid"},"targetWalletId":{"type":"string","format":"uuid"},"checkedChains":{"type":"array","items":{"type":"string"}},"reasons":{"type":"array","items":{"type":"string"}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/mpc/config":{"get":{"summary":"Whether MPC is enabled for the tenant + whether the user has an MPC wallet","tags":["mpc"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Whether the tenant creates MPC wallets and whether the user already has one","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Whether the tenant creates MPC wallets and whether the user already has one","properties":{"enabled":{"type":"boolean","description":"The tenant's walletMode is mpc"},"walletMode":{"type":"string","description":"The tenant's walletMode (custodial when it has none)"},"hasWallet":{"type":"boolean"},"curves":{"type":"array","items":{"type":"string"}}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/dkg/start":{"post":{"summary":"Start a 2-of-3 DKG ceremony to create an MPC wallet","tags":["mpc"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","minLength":1,"description":"The chain the wallet is for: an EVM chain family's slug, or solana."},"curve":{"type":"string","enum":["secp256k1","ed25519"],"description":"secp256k1 for EVM chains, ed25519 for Solana."},"isTestnet":{"type":"boolean","description":"A testnet wallet. Omitted: false."},"scheme":{"type":"string","enum":["gg18","cggmp"],"description":"The MPC engine: cggmp, or gg18. Omitted: gg18."},"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version the client speaks: 2, or 1 where the tenant is still allowed version 1. Omitted: 1."},"rosterStatement":{"type":"boolean","description":"Ask Aurea's cosigner for its signed roster statement, which the client checks against the cosigner's pinned identity key before it sends anything (relay version 2). Omitted: no statement."},"approvalBinding":{"type":"boolean","description":"The client sends the wallet's approval key inside the key generation (relay version 2): Aurea's cosigner binds it to the wallet, and from then on a signature of the wallet needs that key's approval of the digest (sign/start `approval`). Omitted: no approval key is bound."},"approvalKey":{"type":"object","properties":{"alg":{"type":"string","enum":["webauthn-es256"]},"rpId":{"type":"string","minLength":1,"maxLength":253},"credentialId":{"type":"string","minLength":1,"maxLength":1366,"pattern":"^[A-Za-z0-9_-]+$"},"spki":{"type":"string","pattern":"^[A-Za-z0-9+/]{120,124}={0,2}$"}},"required":["alg","rpId","credentialId","spki"],"additionalProperties":false,"description":"With `approvalBinding`: the public part of the approval key, a passkey (WebAuthn ES256): its relying party id, credential id and P-256 public key (SubjectPublicKeyInfo, base64). Kept with the wallet, so that the owner can confirm sensitive changes (such as naming a successor wallet) with the same passkey."},"preparation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"proof":{"type":"object","properties":{"ts":{"type":"integer"},"sig":{"type":"string","minLength":1,"maxLength":200}},"required":["ts","sig"],"additionalProperties":false}},"required":["id","proof"],"additionalProperties":false,"description":"A ready device preparation of the caller (POST /v1/mpc/preparations) the new wallet is made with, so that it is ready in seconds: `{\"id\", \"proof\": {\"ts\", \"sig\"}}`, where `sig` is the device preparation key's ECDSA P-256 SHA-256 signature (r ‖ s, base64url) over \"aurea-mpc-prep-use/v1\" 0x00 id 0x00 tenantId 0x00 userId 0x00 ts (ids in lower case, ts in Unix seconds, within 5 minutes). cggmp on secp256k1 with relay version 2 only. Used up by this call whatever the key generation's outcome: one preparation makes one wallet. When it cannot be used, the answer is 409 MPC_PREPARATION_UNUSABLE with its `reason` and nothing is used up: start again without it."}},"required":["chain","curve"],"additionalProperties":false,"description":"The wallet to generate. Unknown members are ignored."}}},"required":true,"description":"The wallet to generate. Unknown members are ignored."},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The DKG session the device joins, and the id the wallet will have","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The DKG session the device joins, and the id the wallet will have","properties":{"sessionId":{"type":"string","description":"The relay session: dkg-, sign- or aux- followed by a UUID"},"walletId":{"type":"string","format":"uuid"},"approvalBinding":{"type":"boolean","description":"Only when the request sent `approvalBinding`: whether the cosigner's grant carries it (true: send the approval key inside the DKG; false: it was dropped — relay version 1 — and the key must not be sent)"},"preparation":{"type":"object","description":"Only when the request sent a `preparation`: it is used up by this wallet. Once the key generation ends, Aurea's result names it (`auxComplete`, `preparationId`, `auxDigest`): the device then completes its shares with the prepared aux and needs no aux ceremony.","properties":{"id":{"type":"string","format":"uuid"},"used":{"type":"boolean","enum":[true]}}}}}}}},"400":{"description":"`rosterStatement` without relay version 2 (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"`rosterStatement` without relay version 2 (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The `preparation` sent is not one of the caller's (MPC_PREPARATION_NOT_FOUND): nothing was used up","content":{"application/json":{"schema":{"type":"object","description":"The `preparation` sent is not one of the caller's (MPC_PREPARATION_NOT_FOUND): nothing was used up","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The tenant must use the version 2 relay, or a new wallet's gg18 engine is retired (MPC_GG18_DKG_RETIRED: send scheme cggmp) (`{ error }`); the `preparation` sent cannot be used (MPC_PREPARATION_UNUSABLE with `reason`: consumed, expired, revoked, failed, not_ready, proof, tier, cosigner, v3, mode, scheme, wire): nothing was used up, start again without it","content":{"application/json":{"schema":{"type":"object","description":"The tenant must use the version 2 relay, or a new wallet's gg18 engine is retired (MPC_GG18_DKG_RETIRED: send scheme cggmp) (`{ error }`); the `preparation` sent cannot be used (MPC_PREPARATION_UNUSABLE with `reason`: consumed, expired, revoked, failed, not_ready, proof, tier, cosigner, v3, mode, scheme, wire): nothing was used up, start again without it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many DKG requests (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many DKG requests (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The cosigner is not ready for the tenant's custody tier; or, for a v3 wallet, a cosigner is unavailable (`{ error: party_unavailable, party, next }`, Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"The cosigner is not ready for the tenant's custody tier; or, for a v3 wallet, a cosigner is unavailable (`{ error: party_unavailable, party, next }`, Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets":{"post":{"summary":"Register an MPC wallet after a completed DKG (address-verified)","tags":["mpc"],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"The wallet registered","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet registered","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid","description":"The wallet it is (GET /v1/wallets)"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"curve":{"type":"string","description":"secp256k1 or ed25519"},"scheme":{"type":"string","description":"The MPC engine: gg18 or cggmp"},"address":{"type":"string"},"aureaShareRef":{"type":"string","description":"Where the cosigner keeps the AUREA share (a reference, never the share)"},"devicePresent":{"type":"boolean"},"backupPresent":{"type":"boolean"},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup share was last proven held (a backup proof); null when never. Present once the platform answers the backup fields"},"backupReconfirmDue":{"type":"boolean","description":"Whether to ask for a backup proof: never proven, or proven too long ago. Present once the platform answers the backup fields"}}}}}},"400":{"description":"A chain the Hub does not know","content":{"application/json":{"schema":{"type":"object","description":"A chain the Hub does not know","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The address is not the one AUREA derived in the DKG (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The address is not the one AUREA derived in the DKG (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The DKG session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The DKG session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/sign/start":{"post":{"summary":"Start a threshold signing ceremony for an MPC wallet (DEVICE+AUREA, or BACKUP recovery)","tags":["mpc"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"committee":{"type":"array","items":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]},"minItems":2,"maxItems":2,"description":"The two parties that sign: DEVICE and AUREA (the default), or BACKUP and AUREA (a signature from the backup, after a lost device), which may need the owner's step-up (`stepUpToken` or `password`)."},"msgHashHex":{"type":"string","pattern":"^(0x)?[0-9a-fA-F]+$","description":"The digest to sign, hex (an optional 0x prefix)."},"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version the client speaks: 2, or 1 where the tenant is still allowed version 1. Omitted: 1."},"rosterStatement":{"type":"boolean","description":"Ask Aurea's cosigner for its signed roster statement, which the client checks against the cosigner's pinned identity key before it sends anything (relay version 2). Omitted: no statement."},"intent":{"anyOf":[{"type":"object","properties":{"v":{"type":"integer","enum":[1]},"kind":{"type":"string","enum":["eip1559"]},"chainId":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"tx":{"type":"object","properties":{"nonce":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"value":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"data":{"type":"string","maxLength":131074,"pattern":"^0x([0-9a-fA-F]{2})*$"},"gas":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"maxFeePerGas":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"maxPriorityFeePerGas":{"type":"string","maxLength":78,"pattern":"^(0|[1-9][0-9]*)$"},"accessList":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"storageKeys":{"type":"array","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"maxItems":64}},"required":["address","storageKeys"],"additionalProperties":false},"maxItems":64}},"required":["nonce","value","data","gas","maxFeePerGas","maxPriorityFeePerGas","accessList"],"additionalProperties":false}},"required":["v","kind","chainId","tx"],"additionalProperties":false},{"type":"object","properties":{"v":{"type":"integer","enum":[1]},"kind":{"type":"string","enum":["eip712"]},"typedData":{"type":"object","properties":{"types":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256},"type":{"type":"string","minLength":1,"maxLength":256}},"required":["name","type"],"additionalProperties":false},"maxItems":256},"propertyNames":{"minLength":1,"maxLength":256}},"primaryType":{"type":"string","minLength":1,"maxLength":256},"domain":{"type":"object","additionalProperties":{},"propertyNames":{"maxLength":256}},"message":{"type":"object","additionalProperties":{},"propertyNames":{"maxLength":256}}},"required":["types","primaryType","domain","message"],"additionalProperties":false}},"required":["v","kind","typedData"],"additionalProperties":false},{"type":"object","properties":{"v":{"type":"integer","enum":[1]},"kind":{"type":"string","enum":["eip191"]},"message":{"type":"string","maxLength":131074,"pattern":"^0x([0-9a-fA-F]{2})*$"}},"required":["v","kind","message"],"additionalProperties":false},{"type":"object","properties":{"v":{"type":"integer","enum":[1]},"kind":{"type":"string","enum":["backup_proof"]}},"required":["v","kind"],"additionalProperties":false}],"description":"What the digest signs, decoded (an EIP-1559 transaction, EIP-712 typed data, an EIP-191 message, or a backup proof), by its `kind`: it is checked against the digest before the signature is given."},"approval":{"anyOf":[{"type":"object","properties":{"alg":{"type":"string","enum":["webauthn-es256"]},"credentialId":{"type":"string","minLength":1,"maxLength":1366,"pattern":"^[A-Za-z0-9_-]+$"},"authenticatorData":{"type":"string","minLength":1,"maxLength":2048,"pattern":"^[A-Za-z0-9_-]+$"},"clientDataJSON":{"type":"string","minLength":1,"maxLength":4096,"pattern":"^[A-Za-z0-9_-]+$"},"signature":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["alg","credentialId","authenticatorData","clientDataJSON","signature"],"additionalProperties":false},{"type":"object","properties":{"alg":{"type":"string","enum":["p256-raw"]},"signature":{"type":"string","minLength":86,"maxLength":86,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["alg","signature"],"additionalProperties":false}],"description":"The wallet approval key's approval of this digest, for a wallet with a bound approval key (dkg/start `approvalBinding`): `{\"alg\":\"webauthn-es256\",\"credentialId\",\"authenticatorData\",\"clientDataJSON\",\"signature\"}` (base64url), or `{\"alg\":\"p256-raw\",\"signature\"}` (r ‖ s, base64url), over the challenge SHA-256(\"aurea-mpc-approval/v1\" 0x00 ‖ lp16(walletId) ‖ digest). Aurea's cosigner verifies it."},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"A BACKUP committee, where the owner's step-up is required: the owner's passkey step-up token for this signature."},"password":{"type":"string","minLength":1,"maxLength":1024,"description":"A BACKUP committee, where the owner's step-up is required: the owner's current password, instead of `stepUpToken`."},"presignIds":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,128}$"},"maxItems":16,"description":"A version 3 wallet: the ids of the presignatures the client holds for it (at most 16); the signature may use one of them."},"holdId":{"type":"string","pattern":"^[\\x21-\\x7e]{1,64}$","description":"The retry of a payment the wallet's co-signing policy held: the hold's id."},"riskAcknowledged":{"type":"string","pattern":"^sim_[0-9a-f]{32}$","description":"Where the platform has the transaction risk preview on: the `simulationId` of the preview whose risk the user acknowledged before the passkey (recorded; never required)."}},"required":["msgHashHex"],"additionalProperties":false,"description":"The digest to sign and what it is. Unknown members are ignored."}}},"required":true,"description":"The digest to sign and what it is. Unknown members are ignored."},"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The signing session and the two parties that sign","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The signing session and the two parties that sign","properties":{"sessionId":{"type":"string","description":"The relay session: dkg-, sign- or aux- followed by a UUID"},"committee":{"type":"array","items":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]}},"presignId":{"type":"string","description":"A v3 signature that signs on a presignature: the one its DEVICE sub-parties use in the online round of committeeAttempt 1; absent, the full protocol"},"simulation":{"type":"object","additionalProperties":true,"description":"Where the platform has the transaction risk preview on and the signature carries an EIP-1559 or EIP-712 `intent`: the preview it stands on, as POST /v1/transactions/simulate answers it; absent otherwise"}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, the wallet mode is enforced, the wallet is not the caller's, or a BACKUP committee without a valid step-up where the owner's step-up is required (STEP_UP_REQUIRED, STEP_UP_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, the wallet mode is enforced, the wallet is not the caller's, or a BACKUP committee without a valid step-up where the owner's step-up is required (STEP_UP_REQUIRED, STEP_UP_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The tenant must use the version 2 relay (`{ error }`); a v3 wallet pending its aux (`{ error: wallet_pending_aux, next }`)","content":{"application/json":{"schema":{"type":"object","description":"The tenant must use the version 2 relay (`{ error }`); a v3 wallet pending its aux (`{ error: wallet_pending_aux, next }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid, or the intent does not stand for msgHashHex (MPC_INTENT_MISMATCH)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the intent does not stand for msgHashHex (MPC_INTENT_MISMATCH)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many signing requests, or a recovery within its cooldown (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many signing requests, or a recovery within its cooldown (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"A v3 wallet with fewer than two cosigners available (`{ error: party_unavailable, next, alternatives }`)","content":{"application/json":{"schema":{"type":"object","description":"A v3 wallet with fewer than two cosigners available (`{ error: party_unavailable, next, alternatives }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/aux/start":{"post":{"summary":"Start the CGGMP auxiliary-info ceremony for an MPC wallet","tags":["mpc"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version the client speaks: 2, or 1 where the tenant is still allowed version 1. Omitted: 1."},"rosterStatement":{"type":"boolean","description":"Ask Aurea's cosigner for its signed roster statement, which the client checks against the cosigner's pinned identity key before it sends anything (relay version 2). Omitted: no statement."},"auxRecovery":{"type":"boolean","description":"The aux of a wallet whose device was lost before its first signature, run by the client restored from the backup. Only where the tenant has it switched on (otherwise 403 MPC_AUX_RECOVERY_OFF); refused for a wallet that cannot run one (409 MPC_AUX_RECOVERY_REFUSED)."}},"additionalProperties":false,"description":"The auxiliary-info ceremony's options; the body may be empty. Unknown members are ignored."}}},"description":"The auxiliary-info ceremony's options; the body may be empty. Unknown members are ignored."},"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The auxiliary-info session","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The auxiliary-info session","properties":{"sessionId":{"type":"string","description":"The relay session: dkg-, sign- or aux- followed by a UUID"}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's; or a recovery aux (`auxRecovery`) is not switched on for the tenant (MPC_AUX_RECOVERY_OFF)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's; or a recovery aux (`auxRecovery`) is not switched on for the tenant (MPC_AUX_RECOVERY_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"A GG18 wallet has no aux ceremony, or the tenant must use the version 2 relay, or a v3 wallet's aux is complete — it has signed (`{ error }`); or a recovery aux for a wallet that cannot run one (MPC_AUX_RECOVERY_REFUSED: it signed, no backup, a v3 wallet, relay version 1, the tenant's own co-signer)","content":{"application/json":{"schema":{"type":"object","description":"A GG18 wallet has no aux ceremony, or the tenant must use the version 2 relay, or a v3 wallet's aux is complete — it has signed (`{ error }`); or a recovery aux for a wallet that cannot run one (MPC_AUX_RECOVERY_REFUSED: it signed, no backup, a v3 wallet, relay version 1, the tenant's own co-signer)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many aux requests (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Too many aux requests (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"A v3 wallet's cosigner is unavailable (`{ error: party_unavailable, party, next }`, Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"A v3 wallet's cosigner is unavailable (`{ error: party_unavailable, party, next }`, Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/join":{"post":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"204":{"description":"Done: no body"},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The message or result is too large (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The message or result is too large (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/parties":{"get":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The party roster: `ready: false` with no parties until every expected party joined, then frozen with the session's wire version","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The party roster: `ready: false` with no parties until every expected party joined, then frozen with the session's wire version","properties":{"ready":{"type":"boolean"},"wireVersion":{"type":"integer","description":"The relay version negotiated for the session (1 or 2)"},"parties":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"moniker":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]},"key":{"type":"string","description":"The party's key, a decimal big integer"},"kemPub":{"type":"string","description":"Version 2: the party's per-session X25519 public key (base64)"},"sigPub":{"type":"string","description":"Version 2: the party's per-session Ed25519 public key (base64)"}}}}}}}}},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/msg":{"post":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"204":{"description":"Done: no body"},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The message or result is too large (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The message or result is too large (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/inbox":{"get":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"parameters":[{"schema":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]},"in":"query","name":"moniker","required":true,"description":"Whose inbox: the caller's own party. Checked by the handler (422 when missing or not one of these), not by the route"},{"schema":{"type":"string","pattern":"^(0|[1-9][0-9]{0,14})$"},"in":"query","name":"ack","required":false,"description":"Acknowledged reads (available on request; ignored while they are off): the cursor of the last envelope the client processed, 0 for none. The envelopes up to it are erased and the later ones returned, not erased, each with its `cursor`. Checked by the handler (422 when not a whole number of at most 15 digits), not by the route"},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The messages waiting for this party, in the order they were sent; each is delivered once (the relay erases its bytes on delivery)","content":{"application/json":{"schema":{"description":"The messages waiting for this party, in the order they were sent; each is delivered once (the relay erases its bytes on delivery)","type":"array","items":{"type":"object","description":"An envelope as the sender wrote it: version 1 carries from, broadcast and wire; version 2 adds v, to, enc, sig and seq","required":["from","broadcast","wire"],"properties":{"from":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]},"broadcast":{"type":"boolean"},"wire":{"type":"string","description":"The tss message (base64); version 2: the ciphertext"},"v":{"type":"integer","enum":[2]},"to":{"type":"array","items":{"type":"string","enum":["DEVICE","BACKUP","AUREA"]}},"enc":{"type":"string","description":"Version 2: the HPKE key (base64)"},"sig":{"type":"string","description":"Version 2: the sender's signature (base64)"},"seq":{"type":"integer","description":"Version 2: sequence number"},"cursor":{"type":"integer","description":"Acknowledged reads only (an `ack` read while they are on): the envelope's cursor, to send back as `ack` once processed. Without it the envelope was erased on read"}}}}}}},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"No moniker, or not DEVICE, BACKUP or AUREA","content":{"application/json":{"schema":{"type":"object","description":"No moniker, or not DEVICE, BACKUP or AUREA","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/result":{"post":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"204":{"description":"Done: no body"},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session's message limit is reached, or the party's result is already published (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The message or result is too large (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The message or result is too large (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/results":{"get":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The public results published so far, by party (for a DKG the AUREA result carries the address the device's must match; for a signature, the signature). Each result is as its party wrote it","content":{"application/json":{"schema":{"description":"The public results published so far, by party (for a DKG the AUREA result carries the address the device's must match; for a signature, the signature). Each result is as its party wrote it","type":"object","properties":{"DEVICE":{"description":"The DEVICE party's result"},"BACKUP":{"description":"The BACKUP party's result"},"AUREA":{"description":"The AUREA cosigner's result"}},"additionalProperties":true}}}},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/relay/session/{id}/msghash":{"get":{"summary":"MPC relay (device/cosigner ceremony transport — holds no key share)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The digest a signing session signs (null for DKG and aux)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The digest a signing session signs (null for DKG and aux)","properties":{"msgHashHex":{"type":["string","null"]}}}}}},"400":{"description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"A version 2 field on a version 1 session, or the other way round (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor the cosigner's service key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor the cosigner's service key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"Not the caller's session, or a role the caller may not act as (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such session, for the cosigner (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such session, for the cosigner (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The session expired (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The session expired (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/backup-proof/prepare":{"post":{"summary":"Prepare a backup proof: its message, for the user's approval","tags":["mpc"],"description":"A wallet with a bound approval key signs nothing without the user's approval of the digest, a backup proof included. This answers the message a proof will sign, its digest, the intent (`backup_proof`) and a token (valid until `expiresAt`); nothing is written and the cosigner is not asked. The client approves the digest with the wallet's approval key and starts the proof with `prepared` and `approval`. Only where the backup proof's approval is on (otherwise 404 BACKUP_PROOF_PREPARE_OFF: start the proof without it).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version wanted (as at sign/start): 2 for any tenant, 1 only where the tenant may still use it"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The message a backup proof will sign, its digest and intent, and the token to start it with. Check the message as at start (a backup proof of this wallet, its address and curve, not expired; `digest` its hash), approve `digest` with the wallet's approval key, then start the proof with `prepared` and `approval` before `expiresAt`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The message a backup proof will sign, its digest and intent, and the token to start it with. Check the message as at start (a backup proof of this wallet, its address and curve, not expired; `digest` its hash), approve `digest` with the wallet's approval key, then start the proof with `prepared` and `approval` before `expiresAt`.","properties":{"message":{"type":"string","description":"The exact text the proof will sign (as start answers it)"},"digest":{"type":"string","description":"The 32 bytes the shares will sign and the user approves (0x hex)"},"intent":{"type":"object","additionalProperties":true,"description":"What is signed, decoded: `{\"v\":1,\"kind\":\"backup_proof\"}`","properties":{"v":{"type":"integer"},"kind":{"type":"string"}}},"expiresAt":{"type":"string","format":"date-time"},"prepared":{"type":"string","description":"Give it back to start, with `approval`"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND), or the route is off (BACKUP_PROOF_PREPARE_OFF)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND), or the route is off (BACKUP_PROOF_PREPARE_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The tenant must use the version 2 relay (`{ error }`), or the wallet's backup is proven elsewhere (BACKUP_PROOF_TENANT_COSIGNER)","content":{"application/json":{"schema":{"type":"object","description":"The tenant must use the version 2 relay (`{ error }`), or the wallet's backup is proven elsewhere (BACKUP_PROOF_TENANT_COSIGNER)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many backup proofs prepared (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many backup proofs prepared (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/backup-proof/start":{"post":{"summary":"Start a backup proof of an MPC wallet (BACKUP+AUREA)","tags":["mpc"],"description":"The client proves it holds the wallet's backup share: the Hub issues a challenge (valid ten minutes, used once) and a relay session whose parties are BACKUP and AUREA only — the device share cannot take part — and asks the cosigner to join it. The client checks the message, runs the BACKUP side of an ordinary signature of `digest` with the backup share, and completes the proof with the signature. Ask for it after a wallet is created and whenever `backupReconfirmDue` is true.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version wanted (as at sign/start): 2 for any tenant, 1 only where the tenant may still use it"},"prepared":{"description":"Where the backup proof's approval is on: the `prepared` token of POST …/backup-proof/prepare, a string. The proof then signs that message, and the cosigner's grant carries the backup proof intent and `approval`. Send it with `approval`, both or neither."},"approval":{"description":"With `prepared`: the wallet approval key's approval of the prepared digest, an object — `{\"alg\":\"webauthn-es256\",\"credentialId\",\"authenticatorData\",\"clientDataJSON\",\"signature\"}` (base64url) or `{\"alg\":\"p256-raw\",\"signature\"}` — over challenge = SHA-256(\"aurea-mpc-approval/v1\" 0x00 ‖ lp16(walletId) ‖ digest), exactly as at sign/start. The Hub forwards it; the cosigner verifies it."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The challenge and its relay session. Join the session as BACKUP (role key 2) with the wallet's backup share and sign `digest` with the AUREA cosigner, after checking that `message` is a backup proof of this wallet and that `digest` is its hash (EIP-191 on secp256k1, SHA-256 on ed25519); then complete with the signature before `expiresAt`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The challenge and its relay session. Join the session as BACKUP (role key 2) with the wallet's backup share and sign `digest` with the AUREA cosigner, after checking that `message` is a backup proof of this wallet and that `digest` is its hash (EIP-191 on secp256k1, SHA-256 on ed25519); then complete with the signature before `expiresAt`.","properties":{"challengeId":{"type":"string","format":"uuid"},"sessionId":{"type":"string","description":"The relay session: bkp- followed by a UUID (a v3 wallet's: v3bkp-)"},"committee":{"type":"array","items":{"type":"string"},"description":"BACKUP and AUREA; for a v3 wallet BACKUP_A, BACKUP_B and the two cosigners that sign with them"},"committeeAttempt":{"type":"string","description":"A v3 wallet's proof only: 1"},"signers":{"type":"array","items":{"type":"integer"},"description":"A v3 wallet's proof only: the committee's keygen indices, ascending"},"message":{"type":"string","description":"The exact text proven: its purpose, the wallet, its address and curve, the tenant, the user, a challenge, when it was issued and when it expires"},"digest":{"type":"string","description":"The 32 bytes the two shares sign (0x hex)"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The tenant must use the version 2 relay (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"The tenant must use the version 2 relay (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The prepared message expired (BACKUP_PROOF_EXPIRED)","content":{"application/json":{"schema":{"type":"object","description":"The prepared message expired (BACKUP_PROOF_EXPIRED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"`prepared` is not a message prepared for this wallet and user, or `approval` is not an approval, or only one of the two was sent (BACKUP_PROOF_PREPARED_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"`prepared` is not a message prepared for this wallet and user, or `approval` is not an approval, or only one of the two was sent (BACKUP_PROOF_PREPARED_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many backup proofs (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many backup proofs (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/backup-proof/complete":{"post":{"summary":"Complete a backup proof with the ceremony's signature","tags":["mpc"],"description":"The signature the BACKUP+AUREA ceremony of the proof's session produced. It must be the wallet's over the challenge's digest, and the cosigner must have finished that session's signature (the route waits a few seconds for it; then 409 BACKUP_PROOF_PENDING: try again). Then the wallet's backup is recorded (`backupPresent`, `backupConfirmedAt`) and the challenge is used. A wrong or unreadable signature: 422 BACKUP_PROOF_SIGNATURE_WRONG_SIGNER / BACKUP_PROOF_SIGNATURE_MALFORMED with `attemptsLeft`, the fifth 409 BACKUP_PROOF_BURNT; expired 410 BACKUP_PROOF_EXPIRED, used 409 BACKUP_PROOF_USED, a ceremony the cosigner did not finish 409 BACKUP_PROOF_CEREMONY_FAILED (start another).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["challengeId","signature"],"additionalProperties":false,"properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","maxLength":200,"description":"The ceremony's signature of `digest`, 0x hex: on secp256k1 65 bytes (r, s, v) or 64 (r, s); on ed25519 the 64 bytes R||S"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The wallet's backup: proven held (`backupPresent`), when it was last confirmed, and whether the client should prove it again (never confirmed, or confirmed `reconfirmDays` days ago or more). Nothing is refused because of it.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's backup: proven held (`backupPresent`), when it was last confirmed, and whether the client should prove it again (never confirmed, or confirmed `reconfirmDays` days ago or more). Nothing is refused because of it.","properties":{"walletId":{"type":"string","format":"uuid"},"backupPresent":{"type":"boolean"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was last proven; null when never"},"backupReconfirmDue":{"type":"boolean","description":"True when the backup was never proven, or last proven `reconfirmDays` days ago or more: ask the user to prove it (start a backup proof)"},"reconfirmDays":{"type":"integer","description":"After how many days a proof is asked again"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet, or no such proof of it (MPC_WALLET_NOT_FOUND, BACKUP_PROOF_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet, or no such proof of it (MPC_WALLET_NOT_FOUND, BACKUP_PROOF_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Used, burnt, not finished by the cosigner yet, or not finished at all (BACKUP_PROOF_USED, BACKUP_PROOF_BURNT, BACKUP_PROOF_PENDING, BACKUP_PROOF_CEREMONY_FAILED)","content":{"application/json":{"schema":{"type":"object","description":"Used, burnt, not finished by the cosigner yet, or not finished at all (BACKUP_PROOF_USED, BACKUP_PROOF_BURNT, BACKUP_PROOF_PENDING, BACKUP_PROOF_CEREMONY_FAILED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The challenge expired (BACKUP_PROOF_EXPIRED)","content":{"application/json":{"schema":{"type":"object","description":"The challenge expired (BACKUP_PROOF_EXPIRED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"A wrong or unreadable signature (BACKUP_PROOF_SIGNATURE_WRONG_SIGNER, BACKUP_PROOF_SIGNATURE_MALFORMED; `attemptsLeft`)","content":{"application/json":{"schema":{"type":"object","description":"A wrong or unreadable signature (BACKUP_PROOF_SIGNATURE_WRONG_SIGNER, BACKUP_PROOF_SIGNATURE_MALFORMED; `attemptsLeft`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many completions (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many completions (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/backup":{"get":{"summary":"Read an MPC wallet's backup state","tags":["mpc"],"description":"Whether the wallet's backup share was proven held, when, and whether to ask for a proof again (`backupReconfirmDue`). Read it when the wallet is opened.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The wallet's backup: proven held (`backupPresent`), when it was last confirmed, and whether the client should prove it again (never confirmed, or confirmed `reconfirmDays` days ago or more). Nothing is refused because of it.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's backup: proven held (`backupPresent`), when it was last confirmed, and whether the client should prove it again (never confirmed, or confirmed `reconfirmDays` days ago or more). Nothing is refused because of it.","properties":{"walletId":{"type":"string","format":"uuid"},"backupPresent":{"type":"boolean"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was last proven; null when never"},"backupReconfirmDue":{"type":"boolean","description":"True when the backup was never proven, or last proven `reconfirmDays` days ago or more: ask the user to prove it (start a backup proof)"},"reconfirmDays":{"type":"integer","description":"After how many days a proof is asked again"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/recovery":{"get":{"summary":"An MPC wallet's recovery window (owner only)","tags":["mpc"],"description":"Whether the cosigner holds a recovery of this wallet back (a signature with its backup share, once the recovery delay is on): until when, whether it is open, and whether it was cancelled. The owner is told of a new request by email and push.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The wallet's newest recovery window as the cosigner answered it: `none` (never asked), `pending` (held back until `opensAt`), `open` (served until `closesAt`), `closed`, or `cancelled`","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's newest recovery window as the cosigner answered it: `none` (never asked), `pending` (held back until `opensAt`), `open` (served until `closesAt`), `closed`, or `cancelled`","properties":{"walletId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["none","pending","open","closed","cancelled"]},"requestedAt":{"type":["string","null"],"format":"date-time"},"opensAt":{"type":["string","null"],"format":"date-time"},"closesAt":{"type":["string","null"],"format":"date-time"},"cancelledAt":{"type":["string","null"],"format":"date-time"},"notified":{"type":"boolean","description":"Whether the owner was told (email and push)"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot use MPC wallets, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot use MPC wallets, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/recovery/cancel":{"post":{"summary":"Cancel an MPC wallet's recovery (\"this was not me\")","tags":["mpc"],"description":"Stops a recovery the cosigner holds back: with the owner's session (bearer token), or without one with the single-use `token` of the link emailed to the owner. The cosigner keeps the recovery cancelled until a new request after its window.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","description":"The emailed link's token (without a session); 43 base64url characters"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The wallet's newest recovery window as the cosigner answered it: `none` (never asked), `pending` (held back until `opensAt`), `open` (served until `closesAt`), `closed`, or `cancelled`","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's newest recovery window as the cosigner answered it: `none` (never asked), `pending` (held back until `opensAt`), `open` (served until `closesAt`), `closed`, or `cancelled`","properties":{"walletId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["none","pending","open","closed","cancelled"]},"requestedAt":{"type":["string","null"],"format":"date-time"},"opensAt":{"type":["string","null"],"format":"date-time"},"closesAt":{"type":["string","null"],"format":"date-time"},"cancelledAt":{"type":["string","null"],"format":"date-time"},"notified":{"type":"boolean","description":"Whether the owner was told (email and push)"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, or the link's token is not valid (MPC_RECOVERY_CANCEL_TOKEN_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, or the link's token is not valid (MPC_RECOVERY_CANCEL_TOKEN_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet, or no recovery pending at the cosigner (MPC_RECOVERY_NOT_PENDING)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet, or no recovery pending at the cosigner (MPC_RECOVERY_NOT_PENDING)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many cancellations (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many cancellations (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The cosigner did not answer (MPC_COSIGNER_UNAVAILABLE), or does not offer this operation yet (MPC_COSIGNER_OP_UNSUPPORTED: nothing was done; write to help@aureahub.com)","content":{"application/json":{"schema":{"type":"object","description":"The cosigner did not answer (MPC_COSIGNER_UNAVAILABLE), or does not offer this operation yet (MPC_COSIGNER_OP_UNSUPPORTED: nothing was done; write to help@aureahub.com)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/successor":{"post":{"summary":"Name the wallet a legacy MPC wallet may only withdraw to","tags":["mpc"],"description":"Sets, once, the successor of a wallet: another MPC wallet of the same user and tenant, made with `approvalBinding`. The cosigner then lets the wallet sign only movements to it (its withdraw-only rule). Needs the owner's step-up: `stepUpToken` (a passkey step-up of `mpc_wallet.successor` with this `successorWalletId`) or the current `password`. The same successor again: 200; another one: 409.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["successorWalletId"],"additionalProperties":false,"properties":{"successorWalletId":{"type":"string","format":"uuid"},"stepUpToken":{"type":"string","maxLength":200},"password":{"type":"string","maxLength":1024}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"walletId":{"type":"string","format":"uuid"},"successorWalletId":{"type":"string","format":"uuid"},"setAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, or no valid step-up (STEP_UP_REQUIRED, STEP_UP_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, or no valid step-up (STEP_UP_REQUIRED, STEP_UP_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Another successor is set (MPC_SUCCESSOR_CONFLICT)","content":{"application/json":{"schema":{"type":"object","description":"Another successor is set (MPC_SUCCESSOR_CONFLICT)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The successor is not an approval-bound MPC wallet of the same user (MPC_SUCCESSOR_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The successor is not an approval-bound MPC wallet of the same user (MPC_SUCCESSOR_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many requests (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many requests (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The cosigner did not answer (MPC_COSIGNER_UNAVAILABLE), or does not offer this operation yet (MPC_COSIGNER_OP_UNSUPPORTED: nothing was done; write to help@aureahub.com)","content":{"application/json":{"schema":{"type":"object","description":"The cosigner did not answer (MPC_COSIGNER_UNAVAILABLE), or does not offer this operation yet (MPC_COSIGNER_OP_UNSUPPORTED: nothing was done; write to help@aureahub.com)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/step-up/options":{"post":{"summary":"A passkey step-up's options for an MPC wallet action","tags":["mpc"],"description":"The options for `navigator.credentials.get({ publicKey })` bound to `mpc_wallet.recovery_sign` (a signature with the backup share) or `mpc_wallet.successor` (with its `successorWalletId`) on this wallet; answer them at POST /v1/mpc/step-up. For the roles that hold passkeys; an end user confirms with the current password instead.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ceremonyId":{"type":"string","format":"uuid"},"action":{"type":"string","enum":["mpc_wallet.recovery_sign","mpc_wallet.successor"]},"expiresAt":{"type":"string","format":"date-time"},"publicKey":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot use MPC wallets, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot use MPC wallets, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"No passkey to confirm with (STEP_UP_NO_PASSKEY)","content":{"application/json":{"schema":{"type":"object","description":"No passkey to confirm with (STEP_UP_NO_PASSKEY)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/step-up":{"post":{"summary":"Confirm an MPC wallet action with a passkey","tags":["mpc"],"description":"The assertion that answers POST /v1/mpc/wallets/{walletId}/step-up/options: answers `stepUpToken` (two minutes, used once) for that action on that wallet.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"stepUpToken":{"type":"string"},"action":{"type":"string","enum":["mpc_wallet.recovery_sign","mpc_wallet.successor"]},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The assertion did not verify (STEP_UP_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The assertion did not verify (STEP_UP_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/setup":{"get":{"summary":"List the caller's MPC wallets with their setup","tags":["mpc"],"description":"Every MPC wallet of the caller (newest first, retired ones included) with its setup's state and next step. After a reload, a client resumes the newest one whose state is not active: never a second DKG.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An MPC wallet's setup: one state for every client — pending (registered after its DKG; a CGGMP wallet still needs its aux ceremony) → aux_running → ready_for_backup (signing-ready: keep the backup) → backup_confirmed (proven, or reported) → active (reported complete); retired: a pending wallet given up, its balance read zero (its shares are kept at least until `sharesKeptUntil`). `nextStep` says what the client does next.","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"]},"nextStep":{"type":"string","enum":["start_aux","wait_for_aux","confirm_backup","activate","none","create_wallet"],"description":"start_aux: run the aux ceremony (POST …/aux/start) on this same wallet; wait_for_aux: one is running; confirm_backup: keep the backup, then report it (or prove it); activate: report the setup complete; none: done; create_wallet: this wallet is retired, make a new one"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was confirmed: its proof, else the client's report"},"backupConfirmedBy":{"type":["string","null"],"enum":["proof","client_report",null]},"canReceive":{"type":"boolean","description":"The wallet may be bound for receiving (an account's deposits, a payment): registered, not retired, its backup confirmed, and its aux done — or, where receiving before the aux is switched on (a backup made before the aux is recoverable), without the aux."},"canSpend":{"type":"boolean","description":"The wallet may sign: it can receive and its aux is done (a gg18 wallet from its DKG on)."},"steps":{"type":"object","additionalProperties":true,"properties":{"dkgStartedAt":{"type":["string","null"],"format":"date-time"},"registeredAt":{"type":"string","format":"date-time"},"auxStartedAt":{"type":["string","null"],"format":"date-time"},"auxCompletedAt":{"type":["string","null"],"format":"date-time"},"backupProvenAt":{"type":["string","null"],"format":"date-time"},"backupReportedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"retiredAt":{"type":["string","null"],"format":"date-time"}}},"retiredReason":{"type":["string","null"],"enum":["restart","orphan",null]},"sharesKeptUntil":{"type":["string","null"],"format":"date-time"}}}}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/setup":{"get":{"summary":"Read an MPC wallet's setup","tags":["mpc"],"description":"The setup's state (pending, aux_running, ready_for_backup, backup_confirmed, active, retired), its next step and when each step happened.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"An MPC wallet's setup: one state for every client — pending (registered after its DKG; a CGGMP wallet still needs its aux ceremony) → aux_running → ready_for_backup (signing-ready: keep the backup) → backup_confirmed (proven, or reported) → active (reported complete); retired: a pending wallet given up, its balance read zero (its shares are kept at least until `sharesKeptUntil`). `nextStep` says what the client does next.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An MPC wallet's setup: one state for every client — pending (registered after its DKG; a CGGMP wallet still needs its aux ceremony) → aux_running → ready_for_backup (signing-ready: keep the backup) → backup_confirmed (proven, or reported) → active (reported complete); retired: a pending wallet given up, its balance read zero (its shares are kept at least until `sharesKeptUntil`). `nextStep` says what the client does next.","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"]},"nextStep":{"type":"string","enum":["start_aux","wait_for_aux","confirm_backup","activate","none","create_wallet"],"description":"start_aux: run the aux ceremony (POST …/aux/start) on this same wallet; wait_for_aux: one is running; confirm_backup: keep the backup, then report it (or prove it); activate: report the setup complete; none: done; create_wallet: this wallet is retired, make a new one"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was confirmed: its proof, else the client's report"},"backupConfirmedBy":{"type":["string","null"],"enum":["proof","client_report",null]},"canReceive":{"type":"boolean","description":"The wallet may be bound for receiving (an account's deposits, a payment): registered, not retired, its backup confirmed, and its aux done — or, where receiving before the aux is switched on (a backup made before the aux is recoverable), without the aux."},"canSpend":{"type":"boolean","description":"The wallet may sign: it can receive and its aux is done (a gg18 wallet from its DKG on)."},"steps":{"type":"object","additionalProperties":true,"properties":{"dkgStartedAt":{"type":["string","null"],"format":"date-time"},"registeredAt":{"type":"string","format":"date-time"},"auxStartedAt":{"type":["string","null"],"format":"date-time"},"auxCompletedAt":{"type":["string","null"],"format":"date-time"},"backupProvenAt":{"type":["string","null"],"format":"date-time"},"backupReportedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"retiredAt":{"type":["string","null"],"format":"date-time"}}},"retiredReason":{"type":["string","null"],"enum":["restart","orphan",null]},"sharesKeptUntil":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Report a step of an MPC wallet's setup","tags":["mpc"],"description":"The client tells the Hub what it did: its aux ceremony finished, the user kept the backup, the setup is complete. Forward only and idempotent. For a wallet set up before this route existed, a backfill sends each step with `at` (when it happened) — first with `dryRun` true, which writes nothing and answers `wouldSet`. A retired wallet takes none (409 MPC_WALLET_SETUP_STEP_REFUSED), nor `active` before the aux and the backup.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["step"],"additionalProperties":false,"properties":{"step":{"type":"string","enum":["aux_completed","backup_confirmed","active"],"description":"aux_completed: the client's aux ceremony finished; backup_confirmed: the user kept the backup (also records the aux, a backup being kept only of a signing-ready wallet); active: the setup is complete (needs the aux done and the backup confirmed)"},"at":{"type":"string","format":"date-time","description":"When it happened in the client, for a backfill of a wallet set up before; within the wallet's life. Omitted: now"},"dryRun":{"type":"boolean","description":"True: answer what the report would set (`wouldSet`) and write nothing — a backfill's first pass"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The wallet's setup after the report. Forward only and idempotent: a step already reached changes nothing (`changed` false).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's setup after the report. Forward only and idempotent: a step already reached changes nothing (`changed` false).","properties":{"setup":{"type":"object","additionalProperties":true,"description":"An MPC wallet's setup: one state for every client — pending (registered after its DKG; a CGGMP wallet still needs its aux ceremony) → aux_running → ready_for_backup (signing-ready: keep the backup) → backup_confirmed (proven, or reported) → active (reported complete); retired: a pending wallet given up, its balance read zero (its shares are kept at least until `sharesKeptUntil`). `nextStep` says what the client does next.","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"]},"nextStep":{"type":"string","enum":["start_aux","wait_for_aux","confirm_backup","activate","none","create_wallet"],"description":"start_aux: run the aux ceremony (POST …/aux/start) on this same wallet; wait_for_aux: one is running; confirm_backup: keep the backup, then report it (or prove it); activate: report the setup complete; none: done; create_wallet: this wallet is retired, make a new one"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was confirmed: its proof, else the client's report"},"backupConfirmedBy":{"type":["string","null"],"enum":["proof","client_report",null]},"canReceive":{"type":"boolean","description":"The wallet may be bound for receiving (an account's deposits, a payment): registered, not retired, its backup confirmed, and its aux done — or, where receiving before the aux is switched on (a backup made before the aux is recoverable), without the aux."},"canSpend":{"type":"boolean","description":"The wallet may sign: it can receive and its aux is done (a gg18 wallet from its DKG on)."},"steps":{"type":"object","additionalProperties":true,"properties":{"dkgStartedAt":{"type":["string","null"],"format":"date-time"},"registeredAt":{"type":"string","format":"date-time"},"auxStartedAt":{"type":["string","null"],"format":"date-time"},"auxCompletedAt":{"type":["string","null"],"format":"date-time"},"backupProvenAt":{"type":["string","null"],"format":"date-time"},"backupReportedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"retiredAt":{"type":["string","null"],"format":"date-time"}}},"retiredReason":{"type":["string","null"],"enum":["restart","orphan",null]},"sharesKeptUntil":{"type":["string","null"],"format":"date-time"}}},"changed":{"type":"boolean"},"dryRun":{"type":"boolean"},"wouldSet":{"type":"array","items":{"type":"string","enum":["auxCompletedAt","backupReportedAt","activatedAt"]}}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or the wallet is not the caller's (MPC_WALLET_NOT_OWNED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The step cannot be taken now (MPC_WALLET_SETUP_STEP_REFUSED, with `reason` and `nextStep`)","content":{"application/json":{"schema":{"type":"object","description":"The step cannot be taken now (MPC_WALLET_SETUP_STEP_REFUSED, with `reason` and `nextStep`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"`at` is outside the wallet's life (MPC_WALLET_SETUP_REPORT_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"`at` is outside the wallet's life (MPC_WALLET_SETUP_REPORT_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many reports (Retry-After)","content":{"application/json":{"schema":{"type":"object","description":"Too many reports (Retry-After)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/restart":{"post":{"summary":"Start an MPC wallet's setup again (retire the pending wallet)","tags":["mpc"],"description":"For a user whose device no longer holds the wallet's device share (another browser, data cleared): the pending wallet — its setup not complete and its backup not confirmed — is retired after its balance is read as zero on every chain, and a new DKG can make another. Nothing is deleted. Three restarts a day by default (MPC_WALLET_RESTARTS_PER_DAY); past them the answer names help@aureahub.com. Answered while the tenant's one-pending-wallet rule is in log or enforce (otherwise 403 MPC_WALLET_SETUP_RULES_OFF).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The pending wallet is retired (never deleted): start a new DKG (POST /v1/mpc/wallets/dkg/start).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The pending wallet is retired (never deleted): start a new DKG (POST /v1/mpc/wallets/dkg/start).","properties":{"setup":{"type":"object","additionalProperties":true,"description":"An MPC wallet's setup: one state for every client — pending (registered after its DKG; a CGGMP wallet still needs its aux ceremony) → aux_running → ready_for_backup (signing-ready: keep the backup) → backup_confirmed (proven, or reported) → active (reported complete); retired: a pending wallet given up, its balance read zero (its shares are kept at least until `sharesKeptUntil`). `nextStep` says what the client does next.","properties":{"walletId":{"type":"string","format":"uuid"},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"curve":{"type":"string","enum":["secp256k1","ed25519"]},"scheme":{"type":"string","enum":["gg18","cggmp"]},"state":{"type":"string","enum":["pending","aux_running","ready_for_backup","backup_confirmed","active","retired"]},"nextStep":{"type":"string","enum":["start_aux","wait_for_aux","confirm_backup","activate","none","create_wallet"],"description":"start_aux: run the aux ceremony (POST …/aux/start) on this same wallet; wait_for_aux: one is running; confirm_backup: keep the backup, then report it (or prove it); activate: report the setup complete; none: done; create_wallet: this wallet is retired, make a new one"},"backupConfirmedAt":{"type":["string","null"],"format":"date-time","description":"When the backup was confirmed: its proof, else the client's report"},"backupConfirmedBy":{"type":["string","null"],"enum":["proof","client_report",null]},"canReceive":{"type":"boolean","description":"The wallet may be bound for receiving (an account's deposits, a payment): registered, not retired, its backup confirmed, and its aux done — or, where receiving before the aux is switched on (a backup made before the aux is recoverable), without the aux."},"canSpend":{"type":"boolean","description":"The wallet may sign: it can receive and its aux is done (a gg18 wallet from its DKG on)."},"steps":{"type":"object","additionalProperties":true,"properties":{"dkgStartedAt":{"type":["string","null"],"format":"date-time"},"registeredAt":{"type":"string","format":"date-time"},"auxStartedAt":{"type":["string","null"],"format":"date-time"},"auxCompletedAt":{"type":["string","null"],"format":"date-time"},"backupProvenAt":{"type":["string","null"],"format":"date-time"},"backupReportedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"retiredAt":{"type":["string","null"],"format":"date-time"}}},"retiredReason":{"type":["string","null"],"enum":["restart","orphan",null]},"sharesKeptUntil":{"type":["string","null"],"format":"date-time"}}},"restartsLeft":{"type":"integer","description":"How many more restarts the user has in the last 24 hours"}}}}}},"400":{"description":"The wallet id is not a UUID, or the body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID, or the body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, the wallet is not the caller's (MPC_WALLET_NOT_OWNED), or restarting is not switched on for the tenant (MPC_WALLET_SETUP_RULES_OFF)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, the wallet is not the caller's (MPC_WALLET_NOT_OWNED), or restarting is not switched on for the tenant (MPC_WALLET_SETUP_RULES_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (MPC_WALLET_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The wallet is not pending (MPC_WALLET_NOT_PENDING) or holds funds (MPC_WALLET_NOT_EMPTY)","content":{"application/json":{"schema":{"type":"object","description":"The wallet is not pending (MPC_WALLET_NOT_PENDING) or holds funds (MPC_WALLET_NOT_EMPTY)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, user or wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, user or wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"The day's restarts are used (MPC_WALLET_RESTART_LIMIT, Retry-After, the support address), or too many requests","content":{"application/json":{"schema":{"type":"object","description":"The day's restarts are used (MPC_WALLET_RESTART_LIMIT, Retry-After, the support address), or too many requests","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The wallet's balance could not be read (MPC_WALLET_BALANCE_UNVERIFIED)","content":{"application/json":{"schema":{"type":"object","description":"The wallet's balance could not be read (MPC_WALLET_BALANCE_UNVERIFIED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/preparations/config":{"get":{"summary":"Whether the tenant's devices prepare MPC wallets in advance","tags":["mpc"],"description":"Read first. `mode` off: the device does not prepare (the wallet is set up as before). A Hub without device preparation answers 404 without `details.code`: read that as off.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Whether the tenant's devices prepare their wallets in advance. off: never (the wallet is set up as before); shadow: they prepare and the wallet is set up as before (measurement only); on: a ready preparation makes the wallet in seconds.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Whether the tenant's devices prepare their wallets in advance. off: never (the wallet is set up as before); shadow: they prepare and the wallet is set up as before (measurement only); on: a ready preparation makes the wallet in seconds.","properties":{"mode":{"type":"string","enum":["off","shadow","on"]},"maxOpen":{"type":"integer","description":"The most open (running or ready) preparations a user has"},"ttlDays":{"type":"integer","description":"How long a preparation lives (days)"}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/preparations":{"post":{"summary":"Prepare a new MPC wallet on this device (in advance)","tags":["mpc"],"description":"Starts a device preparation: the aux ceremony of a future wallet, run now (for example during the identity checks) so that making the wallet later takes seconds. Bound to the user and to the device key; at most `maxOpen` open per user; a preparation makes at most one wallet (dkg/start `preparation`). Where the tenant's mode is shadow, the preparation runs but no wallet uses it.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["deviceKey","clientRef"],"properties":{"scheme":{"type":"string","enum":["cggmp"],"description":"The MPC engine: cggmp (the only one prepared)."},"curve":{"type":"string","enum":["secp256k1"],"description":"secp256k1 (EVM chains; the only curve prepared)."},"wireVersion":{"type":"integer","enum":[1,2],"description":"The relay version: 2, the only one a preparation runs on (a preparation carries key material)."},"rosterStatement":{"type":"boolean","description":"The client waits for Aurea's cosigner's signed roster statement: required (true)."},"deviceKey":{"type":"object","required":["alg","spki"],"properties":{"alg":{"type":"string","enum":["ES256"]},"spki":{"type":"string","maxLength":512,"pattern":"^[A-Za-z0-9+/]+={0,2}$","description":"The device's preparation key, public part: a P-256 SubjectPublicKeyInfo (DER), base64. Its private part never leaves the device (WebCrypto non-extractable, Secure Enclave, StrongBox): it proves the device when the wallet is made."}}},"clientRef":{"type":"string","format":"uuid","description":"A UUID the device makes for this preparation: the same request again with it answers the same preparation (200)."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The same preparation again (the same clientRef).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The same preparation again (the same clientRef).","properties":{"preparationId":{"type":"string","format":"uuid"},"sessionId":{"type":"string"},"state":{"type":"string","enum":["running","ready","consumed","failed","expired","revoked"]},"expiresAt":{"type":"string","format":"date-time"}}}}}},"201":{"description":"The preparation is started: the device joins `sessionId` as DEVICE and BACKUP, runs the aux ceremony with its own primes, keeps the result sealed on the device, then publishes its digest (`{\"auxDigest\": hex}` as DEVICE). It is ready when Aurea's cosigner's digest is the same.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The preparation is started: the device joins `sessionId` as DEVICE and BACKUP, runs the aux ceremony with its own primes, keeps the result sealed on the device, then publishes its digest (`{\"auxDigest\": hex}` as DEVICE). It is ready when Aurea's cosigner's digest is the same.","properties":{"preparationId":{"type":"string","format":"uuid"},"sessionId":{"type":"string"},"state":{"type":"string","enum":["running"]},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, or deviceKey.spki is not a P-256 public key (MPC_PREPARATION_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or deviceKey.spki is not a P-256 public key (MPC_PREPARATION_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or MPC wallets are not enabled for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or MPC wallets are not enabled for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Device preparation is off for the tenant, or not possible here (MPC_PREPARATION_UNAVAILABLE, `reason`: off, tenant_cosigner, wire, scheme); the user has `maxOpen` open preparations (MPC_PREPARATION_LIMIT); the clientRef names another or an ended preparation (MPC_PREPARATION_CONFLICT)","content":{"application/json":{"schema":{"type":"object","description":"Device preparation is off for the tenant, or not possible here (MPC_PREPARATION_UNAVAILABLE, `reason`: off, tenant_cosigner, wire, scheme); the user has `maxOpen` open preparations (MPC_PREPARATION_LIMIT); the clientRef names another or an ended preparation (MPC_PREPARATION_CONFLICT)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"Too many requests (MPC_CEREMONY_THROTTLED)","content":{"application/json":{"schema":{"type":"object","description":"Too many requests (MPC_CEREMONY_THROTTLED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Too many preparations are running on the platform (MPC_PREPARATION_BUSY, Retry-After), or the cosigner is not ready for the tenant's custody tier","content":{"application/json":{"schema":{"type":"object","description":"Too many preparations are running on the platform (MPC_PREPARATION_BUSY, Retry-After), or the cosigner is not ready for the tenant's custody tier","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The caller's device preparations","tags":["mpc"],"description":"The open preparations (running, ready) and the ten newest ended ones, newest first: the device reconciles its own records with them (a record whose preparation ended is deleted; a preparation the device no longer holds is deleted here).","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A device preparation: the heavy part of a new MPC wallet's setup (the aux ceremony), done by this device before the wallet exists. running → ready (both sides agree) → consumed (one wallet made with it); failed, expired, revoked: ended unused. A preparation makes at most one wallet.","properties":{"preparationId":{"type":"string","format":"uuid"},"sessionId":{"type":"string","description":"The preparation's relay session (prep-…): the device runs its two parties there"},"state":{"type":"string","enum":["running","ready","consumed","failed","expired","revoked"]},"createdAt":{"type":"string","format":"date-time"},"readyAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"deviceKeyFp":{"type":"string","description":"SHA-256 of the device key's public part (SubjectPublicKeyInfo), base64url: the device finds its own preparations by it"},"failureReason":{"type":["string","null"],"description":"Why it failed: session_expired (the ceremony stopped), cosigner_refused, digest_mismatch, aurea_result_invalid, device_result_invalid"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet made with it (consumed only)"}}}}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/preparations/{id}":{"get":{"summary":"One of the caller's device preparations","tags":["mpc"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"A device preparation: the heavy part of a new MPC wallet's setup (the aux ceremony), done by this device before the wallet exists. running → ready (both sides agree) → consumed (one wallet made with it); failed, expired, revoked: ended unused. A preparation makes at most one wallet.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A device preparation: the heavy part of a new MPC wallet's setup (the aux ceremony), done by this device before the wallet exists. running → ready (both sides agree) → consumed (one wallet made with it); failed, expired, revoked: ended unused. A preparation makes at most one wallet.","properties":{"preparationId":{"type":"string","format":"uuid"},"sessionId":{"type":"string","description":"The preparation's relay session (prep-…): the device runs its two parties there"},"state":{"type":"string","enum":["running","ready","consumed","failed","expired","revoked"]},"createdAt":{"type":"string","format":"date-time"},"readyAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"deviceKeyFp":{"type":"string","description":"SHA-256 of the device key's public part (SubjectPublicKeyInfo), base64url: the device finds its own preparations by it"},"failureReason":{"type":["string","null"],"description":"Why it failed: session_expired (the ceremony stopped), cosigner_refused, digest_mismatch, aurea_result_invalid, device_result_invalid"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet made with it (consumed only)"}}}}}},"400":{"description":"The id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such preparation of the caller (MPC_PREPARATION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such preparation of the caller (MPC_PREPARATION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Delete one of the caller's device preparations","tags":["mpc"],"description":"An open preparation is revoked (no wallet can use it; Aurea discards its part); an ended one stays as it is. For a device that lost its preparation (its storage was cleared).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Deleted (or already ended)"},"400":{"description":"The id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such preparation of the caller (MPC_PREPARATION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such preparation of the caller (MPC_PREPARATION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/v3":{"get":{"summary":"A v3 MPC wallet's version and setup state (pending_aux or ready)","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The wallet's version and setup state","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's version and setup state","properties":{"walletId":{"type":"string","format":"uuid"},"walletVersion":{"type":"integer","description":"2 (2-of-3) or 3 (weighted 4-of-7)"},"threshold":{"type":"integer"},"parties":{"type":"integer"},"state":{"type":"string","description":"ready, or pending_aux: the address receives, signing waits for the aux"},"address":{"type":"string"},"aux":{"type":"object","additionalProperties":true,"properties":{"attempts":{"type":"integer"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"retryDue":{"type":"boolean","description":"Pending, no aux running, and none tried in the last 15 minutes: start it again"},"overdue":{"type":"boolean","description":"Pending for 24 hours or more: offer help as well"}}},"next":{"type":["object","null"],"additionalProperties":true,"description":"The client's next step: retry_aux (start the wallet's aux), or wait_until `until` (epoch seconds) after party_unavailable","properties":{"action":{"type":"string"},"until":{"type":"integer"}}},"recovery":{"type":["object","null"],"additionalProperties":true,"description":"Set once a recovery aux completed (the device was replaced): the backup committee signs from then on; null otherwise","properties":{"auxRecoveredAt":{"type":"string","format":"date-time"},"signingFactor":{"type":"string","description":"BACKUP: sign with the backup, not the old device"}}},"alternatives":{"type":"array","description":"Other steps the user may take: backup_exit (sign with the backup instead, explicit only), contact_support (with the address to write to)","items":{"type":"object","additionalProperties":true,"properties":{"action":{"type":"string"},"email":{"type":"string"}}}}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such MPC wallet (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/v3/sessions/{sessionId}":{"get":{"summary":"A v3 MPC ceremony's state: running (with the session to join), done, failed (party_unavailable) or refused","tags":["mpc"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true},{"schema":{"type":"string"},"in":"path","name":"sessionId","required":true}],"responses":{"200":{"description":"A v3 ceremony's state. running: join `currentSessionId` (a signature retried on another cosigner pair has a new session, committee and committeeAttempt 2). failed: party_unavailable, with next and, for a signature, the backup_exit alternative. refused: the cosigner's refusal, never retried","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A v3 ceremony's state. running: join `currentSessionId` (a signature retried on another cosigner pair has a new session, committee and committeeAttempt 2). failed: party_unavailable, with next and, for a signature, the backup_exit alternative. refused: the cosigner's refusal, never retried","properties":{"sessionId":{"type":"string"},"op":{"type":"string","description":"dkg, aux, sign or presign"},"state":{"type":"string","description":"running, done, failed or refused"},"walletId":{"type":"string","format":"uuid"},"currentSessionId":{"type":"string"},"committee":{"type":"array","items":{"type":"string"}},"committeeAttempt":{"type":"string"},"signers":{"type":"array","items":{"type":"integer"}},"presignId":{"type":"string"},"error":{"type":"string"},"party":{"type":"string"},"next":{"type":["object","null"],"additionalProperties":true,"description":"The client's next step: retry_aux (start the wallet's aux), or wait_until `until` (epoch seconds) after party_unavailable","properties":{"action":{"type":"string"},"until":{"type":"integer"}}},"alternatives":{"type":"array","description":"Other steps the user may take: backup_exit (sign with the backup instead, explicit only), contact_support (with the address to write to)","items":{"type":"object","additionalProperties":true,"properties":{"action":{"type":"string"},"email":{"type":"string"}}}},"reason":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","content":{"application/json":{"schema":{"type":"object","description":"The role cannot run MPC ceremonies, or (`{ error }`) the tenant's wallet mode is not mpc and is enforced, or the wallet is not the caller's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such v3 ceremony for this wallet (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No such v3 ceremony for this wallet (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/tenant/mpc-recovery-key":{"put":{"summary":"Register (or replace) the tenant's MPC recovery public key","tags":["mpc"],"description":"Available on request: until Aurea turns the MPC recovery kit on, 404 `{ error }` before anything else. The tenant's quorum covers it (custody.mpc_recovery_key.register): at once while it is off, recorded in log, held (202) in enforce. A key that cannot be registered is answered 400 at once, never held.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["publicKeyPem"],"properties":{"publicKeyPem":{"type":"string","minLength":1,"maxLength":8192,"description":"The RSA public key, PEM (SPKI or PKCS#1), at least 3072 bits"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Registered: the key's id and when","content":{"application/json":{"schema":{"type":"object","required":["kid","registeredAt"],"properties":{"kid":{"type":"string","description":"The key's id: the base64url SHA-256 (no padding) of its SPKI encoding"},"registeredAt":{"type":"string","format":"date-time"}},"description":"Registered: the key's id and when"}}}},"202":{"description":"Held for the tenant's quorum: another administrator approves it","content":{"application/json":{"schema":{"description":"Held for the tenant's quorum: another administrator approves it","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"The key cannot be registered (a private key, not RSA, under 3072 bits, unreadable), or the caller has no tenant (`{ error }`)","content":{"application/json":{"schema":{"description":"The key cannot be registered (a private key, not RSA, under 3072 bits, unreadable), or the caller has no tenant (`{ error }`)"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The caller's role may not change the tenant's configuration","content":{"application/json":{"schema":{"type":"object","description":"The caller's role may not change the tenant's configuration","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off: The MPC recovery kit is not enabled (`{ error }`)","content":{"application/json":{"schema":{"description":"Off: The MPC recovery kit is not enabled (`{ error }`)"}}}},"422":{"description":"No publicKeyPem, or longer than 8192 characters","content":{"application/json":{"schema":{"type":"object","description":"No publicKeyPem, or longer than 8192 characters","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"Read the tenant's MPC recovery key id, and when it was registered","tags":["mpc"],"description":"Available on request: until Aurea turns the MPC recovery kit on, 404 `{ error }` before anything else. Never the key itself.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"The active key","content":{"application/json":{"schema":{"type":"object","required":["kid","registeredAt"],"properties":{"kid":{"type":"string","description":"The key's id: the base64url SHA-256 (no padding) of its SPKI encoding"},"registeredAt":{"type":"string","format":"date-time"}},"description":"The active key"}}}},"400":{"description":"The caller has no tenant (`{ error }`)","content":{"application/json":{"schema":{"description":"The caller has no tenant (`{ error }`)"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"An end user (role user)","content":{"application/json":{"schema":{"type":"object","description":"An end user (role user)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off (The MPC recovery kit is not enabled), or the tenant has registered no recovery key (`{ error }`)","content":{"application/json":{"schema":{"description":"Off (The MPC recovery kit is not enabled), or the tenant has registered no recovery key (`{ error }`)"}}}}}}},"/v1/mpc/wallets/{walletId}/recovery-kit/status":{"get":{"summary":"Read an MPC wallet's recovery kit status: the sealed exports and the last drill","tags":["mpc"],"description":"Available on request: until Aurea turns the MPC recovery kit on, 404 `{ error }` before anything else. The wallet's owner only. Key ids and times, never an envelope, a key or a share.","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The status","content":{"application/json":{"schema":{"type":"object","required":["exports","lastDrillAt"],"properties":{"exports":{"type":"array","description":"Each party's latest sealed export of the wallet's share: the party, the recovery key's id, when it was sealed","items":{"type":"object","required":["party","kid","sealedAt"],"properties":{"party":{"type":"string","enum":["AUREA","C1","C2","C3"]},"kid":{"type":"string","description":"The recovery key's id: the base64url SHA-256 (no padding) of its SPKI encoding"},"sealedAt":{"type":"string","format":"date-time"}}}},"lastDrillAt":{"type":["string","null"],"format":"date-time","description":"When the wallet's recovery was last drilled; null when never"}},"description":"The status"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, or a role that may not use MPC wallets","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, or a role that may not use MPC wallets","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off (The MPC recovery kit is not enabled), or no such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"description":"Off (The MPC recovery kit is not enabled), or no such MPC wallet (`{ error }`)"}}}},"422":{"description":"The wallet id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/recovery-kit/drills":{"post":{"summary":"Record a drill of an MPC wallet's offline recovery kit","tags":["mpc"],"description":"Available on request: until Aurea turns the MPC recovery kit on, 404 `{ error }` before anything else. The wallet's owner records that it ran the offline kit (`check` or `sign`) and what it found. A `match` names the address the kit printed, which must be the wallet's.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["outcome","kind"],"additionalProperties":false,"properties":{"outcome":{"type":"string","enum":["match","no_match"]},"kind":{"type":"string","enum":["check","sign"]},"address":{"type":"string","description":"The address the kit printed (required with a match)"}}}}},"required":true},"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"201":{"description":"Recorded","content":{"application/json":{"schema":{"type":"object","required":["outcome","kind","drilledAt"],"properties":{"outcome":{"type":"string","enum":["match","no_match"]},"kind":{"type":"string","enum":["check","sign"]},"drilledAt":{"type":"string","format":"date-time"}},"description":"Recorded"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, or a role that may not use MPC wallets","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, or a role that may not use MPC wallets","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off (The MPC recovery kit is not enabled), or no such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"description":"Off (The MPC recovery kit is not enabled), or no such MPC wallet (`{ error }`)"}}}},"422":{"description":"The body or the wallet id is not valid, or a match names another address than the wallet's","content":{"application/json":{"schema":{"type":"object","description":"The body or the wallet id is not valid, or a match names another address than the wallet's","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/wallets/{walletId}/protected-accounts":{"get":{"summary":"List an MPC wallet's protected accounts and their recoveries","tags":["mpc"],"description":"Available on request: until Aurea turns protected accounts on, 404 `{ error }` before anything else. The wallet's owner only.","security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"200":{"description":"The wallet's protected accounts","content":{"application/json":{"schema":{"type":"object","required":["accounts"],"properties":{"accounts":{"type":"array","items":{"type":"object","required":["id","chainId","safe","module","fromBlock","watchedBlock","lastRunAt","createdAt","recoveries"],"properties":{"id":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"safe":{"type":"string","description":"The protected account (a smart account the wallet owns), 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"fromBlock":{"type":"integer"},"watchedBlock":{"type":"integer","description":"The last block read for its recoveries"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"recoveries":{"type":"array","description":"Its 20 latest queued recoveries, newest first","items":{"type":"object","required":["queueNonce","state","call","flag","executableAt","expiresAt","transactionHash"],"properties":{"queueNonce":{"type":"string","description":"Its nonce in the module (decimal)"},"state":{"type":"string","enum":["pending","cancelled","executed","expired"]},"call":{"type":"string","enum":["swapOwner","addOwnerWithThreshold","other"],"description":"What it asks of the account (the two recovery calls, or other)"},"flag":{"type":["string","null"],"description":"OWNERSHIP_CHANGE when it is not one of the two recovery calls"},"executableAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"transactionHash":{"type":"string","description":"The chain transaction that queued it"}}}}}}}},"description":"The wallet's protected accounts"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, or a role that may not use MPC wallets","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, or a role that may not use MPC wallets","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off (Protected accounts are not enabled), or no such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"description":"Off (Protected accounts are not enabled), or no such MPC wallet (`{ error }`)"}}}},"422":{"description":"The wallet id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The wallet id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Register an MPC wallet's protected account","tags":["mpc"],"description":"Available on request: until Aurea turns protected accounts on, 404 `{ error }` before anything else. The wallet's owner, with the wallet's own signature (EIP-191, personal_sign) over the registration message, required: the lines `Aurea protected account registration`, `wallet: <walletId>`, `chainId: <chainId>`, `account: <safe>`, `module: <module>`, `fromBlock: <fromBlock>`, `issuedAt: <issuedAt>` (addresses and the wallet id lower case, joined by a line feed), signed within 10 minutes of `issuedAt`. Checked on chain through Aurea's node before anything is stored: the delay module's avatar, target and owner are the account; its cooldown is at least 72 h and its expiration exactly 7 days; it is enabled on the account; the account is owned by this wallet with a threshold of 1; `fromBlock` (the block the module was deployed in) is not past the chain's head. Then its recoveries are watched from `fromBlock`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chainId","safe","module","fromBlock","issuedAt","signature"],"additionalProperties":false,"properties":{"chainId":{"type":"integer","minimum":1},"safe":{"type":"string","description":"The protected account, 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"fromBlock":{"type":"integer","minimum":0},"issuedAt":{"type":"string","format":"date-time","description":"When the message was signed (UTC, Z)"},"signature":{"type":"string","description":"The wallet's EIP-191 signature of the message, 0x + 65 bytes"}}}}},"required":true},"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"in":"path","name":"walletId","required":true}],"responses":{"201":{"description":"Registered","content":{"application/json":{"schema":{"type":"object","required":["id","chainId","safe","module","fromBlock","watchedBlock","lastRunAt","createdAt","recoveries"],"properties":{"id":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"safe":{"type":"string","description":"The protected account (a smart account the wallet owns), 0x hex"},"module":{"type":"string","description":"Its recovery delay module, 0x hex"},"fromBlock":{"type":"integer"},"watchedBlock":{"type":"integer","description":"The last block read for its recoveries"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"recoveries":{"type":"array","description":"Its 20 latest queued recoveries, newest first","items":{"type":"object","required":["queueNonce","state","call","flag","executableAt","expiresAt","transactionHash"],"properties":{"queueNonce":{"type":"string","description":"Its nonce in the module (decimal)"},"state":{"type":"string","enum":["pending","cancelled","executed","expired"]},"call":{"type":"string","enum":["swapOwner","addOwnerWithThreshold","other"],"description":"What it asks of the account (the two recovery calls, or other)"},"flag":{"type":["string","null"],"description":"OWNERSHIP_CHANGE when it is not one of the two recovery calls"},"executableAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"transactionHash":{"type":"string","description":"The chain transaction that queued it"}}}}},"description":"Registered"}}}},"401":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","description":"Not authenticated","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not the wallet's owner, a role that may not use MPC wallets, or the signature is not the wallet's over this registration (PROTECTED_ACCOUNT_SIGNATURE_INVALID) or is older than 10 minutes (PROTECTED_ACCOUNT_SIGNATURE_EXPIRED)","content":{"application/json":{"schema":{"type":"object","description":"Not the wallet's owner, a role that may not use MPC wallets, or the signature is not the wallet's over this registration (PROTECTED_ACCOUNT_SIGNATURE_INVALID) or is older than 10 minutes (PROTECTED_ACCOUNT_SIGNATURE_EXPIRED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Off (Protected accounts are not enabled), or no such MPC wallet (`{ error }`)","content":{"application/json":{"schema":{"description":"Off (Protected accounts are not enabled), or no such MPC wallet (`{ error }`)"}}}},"409":{"description":"This module is already registered on this chain (PROTECTED_ACCOUNT_ALREADY_REGISTERED)","content":{"application/json":{"schema":{"type":"object","description":"This module is already registered on this chain (PROTECTED_ACCOUNT_ALREADY_REGISTERED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body or the wallet id is not valid, the chain is not supported, the wallet is not an EVM wallet, or the account does not pass the on-chain checks (PROTECTED_ACCOUNT_NOT_A_CONTRACT, PROTECTED_ACCOUNT_MODULE_NOT_BOUND, PROTECTED_ACCOUNT_DELAY_TOO_SHORT, PROTECTED_ACCOUNT_EXPIRATION_INVALID, PROTECTED_ACCOUNT_MODULE_NOT_ENABLED, PROTECTED_ACCOUNT_OWNER_MISMATCH, PROTECTED_ACCOUNT_FROM_BLOCK_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The body or the wallet id is not valid, the chain is not supported, the wallet is not an EVM wallet, or the account does not pass the on-chain checks (PROTECTED_ACCOUNT_NOT_A_CONTRACT, PROTECTED_ACCOUNT_MODULE_NOT_BOUND, PROTECTED_ACCOUNT_DELAY_TOO_SHORT, PROTECTED_ACCOUNT_EXPIRATION_INVALID, PROTECTED_ACCOUNT_MODULE_NOT_ENABLED, PROTECTED_ACCOUNT_OWNER_MISMATCH, PROTECTED_ACCOUNT_FROM_BLOCK_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The chain could not be read now (PROTECTED_ACCOUNT_CHAIN_UNAVAILABLE): try again","content":{"application/json":{"schema":{"type":"object","description":"The chain could not be read now (PROTECTED_ACCOUNT_CHAIN_UNAVAILABLE): try again","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/mpc/service/token":{"post":{"summary":"Auth bridge — issue a scoped MPC Hub JWT for a first-party app's merchant","tags":["mpc"],"description":"Lets an authenticated first-party app (e.g. the aurea-pay payment-link product) obtain a short-lived Hub JWT for ONE of its merchants, so that merchant's browser can drive an MPC ceremony through `/v1/mpc/relay/*` + the live AUREA cosigner WITHOUT being a hand-created Hub user. This is the integration entry point for any external client.\n\n**Auth:** the existing tenant-HMAC scheme — send `x-tenant-api-key`, `x-timestamp`, and `x-signature` = HMAC-SHA256(apiSecret, `METHOD\\nPATH\\nTIMESTAMP\\nSHA256(rawBody)`), ±300s window. The call runs under that tenant; the merchant is find-or-created beneath it, keyed deterministically by `externalMerchantId` (same id → same Hub user → same wallet).\n\n**Request body:** `{ externalMerchantId: string }` (≤80 chars); optional `scopes: [\"ramp\"]`: where moving an app's accounts to the Hub is switched on, a scoped token also reaches the bank ramp's user routes (`/v1/ramp/bank/payin/*`, `/v1/ramp/bank/customer/*`).\n\n**Response 200:** `{ accessToken, expiresIn, sub, tenantId }` — a short-lived HS256 JWT `{ sub, tenantId, role:'user' }` accepted unchanged by the relay `authenticate`/`relayAuth` hooks.","responses":{"200":{"description":"A short-lived Hub access token for the merchant's user (found or created)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A short-lived Hub access token for the merchant's user (found or created)","properties":{"accessToken":{"type":"string"},"expiresIn":{"type":"string","description":"How long the token lasts, as configured (for example 15m)"},"sub":{"type":"string","format":"uuid","description":"The merchant's Hub user"},"tenantId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"No externalMerchantId, or one over 80 characters (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No externalMerchantId, or one over 80 characters (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"The tenant signature is missing or wrong","content":{"application/json":{"schema":{"type":"object","description":"The tenant signature is missing or wrong","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/admin/tenants/{id}/mpc-cosigner":{"get":{"summary":"A tenant's own MPC co-signer","tags":["admin"],"description":"Its settings, null when the tenant has none (its wallets are made with Aurea's co-signer); `enabled` says whether the platform has tenant co-signers on. The tenant runs the AUREA party of its MPC wallets itself (Aurea's distributable co-signer, holding the share on its own infrastructure and asking its own callback before each signature). With `mode` on, a new MPC wallet's DKG is sent to the first of `urls` that can be reached (POST `<url>/cosign`, HMAC-signed with the secret answered when it was generated, no user token), and so are that wallet's aux and signatures from then on. The co-signer joins the relay as the AUREA party with a token of `serverCredentialId` in `X-Aurea-Server-Token`, for the tenant's co-signed sessions only.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["tenantId","enabled","cosigner"],"properties":{"tenantId":{"type":"string","format":"uuid"},"enabled":{"type":"boolean"},"cosigner":{"type":["object","null"],"required":["mode","urls","caFingerprints","serverCredentialId","hmacSecretHint","boundWallets","version","createdAt","updatedAt"],"properties":{"mode":{"type":"string","enum":["off","on"],"description":"on: the tenant's new MPC wallets are made with its co-signer; off: with Aurea's. A wallet made with the co-signer always goes to it"},"urls":{"type":"array","items":{"type":"string"},"description":"Its nodes (https): a ceremony goes to the first that can be reached"},"caFingerprints":{"type":"array","items":{"type":"string"},"description":"SHA-256 fingerprints (hex) of the certificates its TLS certificate is pinned to; empty: the system's CAs"},"serverCredentialId":{"type":"string","format":"uuid","description":"The tenant's server credential the co-signer presents to the relay (its role must hold self.mpc.use)"},"hmacSecretHint":{"type":"string","description":"The last four characters of the grants' HMAC secret"},"boundWallets":{"type":"integer","description":"How many of the tenant's MPC wallets were made with it"},"version":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"party":{"type":"string","enum":["C3"],"description":"C3: the co-signer is also the C3 party of the tenant's v3 MPC wallets (weighted 4-of-7). Absent: it co-signs the tenant's v2 wallets only"}}}}}}}}}},"put":{"summary":"Change a tenant's own MPC co-signer","tags":["admin"],"description":"Writes every setting. The grants' HMAC secret is generated on the first save and with `rotateSecret`, and answered then only (`hmacSecret`: the co-signer's COSIGNER_HMAC_SECRET). Switching it on needs the platform to have tenant co-signers on (409 MPC_TENANT_COSIGNERS_DISABLED). An Admin Quorum action. The tenant runs the AUREA party of its MPC wallets itself (Aurea's distributable co-signer, holding the share on its own infrastructure and asking its own callback before each signature). With `mode` on, a new MPC wallet's DKG is sent to the first of `urls` that can be reached (POST `<url>/cosign`, HMAC-signed with the secret answered when it was generated, no user token), and so are that wallet's aux and signatures from then on. The co-signer joins the relay as the AUREA party with a token of `serverCredentialId` in `X-Aurea-Server-Token`, for the tenant's co-signed sessions only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["mode","urls","serverCredentialId"],"additionalProperties":false,"properties":{"mode":{"type":"string","enum":["off","on"]},"urls":{"type":"array","minItems":1,"maxItems":3,"items":{"type":"string","maxLength":2048},"description":"https, a public host (no credentials, query or fragment); one to three nodes"},"caPem":{"type":["string","null"],"maxLength":16384,"description":"PEM certificates its TLS certificate is pinned to (no private key); absent or null: the system's CAs"},"serverCredentialId":{"type":"string","format":"uuid"},"rotateSecret":{"type":"boolean","description":"Generate a new HMAC secret (answered once)"},"party":{"type":["string","null"],"enum":["C3",null],"description":"C3: the co-signer also becomes the C3 party of the tenant's new v3 MPC wallets (a wallet made with it keeps it). Absent or null: the tenant's v2 co-signer only, as before"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["cosigner","created"],"properties":{"cosigner":{"type":"object","required":["mode","urls","caFingerprints","serverCredentialId","hmacSecretHint","boundWallets","version","createdAt","updatedAt"],"properties":{"mode":{"type":"string","enum":["off","on"],"description":"on: the tenant's new MPC wallets are made with its co-signer; off: with Aurea's. A wallet made with the co-signer always goes to it"},"urls":{"type":"array","items":{"type":"string"},"description":"Its nodes (https): a ceremony goes to the first that can be reached"},"caFingerprints":{"type":"array","items":{"type":"string"},"description":"SHA-256 fingerprints (hex) of the certificates its TLS certificate is pinned to; empty: the system's CAs"},"serverCredentialId":{"type":"string","format":"uuid","description":"The tenant's server credential the co-signer presents to the relay (its role must hold self.mpc.use)"},"hmacSecretHint":{"type":"string","description":"The last four characters of the grants' HMAC secret"},"boundWallets":{"type":"integer","description":"How many of the tenant's MPC wallets were made with it"},"version":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"party":{"type":"string","enum":["C3"],"description":"C3: the co-signer is also the C3 party of the tenant's v3 MPC wallets (weighted 4-of-7). Absent: it co-signs the tenant's v2 wallets only"}}},"created":{"type":"boolean"},"hmacSecret":{"type":"string","description":"Only when generated: set it as the co-signer's COSIGNER_HMAC_SECRET; it is never shown again"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["cosigner","created","hmacSecret"],"properties":{"cosigner":{"type":"object","required":["mode","urls","caFingerprints","serverCredentialId","hmacSecretHint","boundWallets","version","createdAt","updatedAt"],"properties":{"mode":{"type":"string","enum":["off","on"],"description":"on: the tenant's new MPC wallets are made with its co-signer; off: with Aurea's. A wallet made with the co-signer always goes to it"},"urls":{"type":"array","items":{"type":"string"},"description":"Its nodes (https): a ceremony goes to the first that can be reached"},"caFingerprints":{"type":"array","items":{"type":"string"},"description":"SHA-256 fingerprints (hex) of the certificates its TLS certificate is pinned to; empty: the system's CAs"},"serverCredentialId":{"type":"string","format":"uuid","description":"The tenant's server credential the co-signer presents to the relay (its role must hold self.mpc.use)"},"hmacSecretHint":{"type":"string","description":"The last four characters of the grants' HMAC secret"},"boundWallets":{"type":"integer","description":"How many of the tenant's MPC wallets were made with it"},"version":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"party":{"type":"string","enum":["C3"],"description":"C3: the co-signer is also the C3 party of the tenant's v3 MPC wallets (weighted 4-of-7). Absent: it co-signs the tenant's v2 wallets only"}}},"created":{"type":"boolean"},"hmacSecret":{"type":"string"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"/v1/transactions/":{"post":{"tags":["transactions"],"description":"Create a new blockchain transaction (send crypto). Supports cross-chain usage: specify the 'chain' parameter to use the same EVM address on different blockchains (e.g., use an Ethereum wallet address to send tokens on Gnosis Chain). For non-custodial wallets, returns requiresClientSigning=true with preparedTxId and txHashToSign. Client must sign and call POST /v1/transactions/:id/broadcast.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","minLength":1},"toAddress":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"toUsername":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$"},"amount":{"type":"string","pattern":"^\\d+$","description":"Transaction amount in smallest unit (wei for 18-decimal tokens). Decimals vary by token: a chain's native token (ETH, MATIC…) typically uses 18 decimals, while stablecoins (USDC, USDT) use 6 decimals. Example: For 18-decimal token, 1 token = 10^18 smallest units."},"tokenAddress":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"gasPrice":{"type":"string","pattern":"^\\d+$"},"gasLimit":{"type":"string","pattern":"^\\d+$"},"gasless":{"type":"boolean","default":false},"travelRule":{"type":"object","description":"Optional Travel Rule data (IVMS101, plan W7.5): the originator and beneficiary of the transfer and their VASPs. Nothing in it is required; what is given is checked against IVMS101 (422 with the path otherwise), stored with the transfer and returned (GET /v1/transactions/{id}/travel-rule). A legal person's LEI is its nationalIdentification of type LEIX.","properties":{"originator":{"type":"object","required":["originatorPersons"],"properties":{"originatorPersons":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","description":"IVMS101 Person: exactly one of naturalPerson and legalPerson","properties":{"naturalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"customerIdentification":{"type":"string","minLength":1,"maxLength":50},"dateAndPlaceOfBirth":{"type":"object","required":["dateOfBirth","placeOfBirth"],"properties":{"dateOfBirth":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"},"placeOfBirth":{"type":"string","minLength":1,"maxLength":70}}},"countryOfResidence":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}},"legalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"description":"Its legal name (LEGL) among them","properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"customerNumber":{"type":"string","minLength":1,"maxLength":50},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"countryOfRegistration":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}}}},"accountNumber":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":100}}}},"beneficiary":{"type":"object","required":["beneficiaryPersons"],"properties":{"beneficiaryPersons":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","description":"IVMS101 Person: exactly one of naturalPerson and legalPerson","properties":{"naturalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"customerIdentification":{"type":"string","minLength":1,"maxLength":50},"dateAndPlaceOfBirth":{"type":"object","required":["dateOfBirth","placeOfBirth"],"properties":{"dateOfBirth":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"},"placeOfBirth":{"type":"string","minLength":1,"maxLength":70}}},"countryOfResidence":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}},"legalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"description":"Its legal name (LEGL) among them","properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"customerNumber":{"type":"string","minLength":1,"maxLength":50},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"countryOfRegistration":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}}}},"accountNumber":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":100}}}},"originatingVasp":{"type":"object","description":"IVMS101 Person: exactly one of naturalPerson and legalPerson","properties":{"naturalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"customerIdentification":{"type":"string","minLength":1,"maxLength":50},"dateAndPlaceOfBirth":{"type":"object","required":["dateOfBirth","placeOfBirth"],"properties":{"dateOfBirth":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"},"placeOfBirth":{"type":"string","minLength":1,"maxLength":70}}},"countryOfResidence":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}},"legalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"description":"Its legal name (LEGL) among them","properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"customerNumber":{"type":"string","minLength":1,"maxLength":50},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"countryOfRegistration":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}}},"beneficiaryVasp":{"type":"object","description":"IVMS101 Person: exactly one of naturalPerson and legalPerson","properties":{"naturalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["primaryIdentifier","nameIdentifierType"],"properties":{"primaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The last name, or the single name"},"secondaryIdentifier":{"type":"string","minLength":1,"maxLength":100,"description":"The first names"},"nameIdentifierType":{"type":"string","enum":["ALIA","BIRT","MAID","LEGL","MISC"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"customerIdentification":{"type":"string","minLength":1,"maxLength":50},"dateAndPlaceOfBirth":{"type":"object","required":["dateOfBirth","placeOfBirth"],"properties":{"dateOfBirth":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$"},"placeOfBirth":{"type":"string","minLength":1,"maxLength":70}}},"countryOfResidence":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}},"legalPerson":{"type":"object","required":["name"],"properties":{"name":{"type":"object","required":["nameIdentifier"],"description":"Its legal name (LEGL) among them","properties":{"nameIdentifier":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"localNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}},"phoneticNameIdentifier":{"type":"array","maxItems":10,"items":{"type":"object","required":["legalPersonName","legalPersonNameIdentifierType"],"properties":{"legalPersonName":{"type":"string","minLength":1,"maxLength":100},"legalPersonNameIdentifierType":{"type":"string","enum":["LEGL","SHRT","TRAD"]}}}}}},"geographicAddress":{"type":"array","maxItems":10,"items":{"type":"object","required":["addressType","country"],"description":"IVMS101 GeographicAddress: its lines (addressLine), or a street and a town","properties":{"addressType":{"type":"string","enum":["HOME","BIZZ","GEOG"]},"department":{"type":"string","minLength":1,"maxLength":50},"subDepartment":{"type":"string","minLength":1,"maxLength":70},"streetName":{"type":"string","minLength":1,"maxLength":70},"buildingNumber":{"type":"string","minLength":1,"maxLength":16},"buildingName":{"type":"string","minLength":1,"maxLength":35},"floor":{"type":"string","minLength":1,"maxLength":70},"postBox":{"type":"string","minLength":1,"maxLength":16},"room":{"type":"string","minLength":1,"maxLength":70},"postcode":{"type":"string","minLength":1,"maxLength":16},"townName":{"type":"string","minLength":1,"maxLength":35},"townLocationName":{"type":"string","minLength":1,"maxLength":35},"districtName":{"type":"string","minLength":1,"maxLength":35},"countrySubDivision":{"type":"string","minLength":1,"maxLength":35},"addressLine":{"type":"array","maxItems":7,"items":{"type":"string","minLength":1,"maxLength":70}},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}},"customerNumber":{"type":"string","minLength":1,"maxLength":50},"nationalIdentification":{"type":"object","required":["nationalIdentifier","nationalIdentifierType"],"description":"IVMS101 NationalIdentification. LEIX: a legal person's LEI, checked by ISO 17442, with no country of issue or registration authority","properties":{"nationalIdentifier":{"type":"string","minLength":1,"maxLength":35},"nationalIdentifierType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"]},"countryOfIssue":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"},"registrationAuthority":{"type":"string","pattern":"^RA[0-9]{6}$"}}},"countryOfRegistration":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2"}}}}}}}},"required":["walletId","amount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Transaction created successfully","content":{"application/json":{"schema":{"description":"Transaction created successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"]},"chain":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"token":{"type":"object","properties":{"address":{"type":["null","string"]},"symbol":{"type":["null","string"]},"name":{"type":["null","string"]},"decimals":{"type":["null","number"]}}},"amount":{"type":"string"},"amountUsd":{"type":["null","string"]},"amountEur":{"type":["null","string"]},"fee":{"type":"object","properties":{"amount":{"type":["null","string"]},"usd":{"type":["null","string"]}}},"gasUsed":{"type":["null","string"]},"gasPrice":{"type":["null","string"]},"blockNumber":{"type":["null","string"]},"blockTimestamp":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"requiresClientSigning":{"type":["boolean","null"]},"gasless":{"type":["boolean","null"]},"preparedTxId":{"type":["string","null"]},"txHashToSign":{"type":["string","null"]},"permitHashToSign":{"type":["string","null"]},"nonce":{"type":["string","null"]},"maxFeePerGas":{"type":["string","null"]},"maxPriorityFeePerGas":{"type":["string","null"]},"chainId":{"type":["number","null"]},"expiresAt":{"type":["string","null"]},"gaslessContract":{"type":["object","null"],"properties":{"version":{"type":"number"},"address":{"type":"string"}}},"deadline":{"type":["number","null"]},"permitIntent":{"type":["object","null"],"description":"EIP-712 typed data to sign: { v: 1, kind: 'eip712', typedData: { types, primaryType, domain, message } }, numbers as decimal strings. Its digest is the hash this answer asks to sign.","properties":{"v":{"type":"number"},"kind":{"type":"string"},"typedData":{"type":"object","additionalProperties":true}}},"authorizationIntent":{"type":["object","null"],"description":"EIP-712 typed data to sign: { v: 1, kind: 'eip712', typedData: { types, primaryType, domain, message } }, numbers as decimal strings. Its digest is the hash this answer asks to sign.","properties":{"v":{"type":"number"},"kind":{"type":"string"},"typedData":{"type":"object","additionalProperties":true}}},"authorizationHashToSign":{"type":["string","null"]},"travelRule":{"type":"object","description":"The Travel Rule data sent with the transfer (IVMS101), as stored; only when the request carried `travelRule`.","properties":{"originator":{"type":"object","additionalProperties":true},"beneficiary":{"type":"object","additionalProperties":true},"originatingVasp":{"type":"object","additionalProperties":true},"beneficiaryVasp":{"type":"object","additionalProperties":true}}}}}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Bad request - validation error","content":{"application/json":{"schema":{"description":"Bad request - validation error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or missing token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found - wallet or recipient not found","content":{"application/json":{"schema":{"description":"Not found - wallet or recipient not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"get":{"tags":["transactions"],"description":"List transactions with pagination and filters. Use isTestnet parameter to switch between mainnet and testnet transactions.","parameters":[{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string"},"in":"query","name":"chain","required":false},{"schema":{"type":"string","enum":["send","receive","swap","noah_payin","noah_payout"]},"in":"query","name":"type","required":false},{"schema":{"type":"string","enum":["pending","confirmed","failed","cancelled"]},"in":"query","name":"status","required":false},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List of transactions","content":{"application/json":{"schema":{"description":"List of transactions","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"]},"chain":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"token":{"type":"object","properties":{"address":{"type":["null","string"]},"symbol":{"type":["null","string"]},"name":{"type":["null","string"]},"decimals":{"type":["null","number"]}}},"amount":{"type":"string"},"amountUsd":{"type":["null","string"]},"amountEur":{"type":["null","string"]},"fee":{"type":"object","properties":{"amount":{"type":["null","string"]},"usd":{"type":["null","string"]}}},"gasUsed":{"type":["null","string"]},"gasPrice":{"type":["null","string"]},"blockNumber":{"type":["null","string"]},"blockTimestamp":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or missing token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/transactions/{id}":{"get":{"tags":["transactions"],"description":"Get transaction by ID","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Transaction details","content":{"application/json":{"schema":{"description":"Transaction details","type":"object","properties":{"id":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"]},"chain":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"token":{"type":"object","properties":{"address":{"type":["null","string"]},"symbol":{"type":["null","string"]},"name":{"type":["null","string"]},"decimals":{"type":["null","number"]}}},"amount":{"type":"string"},"amountUsd":{"type":["null","string"]},"amountEur":{"type":["null","string"]},"fee":{"type":"object","properties":{"amount":{"type":["null","string"]},"usd":{"type":["null","string"]}}},"gasUsed":{"type":["null","string"]},"gasPrice":{"type":["null","string"]},"blockNumber":{"type":["null","string"]},"blockTimestamp":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or missing token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Transaction not found","content":{"application/json":{"schema":{"description":"Transaction not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/transactions/{id}/travel-rule":{"get":{"tags":["transactions"],"description":"The Travel Rule data (IVMS101) one's own transfer was sent with (plan W7.5); 404 TRAVEL_RULE_NOT_FOUND when it carried none.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transactionId","travelRule","createdAt"],"properties":{"transactionId":{"type":"string","format":"uuid"},"travelRule":{"type":"object","description":"The Travel Rule data sent with the transfer (IVMS101), as stored; only when the request carried `travelRule`.","properties":{"originator":{"type":"object","additionalProperties":true},"beneficiary":{"type":"object","additionalProperties":true},"originatingVasp":{"type":"object","additionalProperties":true},"beneficiaryVasp":{"type":"object","additionalProperties":true}}},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"/v1/transactions/{id}/broadcast":{"post":{"tags":["transactions"],"description":"Broadcast a client-signed transaction for non-custodial wallets. For standard sends: accepts {v,r,s} with v=0|1 for the txHashToSign returned by POST /v1/transactions. For gasless sends: accepts {v,r,s} with v=27|28 for the permitHashToSign (EIP-712 permit digest). A preparation replaced by a newer preparation of the same wallet, while it was unsigned, answers 409 PREPARED_TX_SUPERSEDED. One whose operation was cancelled (POST /v1/operations/{id}/cancel) answers 409 OPERATION_CANCELLED, or PREPARED_TX_CANCELLED.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"preparedTxId":{"type":"string","format":"uuid"},"v":{"type":"integer"},"r":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"s":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"}},"required":["preparedTxId","v","r","s"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Transaction broadcast successfully","content":{"application/json":{"schema":{"description":"Transaction broadcast successfully","type":"object","properties":{"id":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"]},"chain":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"token":{"type":"object","properties":{"address":{"type":["null","string"]},"symbol":{"type":["null","string"]},"name":{"type":["null","string"]},"decimals":{"type":["null","number"]}}},"amount":{"type":"string"},"amountUsd":{"type":["null","string"]},"amountEur":{"type":["null","string"]},"fee":{"type":"object","properties":{"amount":{"type":["null","string"]},"usd":{"type":["null","string"]}}},"gasUsed":{"type":["null","string"]},"gasPrice":{"type":["null","string"]},"blockNumber":{"type":["null","string"]},"blockTimestamp":{"type":["null","string"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"/v1/transactions/quote":{"post":{"tags":["transactions"],"description":"Get an estimated fee (in EUR and native token) and estimated arrival time for a blockchain send, before the transaction is submitted. For custodial wallets the fee is always zero (isFree=true). For non-custodial wallets the gas cost is estimated on-chain with a 1.3x buffer on gas limit and 1.5x on gas price.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","minLength":1},"tokenAddress":{"type":"string","default":""},"toAddress":{"type":"string","minLength":1},"amount":{"type":"string","default":"0"},"isTestnet":{"type":"boolean","default":false}},"required":["walletId","chain","toAddress"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Fee quote for the requested send","content":{"application/json":{"schema":{"description":"Fee quote for the requested send","type":"object","properties":{"feeEur":{"type":"number"},"feeNativeAmount":{"type":"string"},"feeNativeSymbol":{"type":"string"},"isFree":{"type":"boolean"},"estimatedArrival":{"type":"string"}},"required":["feeEur","feeNativeAmount","feeNativeSymbol","isFree","estimatedArrival"]}}}},"400":{"description":"Bad request — validation or chain resolution error","content":{"application/json":{"schema":{"description":"Bad request — validation or chain resolution error","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized — invalid or missing token","content":{"application/json":{"schema":{"description":"Unauthorized — invalid or missing token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Wallet not found or not owned by the authenticated user","content":{"application/json":{"schema":{"description":"Wallet not found or not owned by the authenticated user","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/transactions/{id}/status":{"get":{"tags":["transactions"],"description":"Get current transaction status from blockchain","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Transaction status","content":{"application/json":{"schema":{"description":"Transaction status","type":"object","properties":{"id":{"type":"string","format":"uuid"},"txHash":{"type":["string","null"]},"status":{"type":"string"},"confirmations":{"type":"number"},"blockNumber":{"type":["null","string"]},"blockTimestamp":{"type":["null","string"]}}}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"description":"Unauthorized - invalid or missing token","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Transaction not found","content":{"application/json":{"schema":{"description":"Transaction not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/transactions/simulate":{"post":{"summary":"Preview what a wallet is about to sign: expected effects and risk flags","tags":["transactions"],"description":"Decodes and simulates an intent (an EIP-1559 transaction or EIP-712 typed data) of one of the caller's MPC wallets on the platform's own node, and answers its expected asset changes, approvals, ownership changes and risk flags, to show inside the confirmation screen before the passkey. A signature of the same digest within `expiresAt` uses this preview. Exists where the platform has switched the transaction risk preview on; otherwise answers 404 as a route that does not exist.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["walletId","intent"],"properties":{"walletId":{"type":"string","format":"uuid"},"intent":{"type":"object","additionalProperties":true,"description":"What is signed, decoded (the sign/start `intent`): `{ v: 1, kind: \"eip1559\", chainId, tx }` or `{ v: 1, kind: \"eip712\", typedData }`."},"context":{"type":"object","additionalProperties":false,"properties":{"recipientLabel":{"type":"string","maxLength":128}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["simulationId","digest","status","chainId","blockNumber","expiresAt","assetChanges","approvals","ownership","gasUsed","risk","engine"],"properties":{"simulationId":{"type":"string","pattern":"^sim_[0-9a-f]{32}$"},"digest":{"type":"string","pattern":"^0x[0-9a-f]{64}$","description":"The intent's digest as the API computed it: a client shows the preview only when it equals its own."},"status":{"type":"string","enum":["ok","reverted","unsupported","unavailable"]},"chainId":{"type":"string"},"blockNumber":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time","description":"Until when a signature of this digest uses this preview (120 s)."},"assetChanges":{"type":"array","items":{"type":"object","required":["owner","asset","symbol","decimals","delta"],"properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"asset":{"type":"string","description":"\"native\" or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["string","null"]},"delta":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)$","description":"Smallest units; negative: out"}}}},"approvals":{"type":"array","items":{"type":"object","required":["asset","spender","amount","unlimited","deadline"],"properties":{"asset":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","description":"Smallest units, or \"all\" for an operator approval"},"unlimited":{"type":"boolean"},"deadline":{"type":["string","null"],"pattern":"^-?(0|[1-9][0-9]*)$"}}}},"ownership":{"type":"array","items":{"type":"object","required":["contract","change","subject"],"properties":{"contract":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"change":{"type":"string","enum":["add_owner","remove_owner","swap_owner","threshold","transfer_ownership"]},"subject":{"type":"string"}}}},"gasUsed":{"type":["string","null"],"pattern":"^-?(0|[1-9][0-9]*)$"},"risk":{"type":"object","required":["level","flags"],"properties":{"level":{"type":"string","enum":["none","low","medium","high"]},"flags":{"type":"array","items":{"type":"object","required":["code","severity","detail"],"properties":{"code":{"type":"string","enum":["UNLIMITED_APPROVAL","SET_APPROVAL_FOR_ALL","APPROVAL_TO_EOA","PERMIT_LONG_DEADLINE","OWNERSHIP_CHANGE","DELEGATECALL","UNKNOWN_CONTRACT","KNOWN_DRAINER","NEW_RECIPIENT","ADDRESS_LOOKALIKE","ASSET_LOSS_NO_GAIN","REVERT","INTENT_DIVERGES","SIMULATION_UNAVAILABLE"]},"severity":{"type":"string","enum":["low","medium","high"]},"detail":{"type":"string"}}}}}},"engine":{"type":"string","enum":["own-node","second-opinion"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/tokens/":{"get":{"tags":["tokens"],"description":"List all supported tokens across all chains","parameters":[{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Filter for testnet tokens (default: false)"}],"responses":{"200":{"description":"List of all supported tokens","content":{"application/json":{"schema":{"description":"List of all supported tokens","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"tokens":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"name":{"type":"string"},"address":{"type":["null","string"]},"decimals":{"type":"number"},"logoUri":{"type":"string"},"isNative":{"type":"boolean"}}}}}}}}}}}}}}},"/v1/tokens/chain/{chain}":{"get":{"tags":["tokens"],"description":"List supported tokens for a specific blockchain","parameters":[{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Filter for testnet tokens (default: false)"},{"schema":{"type":"string"},"in":"path","name":"chain","required":true}],"responses":{"200":{"description":"List of supported tokens for the chain","content":{"application/json":{"schema":{"description":"List of supported tokens for the chain","type":"object","properties":{"chain":{"type":"string"},"tokens":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"name":{"type":"string"},"address":{"type":["string","null"]},"decimals":{"type":"number"},"logoUri":{"type":["string","null"]},"isNative":{"type":"boolean"},"priceEur":{"type":["number","null"]},"priceUsd":{"type":["number","null"]}}}}}}}}},"400":{"description":"Invalid chain parameter","content":{"application/json":{"schema":{"description":"Invalid chain parameter","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/tokens/meta/chains":{"get":{"tags":["tokens"],"description":"List all supported blockchain networks","parameters":[{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Filter for testnet chains (default: false)"}],"responses":{"200":{"description":"List of supported chains","content":{"application/json":{"schema":{"description":"List of supported chains","type":"object","properties":{"chains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"chainId":{"type":["null","number"]},"nativeToken":{"type":["null","object"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"number"}}}}}}}}}}}}}},"/v1/swap/quote":{"post":{"summary":"Get a swap quote","tags":["swap"],"description":"Request a quote for swapping tokens through Aurea's swap router. Supports both mainnet (default) and testnet operations via the isTestnet parameter. Returns estimated gas costs in user-friendly format (native tokens) if available. Balance validation fields (transactionValueNative, totalCostRequired, sufficientBalance, nativeTokenBalance) help determine if user has sufficient funds. Gas cost fields (estimatedGasCostWei, estimatedGasCostNative, nativeTokenSymbol) are optional and omitted if gas price fetch fails.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"fromChain":{"type":"string","minLength":1},"toChain":{"type":"string","minLength":1},"fromToken":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"toToken":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"fromAmount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"slippage":{"type":"number","minimum":0,"maximum":50},"isTestnet":{"type":"boolean"},"toAddress":{"type":"string"}},"required":["walletId","fromChain","toChain","fromToken","toToken","fromAmount"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"fromChain":{"type":"string"},"toChain":{"type":"string"},"fromToken":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"number"},"name":{"type":"string"}}},"toToken":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"number"},"name":{"type":"string"}}},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"toAmountMin":{"type":"string"},"priceImpact":{"type":["number","null"]},"tool":{"type":"string"},"approvalAddress":{"type":["string","null"]},"needsApproval":{"type":"boolean"},"estimatedGas":{"type":"string","description":"Estimated gas units for the transaction"},"estimatedGasCostWei":{"type":["string","null"],"description":"Estimated gas cost in Wei (smallest unit). Omitted if gas price fetch fails."},"estimatedGasCostNative":{"type":["string","null"],"description":"Estimated gas cost in native tokens (e.g., '0.046386660' MATIC). Omitted if gas price fetch fails."},"nativeTokenSymbol":{"type":["string","null"],"description":"Symbol of the FROM chain's native token (e.g., 'MATIC', 'ETH'). Omitted if gas price fetch fails."},"nativeTokenBalance":{"type":["string","null"],"description":"User's balance of native token on FROM chain (e.g., '2.766'). Omitted if balance fetch fails."},"transactionValueNative":{"type":["string","null"],"description":"Transaction value in native token format (e.g., '2.31' MATIC). For cross-chain swaps, this includes swap amount + destination gas fees + bridge fees. This is the amount that will be deducted from your wallet as the transaction value. Omitted if gas price fetch fails."},"totalCostRequired":{"type":["string","null"],"description":"Total cost required for the swap in native tokens (transactionValueNative + estimatedGasCostNative). This is the total amount you need in your wallet to execute the swap. Omitted if gas price fetch fails."},"sufficientBalance":{"type":["boolean","null"],"description":"Whether the user has sufficient balance to cover the total cost. True if nativeTokenBalance >= totalCostRequired. Omitted if balance unavailable or gas fetch fails."},"executionTime":{"type":"number"},"transactionData":{"type":"object","properties":{"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"gasLimit":{"type":"string"}}},"sourceChainType":{"type":"string","enum":["evm","solana"],"description":"Whether the source chain is EVM or Solana. Determines the execution path on the client."},"isTestnet":{"type":"boolean","description":"Indicates if the quote is for a testnet network."},"fromChainId":{"type":"number","description":"Resolved numeric chain ID for the source network."},"toChainId":{"type":"number","description":"Resolved numeric chain ID for the destination network."},"requiresDestinationSignature":{"type":"boolean","description":"Always false in current responses — routes requiring a second signature on the destination chain are rejected server-side."},"gasless":{"type":["object","null"],"description":"Gasless swap metadata. Present when the swap can be executed via EIP-712 permit (e.g. EUR.e → the chain's native token). Null when gasless is not supported for this route.","properties":{"supported":{"type":"boolean","description":"Whether gasless execution is supported for this quote."},"permitRequired":{"type":"boolean","description":"Whether an EIP-2612 permit signature is required (true when current allowance is insufficient)."},"estimatedGasCost":{"type":"string","description":"Estimated gas cost in the from-chain native token."},"estimatedGasCostXDAI":{"type":"string","description":"Estimated gas cost, in the chain's native token."},"currentNonce":{"type":"number","description":"Current ERC-2612 permit nonce for the wallet."},"permitDomain":{"type":"object","description":"EIP-712 domain parameters used to build the permit signature.","properties":{"name":{"type":"string"},"version":{"type":"string"},"chainId":{"type":"number"},"verifyingContract":{"type":"string"}}}}}}}}}}}}},"/v1/swap/check-allowance":{"post":{"summary":"Check ERC20 token allowance","tags":["swap"],"description":"Check if approval is needed for token swap. Supports both mainnet (default) and testnet operations via the isTestnet parameter.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"tokenAddress":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"spenderAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"chain":{"type":"string","minLength":1},"isTestnet":{"type":"boolean"}},"required":["walletId","tokenAddress","spenderAddress"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"allowance":{"type":"string"},"needsApproval":{"type":"boolean"},"requiredAmount":{"type":"string"}}}}}}}}},"/v1/swap/approve":{"post":{"summary":"Approve ERC20 token for swap","tags":["swap"],"description":"Approve token spending for the swap's execution. Supports both mainnet (default) and testnet operations via the isTestnet parameter. For non-custodial wallets, returns requiresClientSigning=true with preparedTxId and txHashToSign. Client must sign txHashToSign and call POST /v1/swap/broadcast-approve.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"tokenAddress":{"type":"string","pattern":"^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"spenderAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"amount":{"type":"string","pattern":"^\\d+$"},"gasless":{"type":"boolean"},"chain":{"type":"string","minLength":1},"isTestnet":{"type":"boolean"}},"required":["walletId","tokenAddress","spenderAddress"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":["string","null"]},"status":{"type":["string","null"],"enum":["pending","confirmed","failed",null]},"approvedAmount":{"type":["string","null"]},"gasUsed":{"type":["string","null"]},"requiresClientSigning":{"type":["boolean","null"]},"preparedTxId":{"type":["string","null"]},"txHashToSign":{"type":["string","null"]},"chainId":{"type":["number","null"]},"nonce":{"type":["string","null"]},"maxFeePerGas":{"type":["string","null"]},"maxPriorityFeePerGas":{"type":["string","null"]},"expiresAt":{"type":["string","null"]}}}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}}}}},"/v1/swap/execute":{"post":{"summary":"Execute token swap","tags":["swap"],"description":"Execute a token swap from its quote. Supports both mainnet (default) and testnet operations via the isTestnet parameter. For non-custodial wallets, returns requiresClientSigning=true with preparedTxId and txHashToSign. Client must sign txHashToSign and call POST /v1/swap/broadcast.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"quoteId":{"type":"string"},"transactionData":{"type":"object","properties":{"to":{"anyOf":[{"anyOf":[{"not":{}},{"type":"string"}]},{"type":"null"}]},"data":{"type":"string"},"value":{"type":"string"},"gasLimit":{"type":"string"}},"required":["data"],"additionalProperties":false},"gasless":{"type":"boolean"},"chain":{"type":"string","minLength":1},"isTestnet":{"type":"boolean"},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"fromTokenSymbol":{"type":"string"},"toTokenSymbol":{"type":"string"},"fromTokenDecimals":{"type":"integer","minimum":0},"toTokenDecimals":{"type":"integer","minimum":0},"fromTokenAddress":{"type":"string"},"toTokenAddress":{"type":"string"},"quoteExpiry":{"type":"string"}},"required":["walletId","quoteId","transactionData"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transactionId"],"properties":{"transactionId":{"type":"string"},"txHash":{"type":["string","null"]},"status":{"type":"string","enum":["pending","confirmed","failed"]},"fromToken":{"type":"string"},"toToken":{"type":"string"},"fromAmount":{"type":"string"},"expectedToAmount":{"type":"string"},"requiresClientSigning":{"type":["boolean","null"]},"preparedTxId":{"type":["string","null"]},"txHashToSign":{"type":["string","null"]},"nonce":{"type":["string","null"]},"maxFeePerGas":{"type":["string","null"]},"maxPriorityFeePerGas":{"type":["string","null"]},"chainId":{"type":["number","null"]},"expiresAt":{"type":["string","null"]},"messageToSign":{"type":["string","null"],"description":"A client-side wallet's Solana swap, where the tenant offers it: the bytes of the transaction's message, base64, for the wallet to sign (ed25519) and send to POST /v1/swap/broadcast-solana before expiresAt."}}}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}}}}},"/v1/swap/broadcast":{"post":{"summary":"Broadcast client-signed swap transaction","tags":["swap"],"description":"For non-custodial wallets: accepts the {v,r,s} signature produced by the client for the txHashToSign returned by POST /v1/swap/execute. Validates and broadcasts the signed transaction to the network.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transactionId":{"type":"string","format":"uuid"},"preparedTxId":{"type":"string","format":"uuid"},"v":{"type":"integer","minimum":0,"maximum":1},"r":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"s":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"}},"required":["transactionId","preparedTxId","v","r","s"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transactionId"],"properties":{"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string","enum":["pending","confirmed","failed"]},"fromToken":{"type":"string"},"toToken":{"type":"string"},"fromAmount":{"type":"string"},"expectedToAmount":{"type":"string"}}}}}}}}},"/v1/swap/broadcast-solana":{"post":{"summary":"Broadcast a client-signed Solana swap","tags":["swap"],"description":"For a client-side wallet's Solana swap prepared by POST /v1/swap/execute (where the tenant offers it): the wallet's signature of messageToSign. It is checked against the wallet, put in the prepared transaction and sent; the answer is the swap confirmed or failed on chain. 400 for a signature that is not the wallet's, a prepared swap expired or sent already, or a tenant that does not offer it; 422 RPC_ERROR when the Solana node refuses the transaction (its reason in message: nothing was sent).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transactionId":{"type":"string","format":"uuid"},"preparedTxId":{"type":"string","format":"uuid"},"signature":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{64,90}$","description":"The wallet's ed25519 signature of messageToSign, base58."}},"required":["transactionId","preparedTxId","signature"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transactionId"],"properties":{"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string","enum":["pending","confirmed","failed"]}}}}}}}}},"/v1/swap/broadcast-approve":{"post":{"summary":"Broadcast a client-signed ERC-20 approval transaction","tags":["swap"],"description":"For non-custodial wallets: accepts the {v,r,s} signature produced by the client for the txHashToSign returned by POST /v1/swap/approve. Validates and broadcasts the signed approval transaction to the network.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"preparedTxId":{"type":"string","format":"uuid"},"v":{"type":"integer","minimum":0,"maximum":1},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["preparedTxId","v","r","s"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"},"status":{"type":"string","enum":["pending"]}},"required":["txHash","status"]}}}}}}},"/v1/swap/execute-solana":{"post":{"summary":"Execute token swap","tags":["swap"],"description":"Execute a token swap from its quote. Supports both mainnet (default) and testnet operations via the isTestnet parameter. For non-custodial wallets, returns requiresClientSigning=true with preparedTxId and txHashToSign. Client must sign txHashToSign and call POST /v1/swap/broadcast.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"quoteId":{"type":"string"},"transactionData":{"type":"object","properties":{"to":{"anyOf":[{"anyOf":[{"not":{}},{"type":"string"}]},{"type":"null"}]},"data":{"type":"string"},"value":{"type":"string"},"gasLimit":{"type":"string"}},"required":["data"],"additionalProperties":false},"gasless":{"type":"boolean"},"chain":{"type":"string","minLength":1},"isTestnet":{"type":"boolean"},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"fromTokenSymbol":{"type":"string"},"toTokenSymbol":{"type":"string"},"fromTokenDecimals":{"type":"integer","minimum":0},"toTokenDecimals":{"type":"integer","minimum":0},"fromTokenAddress":{"type":"string"},"toTokenAddress":{"type":"string"},"quoteExpiry":{"type":"string"}},"required":["walletId","quoteId","transactionData"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transactionId"],"properties":{"transactionId":{"type":"string"},"txHash":{"type":["string","null"]},"status":{"type":"string","enum":["pending","confirmed","failed"]},"fromToken":{"type":"string"},"toToken":{"type":"string"},"fromAmount":{"type":"string"},"expectedToAmount":{"type":"string"},"requiresClientSigning":{"type":["boolean","null"]},"preparedTxId":{"type":["string","null"]},"txHashToSign":{"type":["string","null"]},"nonce":{"type":["string","null"]},"maxFeePerGas":{"type":["string","null"]},"maxPriorityFeePerGas":{"type":["string","null"]},"chainId":{"type":["number","null"]},"expiresAt":{"type":["string","null"]},"messageToSign":{"type":["string","null"],"description":"A client-side wallet's Solana swap, where the tenant offers it: the bytes of the transaction's message, base64, for the wallet to sign (ed25519) and send to POST /v1/swap/broadcast-solana before expiresAt."}}}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}}}}},"/v1/swap/sign-permit":{"post":{"summary":"Sign EIP-712 Permit for gasless swap","tags":["swap"],"description":"Backend signs an EIP-712 Permit message for EUR.e token approval. Returns signature components for use in execute-gasless. Supports both mainnet (default) and testnet operations via the isTestnet parameter.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"quoteId":{"type":"string"},"spenderAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"amount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"}},"required":["walletId","quoteId","spenderAddress","amount"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"v":{"type":"number"},"r":{"type":"string"},"s":{"type":"string"},"deadline":{"type":"number"},"nonce":{"type":"number"},"permitRequired":{"type":"boolean","description":"Indicates if permit execution is required. False if allowance is already sufficient (dummy signature returned)."}}}}}}}}},"/v1/swap/execute-gasless":{"post":{"summary":"Execute gasless token swap","tags":["swap"],"description":"Execute a gasless token swap using ERC-2612 Permit and backend-sponsored relay. For non-custodial wallets (client_side / client_side_pending), returns requiresClientSigning=true with preparedTxId and txHashToSign. Client must sign and call POST /v1/swap/broadcast-gasless. Supports both mainnet (default) and testnet operations via the isTestnet parameter.","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"quoteId":{"type":"string"},"amount":{"type":"string","pattern":"^\\d+$"},"tokenAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"transactionData":{"type":"object","properties":{"to":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"data":{"type":"string"},"value":{"type":"string"},"gasLimit":{"type":"string"}},"required":["to","data","value","gasLimit"],"additionalProperties":false},"isTestnet":{"type":"boolean"},"fromTokenSymbol":{"type":"string"},"fromTokenDecimals":{"type":"integer","minimum":0},"toAmount":{"type":"string"},"toTokenSymbol":{"type":"string"},"toTokenDecimals":{"type":"integer","minimum":0},"toTokenAddress":{"type":"string"},"signingMode":{"type":"string","enum":["client"]},"permitSignature":{"type":"object","properties":{"v":{"type":"integer","minimum":27,"maximum":28},"r":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"s":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"deadline":{"type":"integer","minimum":0},"nonce":{"type":"integer","minimum":0},"permitRequired":{"type":"boolean"},"preparedPermitId":{"type":"string","format":"uuid"}},"required":["preparedPermitId"],"additionalProperties":false},"metaTxSignature":{"type":"object","properties":{"signature":{"type":"string","pattern":"^0x[a-fA-F0-9]{130}$"},"preparedMetaTxId":{"type":"string"}},"required":["signature","preparedMetaTxId"],"additionalProperties":false}},"required":["walletId","quoteId","amount","tokenAddress","transactionData","signingMode","permitSignature","metaTxSignature"],"additionalProperties":false},{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"quoteId":{"type":"string"},"amount":{"type":"string","pattern":"^\\d+$"},"tokenAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"transactionData":{"type":"object","properties":{"to":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"data":{"type":"string"},"value":{"type":"string"},"gasLimit":{"type":"string"}},"required":["to","data","value","gasLimit"],"additionalProperties":false},"isTestnet":{"type":"boolean"},"fromTokenSymbol":{"type":"string"},"fromTokenDecimals":{"type":"integer","minimum":0},"toAmount":{"type":"string"},"toTokenSymbol":{"type":"string"},"toTokenDecimals":{"type":"integer","minimum":0},"toTokenAddress":{"type":"string"},"signingMode":{"type":"string","enum":["server"]},"permitSignature":{"type":"object","properties":{"v":{"type":"integer","minimum":27,"maximum":28},"r":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"s":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"deadline":{"type":"integer","minimum":0},"nonce":{"type":"integer","minimum":0},"permitRequired":{"type":"boolean"}},"additionalProperties":false}},"required":["walletId","quoteId","amount","tokenAddress","transactionData","permitSignature"],"additionalProperties":false}]}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"transactionId":{"type":["string","null"]},"txHash":{"type":["string","null"]},"status":{"type":["string","null"],"enum":["pending","confirmed","failed",null]},"gasSponsored":{"type":["boolean","null"]},"gasCostWei":{"type":["string","null"]},"gasCostDeducted":{"type":["string","null"]},"netAmountReceived":{"type":["string","null"]},"fromAmount":{"type":["string","null"]},"toAmount":{"type":["string","null"]},"gasUsed":{"type":["string","null"]},"gasPrice":{"type":["string","null"]},"executionMethod":{"type":["string","null"]},"executionMethodNeutral":{"type":"string","enum":["sponsored"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"routingMethod":{"type":["string","null"]},"routingMethodNeutral":{"type":"string","enum":["aggregator"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"requiresClientSigning":{"type":["boolean","null"]},"preparedTxId":{"type":["string","null"]},"txHashToSign":{"type":["string","null"]},"chainId":{"type":["number","null"]},"nonce":{"type":["number","null"]},"maxFeePerGas":{"type":["string","null"]},"maxPriorityFeePerGas":{"type":["string","null"]},"gasLimit":{"type":["string","null"]},"expiresAt":{"type":["string","null"]}}}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}}}}},"/v1/swap/broadcast-gasless":{"post":{"summary":"Broadcast client-signed gasless swap transaction","tags":["swap"],"description":"For non-custodial wallets: accepts the {v,r,s} signature produced by the client for the txHashToSign returned by POST /v1/swap/execute-gasless. Validates and broadcasts the signed swap transaction to the network.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"preparedTxId":{"type":"string","format":"uuid"},"v":{"type":"integer","minimum":0,"maximum":1},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["preparedTxId","v","r","s"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["txHash","status"],"properties":{"txHash":{"type":"string"},"status":{"type":"string","enum":["pending"]},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"gasUsed":{"type":"string"},"gasPrice":{"type":"string"},"executionMethod":{"type":"string"},"executionMethodNeutral":{"type":"string","enum":["sponsored"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"routingMethod":{"type":"string"},"routingMethodNeutral":{"type":"string","enum":["aggregator"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}}},"/v1/swap/simulate":{"post":{"summary":"Simulate a swap (no router call, no on-chain tx)","tags":["swap"],"description":"Creates a confirmed swap DB record without calling the swap router or the blockchain. For testnet development and flow testing only.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"fromChain":{"type":"string"},"toChain":{"type":"string"},"fromToken":{"type":"string"},"toToken":{"type":"string"},"fromAmount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"},"fromTokenSymbol":{"type":"string"},"fromTokenDecimals":{"type":"integer","minimum":0},"toTokenSymbol":{"type":"string"},"toTokenDecimals":{"type":"integer","minimum":0}},"required":["walletId","fromChain","toChain","fromToken","toToken","fromAmount"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"transactionId":{"type":"string"},"quoteId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"simulation":{"type":"boolean"}}}}}}}}},"/v1/swap/routes":{"get":{"tags":["swap-routes"],"description":"Get available destination swap routes for a given source token (public endpoint)","parameters":[{"schema":{"type":"string"},"in":"query","name":"fromChain","required":true,"description":"Source blockchain network"},{"schema":{"type":"string"},"in":"query","name":"fromToken","required":true,"description":"Source token contract address (EVM or Solana)"},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Whether to use testnet routes (default: false)"}],"responses":{"200":{"description":"Available swap routes for the given source token","content":{"application/json":{"schema":{"description":"Available swap routes for the given source token","type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"toChain":{"type":"string"},"toToken":{"type":["object","null"],"properties":{"address":{"type":"string"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"isNative":{"type":"boolean"}},"required":["address","symbol","name","decimals","isNative"]}},"required":["id","toChain","toToken"]}}},"required":["data"]}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"description":"Invalid query parameters","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/ramp/bank/payin/onboarding-status":{"get":{"summary":"Get onboarding status","tags":["bank-ramp-payin"],"description":"Check the KYC and onboarding status of the authenticated user in one of the bank ramp's environments: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted. A user has a separate profile in each environment. Use this to determine if the user needs to complete onboarding or can proceed with deposits. `verification` adds what Aurea keeps from the bank ramp: each region's verification, what the bank ramp asks the customer to do, the agreements and the next step. The statuses never move backwards.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","format":"uuid"},"noahCustomerId":{"type":"string"},"bankRampCustomerId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"onboardingStatus":{"type":"string"},"kycStatus":{"type":"string"},"kycTier":{"type":"string"},"canInitiateDeposit":{"type":"boolean"},"message":{"type":"string"},"verification":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["Pending","Approved","Declined"]},{"type":"null"}],"description":"The bank ramp's overall verification: Approved once one region is approved, Declined is final. It never moves backwards. null before the bank ramp has said anything."},"customerType":{"type":["null","string"],"description":"Individual or Business, once the bank ramp has said which."},"regions":{"type":"array","items":{"type":"object","properties":{"entity":{"type":"string","description":"The bank ramp's legal entity that verifies the customer: Lt, Us or Ca."},"region":{"type":"string","description":"EU for Lt, US for Us, CA for Ca; the bank ramp's entity as it is for any other."},"status":{"type":["null","string"],"description":"Pending, Approved or Declined, for this region only."},"rejection":{"anyOf":[{"type":"string","enum":["retry","final"]},{"type":"null"}],"description":"For a declined region: retry when the customer may try again through a new onboarding session, final when not. null otherwise."}},"required":["entity","region","status","rejection"],"additionalProperties":false},"description":"Each region the bank ramp verifies the customer for, as the bank ramp last reported it."},"actionsRequired":{"type":"array","items":{"type":"string"},"description":"What the bank ramp asks the customer to do before the review continues, for example DocumentReupload, ProofOfAddress, SelfieReupload, HighRiskInfo. Empty when nothing is asked."},"agreements":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}]},"accepted":{"type":"boolean"},"acceptedAt":{"type":["null","string"]}},"required":["name","version","accepted","acceptedAt"],"additionalProperties":false},"description":"The agreements the bank ramp last listed for the customer."},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected"],"description":"start_onboarding: no profile, or the bank ramp has said nothing yet; continue_onboarding: the bank ramp asks for something, a region may retry, or an agreement is not accepted — open a new onboarding session; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: the bank ramp declined the customer for good."}},"required":["status","customerType","regions","actionsRequired","agreements","nextStep"],"additionalProperties":false,"description":"The verification as Aurea keeps it from the bank ramp: it only moves forward, and never includes a reviewer's comment."}},"required":["onboardingStatus","kycStatus","canInitiateDeposit","message","verification"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payin/onboard-session":{"post":{"summary":"Create onboarding session (Recommended)","tags":["bank-ramp-payin"],"description":"Create a hosted onboarding session for customer KYC verification using the bank ramp's Standard Model. Returns a URL for the customer to complete onboarding. Can be called multiple times if user needs to resume. `outcome` says what happened: `session` (open `onboardingUrl` before `expiresAt`: 1 hour, 24 hours for a Business customer; a stored link with more than five minutes left is given again, but only to the same request: another `returnUrl`, `fiatOptions`, `customerType`, `locale` or `metadata` asks the bank ramp for a new session), `approved` (the bank ramp approved the customer and asks for nothing: `alreadyCompleted`), `in_review` (the bank ramp is reviewing and needs nothing now; its Customer webhook reports the result) or `declined` (the bank ramp declined the customer for good: no session). Only `session` has a link. `verification` is the customer's verification after the call, as in onboarding-status. A user keeps one bank ramp customer profile for good: the bank ramp rejects a second KYC application for a person, so the profile's id (`noahCustomerId`) is never replaced. `customerType` (Individual or Business) and `locale` (en, es, fr, de, it, pt) are sent to the bank ramp only when given; a customer type that differs from the one the bank ramp stored answers 409 `NOAH_CUSTOMER_TYPE_MISMATCH` without calling the bank ramp. The return URL must be https (the bank ramp sends the customer back to https only), otherwise 400 `RETURN_URL_NOT_HTTPS`, and one the tenant allows: an https origin the Aurea operator has added. Anything else is refused with 400 and `details.code` `RETURN_URL_NOT_ALLOWED`. A tenant whose list is still empty is not checked. The tenant must have switched the bank ramp's KYC on in the requested environment, otherwise 403 with `details.code` `NOAH_FUNCTION_OFF`, checked before an Idempotency-Key is replayed.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"returnUrl":{"type":"string","format":"uri","minLength":10,"maxLength":1000},"fiatOptions":{"type":"array","items":{"type":"object","properties":{"fiatCurrency":{"type":"string","enum":["EUR","USD","GBP"]}},"required":["fiatCurrency"],"additionalProperties":false},"default":[{"fiatCurrency":"EUR"}]},"metadata":{"type":"object","additionalProperties":{"type":"string"},"maxProperties":10},"isTestnet":{"type":"boolean","default":false},"customerType":{"type":"string","enum":["Individual","Business"],"description":"Individual (the bank ramp's default) or Business. Once the bank ramp has the customer, it keeps the type it stored; asking for another answers 409 NOAH_CUSTOMER_TYPE_MISMATCH."},"locale":{"type":"string","enum":["en","es","fr","de","it","pt"],"description":"The language of the bank ramp's hosted page, which defaults to en."}},"required":["returnUrl"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of creating a second one, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; a key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","format":"uuid"},"noahCustomerId":{"type":"string"},"bankRampCustomerId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"onboardingUrl":{"type":"string"},"expiresAt":{"type":"string"},"alreadyCompleted":{"type":"boolean","default":false},"outcome":{"type":"string","enum":["session","approved","in_review","declined"],"description":"session: open onboardingUrl before expiresAt; approved: the bank ramp approved the customer and nothing is asked (alreadyCompleted); in_review: the bank ramp is reviewing and needs nothing now, its Customer webhook reports the result; declined: the bank ramp declined the customer for good, no session."},"message":{"type":"string"},"verification":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["Pending","Approved","Declined"]},{"type":"null"}],"description":"The bank ramp's overall verification: Approved once one region is approved, Declined is final. It never moves backwards. null before the bank ramp has said anything."},"customerType":{"type":["null","string"],"description":"Individual or Business, once the bank ramp has said which."},"regions":{"type":"array","items":{"type":"object","properties":{"entity":{"type":"string","description":"The bank ramp's legal entity that verifies the customer: Lt, Us or Ca."},"region":{"type":"string","description":"EU for Lt, US for Us, CA for Ca; the bank ramp's entity as it is for any other."},"status":{"type":["null","string"],"description":"Pending, Approved or Declined, for this region only."},"rejection":{"anyOf":[{"type":"string","enum":["retry","final"]},{"type":"null"}],"description":"For a declined region: retry when the customer may try again through a new onboarding session, final when not. null otherwise."}},"required":["entity","region","status","rejection"],"additionalProperties":false},"description":"Each region the bank ramp verifies the customer for, as the bank ramp last reported it."},"actionsRequired":{"type":"array","items":{"type":"string"},"description":"What the bank ramp asks the customer to do before the review continues, for example DocumentReupload, ProofOfAddress, SelfieReupload, HighRiskInfo. Empty when nothing is asked."},"agreements":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}]},"accepted":{"type":"boolean"},"acceptedAt":{"type":["null","string"]}},"required":["name","version","accepted","acceptedAt"],"additionalProperties":false},"description":"The agreements the bank ramp last listed for the customer."},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected"],"description":"start_onboarding: no profile, or the bank ramp has said nothing yet; continue_onboarding: the bank ramp asks for something, a region may retry, or an agreement is not accepted — open a new onboarding session; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: the bank ramp declined the customer for good."}},"required":["status","customerType","regions","actionsRequired","agreements","nextStep"],"additionalProperties":false,"description":"The verification as Aurea keeps it from the bank ramp: it only moves forward, and never includes a reviewer's comment."}},"required":["customerId","noahCustomerId","onboardingUrl","outcome","message","verification"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payin/initiate":{"post":{"summary":"Initiate EUR bank deposit workflow","tags":["bank-ramp-payin"],"description":"Initiate a fiat-to-crypto conversion workflow and receive a virtual account for deposits. fiatCurrency is the account's currency and decides the banking rail the bank ramp uses (EUR is SEPA, USD is ACH/Fedwire, GBP is the local rail); it defaults to EUR, so a caller that does not send it sees no change. A customer whose country is not eligible for that rail is refused by the bank ramp with 403 and details.code NOAH_FORBIDDEN, carrying the bank ramp's denyReasons — its own country-by-rail policy decides it, not Aurea. The cryptoCurrency and network pair must be enabled in the bank ramp's currency registry, otherwise 400 with details.code NOAH_PAIR_UNAVAILABLE and the available pairs. The network decides the bank ramp's environment (for example SolanaDevnet and PolygonTestAmoy are sandbox, Solana is production), and isTestnet, when sent, must agree (400 NOAH_ENVIRONMENT_MISMATCH). The bank ramp's network names are accepted, and Polygon and Sepolia as older names for PolygonPos and EthereumTestSepolia; on a sandbox network an asset code such as EURC means EURC_TEST. The payment method is stored and returned with the bank ramp's names. Requires onboarding completed and KYC approved in that environment. Without destinationAddress, a Solana network delivers to the user's Solana wallet of the same environment; an EVM network requires destinationAddress and a primary EVM wallet. The tenant must have switched the bank ramp's pay-in on in that environment, otherwise 403 with details.code NOAH_FUNCTION_OFF, and offer the pair for pay-in (GET /v1/ramp/bank/currencies), otherwise 400 NOAH_PAIR_UNAVAILABLE naming the pairs it offers; both are checked before an Idempotency-Key is replayed. The pay-in is delivered only where the tenant allows, otherwise 400 NOAH_DESTINATION_NOT_ALLOWED: with the Aurea wallets mode, to one of the user's Aurea wallets — custodial, MPC or registered from the device, an EVM address matching on any EVM chain, never a watch-only import; with the standalone mode, to an address the user proved they own in that environment (POST /v1/ramp/bank/addresses/challenge), and then the user needs no primary EVM wallet. When the tenant set a pay-in business fee in that environment, it is sent to the bank ramp as BusinessFees, for every bank payment method type, and the bank ramp takes it from each deposit. When Aurea holds a change of where an existing virtual account delivers (a request naming another address for a currency the user already has an account in), the request carries the user's step-up token for `bank_ramp.destination_change` in the `x-aurea-step-up` header (otherwise 403 `STEP_UP_REQUIRED` or `STEP_UP_INVALID`); the change then waits a cool-down and the user is told, answered 409 `BANK_RAMP_DESTINATION_CHANGE_PENDING` with `details.effectiveAt`; the same request after that time, with a new step-up token, moves the account. Until then deposits keep arriving at the current address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"cryptoCurrency":{"type":"string","minLength":1,"maxLength":30,"default":"EURC_TEST"},"network":{"type":"string","minLength":1,"maxLength":40,"default":"SolanaDevnet"},"fiatCurrency":{"type":"string","enum":["EUR","USD","GBP"],"default":"EUR"},"isTestnet":{"type":"boolean"},"destinationAddress":{"type":"string","minLength":26,"maxLength":255},"bindOnApproval":{"type":"boolean"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of creating a second one, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; a key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethodId":{"type":"string","format":"uuid"},"noahPaymentMethodId":{"type":"string"},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":"string","description":"The account's primary rail, as the bank ramp names it (BankSepa for EUR)."},"virtualAccountId":{"type":["null","string"],"description":"The bank ramp's VirtualAccountID. null when the bank ramp did not send one in its documented form, or for a payment method stored before Aurea kept it."},"accountHolderName":{"type":"string"},"iban":{"type":"string"},"bic":{"type":"string"},"bankName":{"type":"string"},"bankAddress":{"type":"object","properties":{"street":{"type":"string"},"street2":{"type":["null","string"]},"city":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":["null","string"]},"country":{"type":"string"}},"required":["street","street2","city","postalCode","state","country"],"additionalProperties":false},"reference":{"type":["null","string"],"description":"The bank ramp's Reference for the virtual account, as sent. The bank ramp does not document its use."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."},"relatedPaymentMethods":{"type":"array","items":{"type":"object","properties":{"noahPaymentMethodId":{"type":"string","description":"The bank ramp's id of this rail."},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":["null","string"],"description":"The rail, as the bank ramp names it: BankFedwire, BankSwift and so on."},"accountNumber":{"type":["null","string"],"description":"The account number to pay on this rail."},"bankCode":{"type":["null","string"],"description":"The bank identifier of this rail: ABA routing number for BankAch and BankFedwire, BIC for BankSwift."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."}},"required":["noahPaymentMethodId","paymentMethodType","accountNumber","bankCode","fee"],"additionalProperties":false},"description":"The other rails of the same virtual account (for USD, Fedwire and SWIFT next to ACH), each with its own account details and fee. Empty when the bank ramp sent none."},"fiatCurrency":{"type":"string"},"cryptoCurrency":{"type":"string"},"network":{"type":"string"},"destinationAddress":{"type":"string"},"status":{"type":"string"},"expiresAt":{"type":"string"},"message":{"type":"string"}},"required":["paymentMethodId","noahPaymentMethodId","paymentMethodType","virtualAccountId","accountHolderName","iban","bic","bankName","bankAddress","reference","fee","relatedPaymentMethods","fiatCurrency","cryptoCurrency","network","destinationAddress","status","message"],"additionalProperties":false}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["waiting"],"properties":{"waiting":{"type":"object","description":"An account asked for while the verification is under way: it is opened by itself when the approval arrives and the wallet can receive.","required":["requestId","accountKind","currency","isSandbox","status","attempts","createdAt","nextStep"],"properties":{"requestId":{"type":"string","format":"uuid"},"accountKind":{"type":"string","enum":["bank_payin","remittance_account","bank_iban"]},"currency":{"type":"string"},"isSandbox":{"type":"boolean"},"status":{"type":"string","enum":["waiting","bound","failed","cancelled"]},"attempts":{"type":"integer"},"lastErrorCode":{"type":["string","null"]},"accountId":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"nextStep":{"type":"string","enum":["wait_for_approval","none","ask_again"],"description":"wait_for_approval: nothing to do, the account opens by itself; none: it is open (accountId); ask_again: it was given up (lastErrorCode) or withdrawn — ask for the account again"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payin/initiate-deposit":{"post":{"summary":"Initiate EUR bank deposit workflow","tags":["bank-ramp-payin"],"description":"Initiate a fiat-to-crypto conversion workflow and receive a virtual account for deposits. fiatCurrency is the account's currency and decides the banking rail the bank ramp uses (EUR is SEPA, USD is ACH/Fedwire, GBP is the local rail); it defaults to EUR, so a caller that does not send it sees no change. A customer whose country is not eligible for that rail is refused by the bank ramp with 403 and details.code NOAH_FORBIDDEN, carrying the bank ramp's denyReasons — its own country-by-rail policy decides it, not Aurea. The cryptoCurrency and network pair must be enabled in the bank ramp's currency registry, otherwise 400 with details.code NOAH_PAIR_UNAVAILABLE and the available pairs. The network decides the bank ramp's environment (for example SolanaDevnet and PolygonTestAmoy are sandbox, Solana is production), and isTestnet, when sent, must agree (400 NOAH_ENVIRONMENT_MISMATCH). The bank ramp's network names are accepted, and Polygon and Sepolia as older names for PolygonPos and EthereumTestSepolia; on a sandbox network an asset code such as EURC means EURC_TEST. The payment method is stored and returned with the bank ramp's names. Requires onboarding completed and KYC approved in that environment. Without destinationAddress, a Solana network delivers to the user's Solana wallet of the same environment; an EVM network requires destinationAddress and a primary EVM wallet. The tenant must have switched the bank ramp's pay-in on in that environment, otherwise 403 with details.code NOAH_FUNCTION_OFF, and offer the pair for pay-in (GET /v1/ramp/bank/currencies), otherwise 400 NOAH_PAIR_UNAVAILABLE naming the pairs it offers; both are checked before an Idempotency-Key is replayed. The pay-in is delivered only where the tenant allows, otherwise 400 NOAH_DESTINATION_NOT_ALLOWED: with the Aurea wallets mode, to one of the user's Aurea wallets — custodial, MPC or registered from the device, an EVM address matching on any EVM chain, never a watch-only import; with the standalone mode, to an address the user proved they own in that environment (POST /v1/ramp/bank/addresses/challenge), and then the user needs no primary EVM wallet. When the tenant set a pay-in business fee in that environment, it is sent to the bank ramp as BusinessFees, for every bank payment method type, and the bank ramp takes it from each deposit. When Aurea holds a change of where an existing virtual account delivers (a request naming another address for a currency the user already has an account in), the request carries the user's step-up token for `bank_ramp.destination_change` in the `x-aurea-step-up` header (otherwise 403 `STEP_UP_REQUIRED` or `STEP_UP_INVALID`); the change then waits a cool-down and the user is told, answered 409 `BANK_RAMP_DESTINATION_CHANGE_PENDING` with `details.effectiveAt`; the same request after that time, with a new step-up token, moves the account. Until then deposits keep arriving at the current address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"cryptoCurrency":{"type":"string","minLength":1,"maxLength":30,"default":"EURC_TEST"},"network":{"type":"string","minLength":1,"maxLength":40,"default":"SolanaDevnet"},"fiatCurrency":{"type":"string","enum":["EUR","USD","GBP"],"default":"EUR"},"isTestnet":{"type":"boolean"},"destinationAddress":{"type":"string","minLength":26,"maxLength":255},"bindOnApproval":{"type":"boolean"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of creating a second one, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; a key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethodId":{"type":"string","format":"uuid"},"noahPaymentMethodId":{"type":"string"},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":"string","description":"The account's primary rail, as the bank ramp names it (BankSepa for EUR)."},"virtualAccountId":{"type":["null","string"],"description":"The bank ramp's VirtualAccountID. null when the bank ramp did not send one in its documented form, or for a payment method stored before Aurea kept it."},"accountHolderName":{"type":"string"},"iban":{"type":"string"},"bic":{"type":"string"},"bankName":{"type":"string"},"bankAddress":{"type":"object","properties":{"street":{"type":"string"},"street2":{"type":["null","string"]},"city":{"type":"string"},"postalCode":{"type":"string"},"state":{"type":["null","string"]},"country":{"type":"string"}},"required":["street","street2","city","postalCode","state","country"],"additionalProperties":false},"reference":{"type":["null","string"],"description":"The bank ramp's Reference for the virtual account, as sent. The bank ramp does not document its use."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."},"relatedPaymentMethods":{"type":"array","items":{"type":"object","properties":{"noahPaymentMethodId":{"type":"string","description":"The bank ramp's id of this rail."},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":["null","string"],"description":"The rail, as the bank ramp names it: BankFedwire, BankSwift and so on."},"accountNumber":{"type":["null","string"],"description":"The account number to pay on this rail."},"bankCode":{"type":["null","string"],"description":"The bank identifier of this rail: ABA routing number for BankAch and BankFedwire, BIC for BankSwift."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."}},"required":["noahPaymentMethodId","paymentMethodType","accountNumber","bankCode","fee"],"additionalProperties":false},"description":"The other rails of the same virtual account (for USD, Fedwire and SWIFT next to ACH), each with its own account details and fee. Empty when the bank ramp sent none."},"fiatCurrency":{"type":"string"},"cryptoCurrency":{"type":"string"},"network":{"type":"string"},"destinationAddress":{"type":"string"},"status":{"type":"string"},"expiresAt":{"type":"string"},"message":{"type":"string"}},"required":["paymentMethodId","noahPaymentMethodId","paymentMethodType","virtualAccountId","accountHolderName","iban","bic","bankName","bankAddress","reference","fee","relatedPaymentMethods","fiatCurrency","cryptoCurrency","network","destinationAddress","status","message"],"additionalProperties":false}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["waiting"],"properties":{"waiting":{"type":"object","description":"An account asked for while the verification is under way: it is opened by itself when the approval arrives and the wallet can receive.","required":["requestId","accountKind","currency","isSandbox","status","attempts","createdAt","nextStep"],"properties":{"requestId":{"type":"string","format":"uuid"},"accountKind":{"type":"string","enum":["bank_payin","remittance_account","bank_iban"]},"currency":{"type":"string"},"isSandbox":{"type":"boolean"},"status":{"type":"string","enum":["waiting","bound","failed","cancelled"]},"attempts":{"type":"integer"},"lastErrorCode":{"type":["string","null"]},"accountId":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"nextStep":{"type":"string","enum":["wait_for_approval","none","ask_again"],"description":"wait_for_approval: nothing to do, the account opens by itself; none: it is open (accountId); ask_again: it was given up (lastErrorCode) or withdrawn — ask for the account again"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payin/payment-methods":{"get":{"summary":"Get customer payment methods","tags":["bank-ramp-payin"],"description":"Retrieve the virtual IBAN payment methods of the authenticated user's profile in one of the bank ramp's environments: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethods":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"noahPaymentMethodId":{"type":"string"},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":"string"},"accountHolderName":{"type":"string"},"iban":{"type":"string"},"bic":{"type":"string"},"bankName":{"type":"string"},"bankAddress":{"type":"object","properties":{"street":{"type":["null","string"]},"street2":{"type":["null","string"]},"city":{"type":["null","string"]},"postalCode":{"type":["null","string"]},"state":{"type":["null","string"]},"country":{"type":["null","string"]}},"required":["street","street2","city","postalCode","state","country"],"additionalProperties":false,"description":"The bank's address, as the bank ramp sent it."},"virtualAccountId":{"type":["null","string"],"description":"The bank ramp's VirtualAccountID. null when the bank ramp did not send one in its documented form, or for a payment method stored before Aurea kept it."},"reference":{"type":["null","string"],"description":"The bank ramp's Reference for the virtual account, as sent. The bank ramp does not document its use."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."},"relatedPaymentMethods":{"type":"array","items":{"type":"object","properties":{"noahPaymentMethodId":{"type":"string","description":"The bank ramp's id of this rail."},"bankRampPaymentMethodId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"paymentMethodType":{"type":["null","string"],"description":"The rail, as the bank ramp names it: BankFedwire, BankSwift and so on."},"accountNumber":{"type":["null","string"],"description":"The account number to pay on this rail."},"bankCode":{"type":["null","string"],"description":"The bank identifier of this rail: ABA routing number for BankAch and BankFedwire, BIC for BankSwift."},"fee":{"anyOf":[{"type":"object","properties":{"currency":{"type":["string","null"],"description":"The fee's fiat currency."},"pct":{"type":["string","null"],"description":"The percentage of each deposit, exact decimal text."},"base":{"type":["string","null"],"description":"The fixed part per deposit, exact decimal text."},"min":{"type":["string","null"],"description":"The least fee per deposit, exact decimal text."}},"required":["currency","pct","base","min"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's fee for deposits on this rail, as it answered when it created the virtual account. null when the bank ramp sent none."}},"required":["noahPaymentMethodId","paymentMethodType","accountNumber","bankCode","fee"],"additionalProperties":false},"description":"The other rails of the same virtual account (for USD, Fedwire and SWIFT next to ACH), each with its own account details and fee. Empty when the bank ramp sent none."},"fiatCurrency":{"type":"string"},"cryptoCurrency":{"type":"string"},"network":{"type":"string"},"destinationAddress":{"type":"string"},"status":{"type":"string"},"destinationRevoked":{"type":"boolean"},"isExpired":{"type":"boolean"},"accountStatus":{"type":"string","enum":["Active","PendingClosure","Closed","Missing"]},"lastRefreshedAt":{"type":"string"},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","noahPaymentMethodId","paymentMethodType","bankAddress","virtualAccountId","reference","fee","relatedPaymentMethods","fiatCurrency","status","destinationRevoked","isExpired","createdAt"],"additionalProperties":false}},"total":{"type":"number"}},"required":["paymentMethods","total"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payin/deposits":{"get":{"summary":"Get customer deposits","tags":["bank-ramp-payin"],"description":"Retrieve the fiat deposits of the authenticated user's profile in one of the bank ramp's environments (sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted), with optional filtering. Deposits are known from the bank ramp's FiatDeposit webhooks; each carries the bank ramp's own status, the review sub-status, the request for information and the refunds the bank ramp reports.","parameters":[{"schema":{"type":"string","enum":["pending","completed","failed","under_review","refunded"]},"in":"query","name":"status","required":false,"description":"under_review and refunded are accepted and never match: a deposit under review stays pending, a refunded one is failed."},{"schema":{"type":"string","default":"20"},"in":"query","name":"limit","required":false,"description":"Maximum 100"},{"schema":{"type":"string","default":"0"},"in":"query","name":"offset","required":false},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"deposits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"noahDepositId":{"type":"string"},"bankRampDepositId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"fiatAmount":{"type":"number"},"fiatCurrency":{"type":"string"},"senderName":{"type":"string","description":"Never filled: the sender reported by the bank ramp is personal data Aurea does not keep."},"status":{"type":"string","description":"Aurea's status: pending, completed or failed. under_review and refunded are never produced: a deposit under review stays pending with noahSubStatus or requestForInformation, a refunded one is failed with refunds."},"eddRequired":{"type":"boolean","description":"Always false: the bank ramp reports a review as noahSubStatus and requestForInformation."},"eddReason":{"type":"string","description":"Never filled."},"depositDate":{"type":"string"},"createdAt":{"type":"string"},"paymentMethodId":{"type":"string","format":"uuid","description":"Aurea's id of the virtual account the deposit arrived on, as GET /payment-methods lists it."},"noahStatus":{"anyOf":[{"type":"string","enum":["Pending","Settled","Failed"]},{"type":"null"}],"description":"The bank ramp's own status, which only moves forward. null for what was stored before Aurea kept the bank ramp's status."},"bankRampStatus":{"anyOf":[{"type":"string","enum":["Pending","Settled","Failed"]},{"type":"null"}],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"noahSubStatus":{"type":["null","string"],"description":"While Pending: AmlScreening, UnderReview, Submitted or Confirming. null otherwise, or when the bank ramp sent a value it does not document."},"bankRampSubStatus":{"type":["null","string"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"requestForInformation":{"anyOf":[{"type":"object","properties":{"status":{"type":["string","null"],"description":"AwaitingCustomer, UnderReview, Closed or Completed; null when the bank ramp sent a value it does not document."},"type":{"type":["string","null"],"description":"Manual or ProofOfAddress; null when the bank ramp sent a value it does not document."}},"required":["status","type"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's request for information (RFI) while the payment is reviewed. The bank ramp asks the customer by email, or your compliance team under Reliance; there is no API to answer it. null when there is none."},"refunds":{"type":"array","items":{"type":"object","properties":{"refundId":{"type":["null","string"],"description":"The bank ramp's id of the refund."},"amount":{"type":["null","string"],"description":"The amount refunded, exact decimal text."},"currency":{"type":["null","string"],"description":"The fiat currency of a deposit's refund; the asset of a transaction's."},"status":{"type":["null","string"],"description":"The bank ramp's own word: Pending, Successful or Failed for a deposit's refund; Pending, Settled or Failed for a transaction's."},"requestedAt":{"type":["null","string"],"description":"When the refund was requested, ISO 8601."}},"required":["refundId","amount","currency","status","requestedAt"],"additionalProperties":false},"description":"The bank ramp's refunds of the deposit, which go back to the account that sent it; empty when there is none."},"paymentMethodType":{"type":["null","string"],"description":"How the deposit was paid, as the bank ramp names it: BankSepa, BankFedwire, BankSwift, BankAch and so on."},"paymentSystemId":{"type":["null","string"],"description":"The transfer's id in the payment system: IMAD for Fedwire, UETR for SWIFT, trace number for ACH."},"updatedAt":{"type":"string"}},"required":["id","fiatAmount","fiatCurrency","status","eddRequired","createdAt","paymentMethodId","noahStatus","noahSubStatus","requestForInformation","refunds","paymentMethodType","paymentSystemId","updatedAt"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["deposits","total","limit","offset"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payin/transactions":{"get":{"summary":"Get customer transactions","tags":["bank-ramp-payin"],"description":"Retrieve the bank ramp's transactions (purchases, withdrawals) of the authenticated user's profile in one of its environments (sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted), with optional filtering. A bank on-ramp shows as two transactions of one rule execution, both with the deposit that paid for them: the conversion (In) and the on-chain delivery (Out).","parameters":[{"schema":{"type":"string","enum":["purchase","withdrawal","refund"]},"in":"query","name":"type","required":false,"description":"refund is accepted and never matches."},{"schema":{"type":"string","enum":["pending","completed","failed","cancelled"]},"in":"query","name":"status","required":false,"description":"cancelled is accepted and never matches."},{"schema":{"type":"string","default":"20"},"in":"query","name":"limit","required":false,"description":"Maximum 100"},{"schema":{"type":"string","default":"0"},"in":"query","name":"offset","required":false},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"noahTransactionId":{"type":"string"},"bankRampTransactionId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"transactionType":{"type":"string","description":"purchase when the bank ramp credits (direction In), withdrawal when it debits (Out), an on-ramp's on-chain delivery included. refund is never produced: a refund is an entry of refunds, a reversal a transaction with reversesTransactionId."},"fiatAmount":{"type":"number"},"fiatCurrency":{"type":"string"},"cryptoAmount":{"type":"number"},"cryptoCurrency":{"type":"string"},"exchangeRate":{"type":"number","description":"Not filled from the bank ramp's events: see fiatRate."},"network":{"type":"string"},"destinationAddress":{"type":"string"},"blockchainTxHash":{"type":"string"},"status":{"type":"string","description":"Aurea's status: pending, completed or failed. cancelled is never produced."},"transactionDate":{"type":"string"},"completedAt":{"type":"string"},"createdAt":{"type":"string"},"depositId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Aurea's id of the deposit that paid for it: the one the bank ramp names in FiatPayment.FiatDepositID or, for an on-ramp's on-chain delivery, which names none, the deposit of another transaction of the same rule execution. null when Aurea has none."},"noahDepositId":{"type":["null","string"],"description":"The bank ramp's id of the deposit the transaction names (FiatPayment.FiatDepositID); null when it names none."},"bankRampDepositId":{"type":["null","string"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"direction":{"anyOf":[{"type":"string","enum":["In","Out"]},{"type":"null"}],"description":"In: the bank ramp credits (a conversion from fiat, an on-chain deposit, a reversal). Out: the bank ramp debits (an on-chain delivery or withdrawal, a fiat payout). null for what was stored before Aurea kept the bank ramp's status."},"noahStatus":{"anyOf":[{"type":"string","enum":["Pending","Settled","Failed"]},{"type":"null"}],"description":"The bank ramp's own status, which only moves forward. null for what was stored before Aurea kept the bank ramp's status."},"bankRampStatus":{"anyOf":[{"type":"string","enum":["Pending","Settled","Failed"]},{"type":"null"}],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"noahSubStatus":{"type":["null","string"],"description":"While Pending: AmlScreening, UnderReview, Submitted or Confirming. null otherwise, or when the bank ramp sent a value it does not document."},"bankRampSubStatus":{"type":["null","string"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"requestForInformation":{"anyOf":[{"type":"object","properties":{"status":{"type":["string","null"],"description":"AwaitingCustomer, UnderReview, Closed or Completed; null when the bank ramp sent a value it does not document."},"type":{"type":["string","null"],"description":"Manual or ProofOfAddress; null when the bank ramp sent a value it does not document."}},"required":["status","type"],"additionalProperties":false},{"type":"null"}],"description":"The bank ramp's request for information (RFI) while the payment is reviewed. The bank ramp asks the customer by email, or your compliance team under Reliance; there is no API to answer it. null when there is none."},"refunds":{"type":"array","items":{"type":"object","properties":{"refundId":{"type":["null","string"],"description":"The bank ramp's id of the refund."},"amount":{"type":["null","string"],"description":"The amount refunded, exact decimal text."},"currency":{"type":["null","string"],"description":"The fiat currency of a deposit's refund; the asset of a transaction's."},"status":{"type":["null","string"],"description":"The bank ramp's own word: Pending, Successful or Failed for a deposit's refund; Pending, Settled or Failed for a transaction's."},"requestedAt":{"type":["null","string"],"description":"When the refund was requested, ISO 8601."}},"required":["refundId","amount","currency","status","requestedAt"],"additionalProperties":false},"description":"The bank ramp's refunds of the transaction; empty when there is none."},"ruleId":{"type":["null","string"],"description":"Orchestration.RuleID: the rule the bank ramp executed."},"ruleExecutionId":{"type":["null","string"],"description":"Orchestration.RuleExecutionID: the same on every transaction of one flow, such as the conversion and the on-chain delivery of one deposit."},"reversesTransactionId":{"type":["null","string"],"description":"The bank ramp's id of the transaction this one reverses."},"adjustment":{"anyOf":[{"type":"object","properties":{"adjustedTransactionId":{"type":["string","null"],"description":"The bank ramp's id of the transaction adjusted."},"adjustmentId":{"type":["string","null"],"description":"Shared by every transaction of one adjustment; a refund's id for a refund."},"reason":{"type":["string","null"],"description":"ExchangeRateCorrection or Refund."}},"required":["adjustedTransactionId","adjustmentId","reason"],"additionalProperties":false},{"type":"null"}],"description":"The transaction this one adjusts (the bank ramp's AdjustmentFor); null when it adjusts none."},"breakdown":{"type":"array","items":{"type":"object","properties":{"type":{"type":["null","string"],"description":"ChannelFee, BusinessFee, NetworkFee or Remaining, as the bank ramp names the line."},"amount":{"type":["null","string"],"description":"Exact decimal text."},"fixedAmount":{"type":["null","string"],"description":"The fixed part of a fee line, exact decimal text."},"variableAmount":{"type":["null","string"],"description":"The percentage part of a fee line, exact decimal text."}},"required":["type","amount","fixedAmount","variableAmount"],"additionalProperties":false},"description":"How the bank ramp computed the transaction's amount, in its asset; empty when the bank ramp sent none."},"networkFee":{"type":["null","string"],"description":"The bank ramp's NetworkFee in the asset, exact decimal text."},"fiatFeeAmount":{"type":["null","string"],"description":"FiatPayment.FeeAmount in fiatCurrency, exact decimal text."},"fiatRate":{"type":["null","string"],"description":"FiatPayment.Rate, exact decimal text: for a purchase, cryptoAmount = (fiatAmount - fiatFeeAmount) / fiatRate."},"paymentSystemId":{"type":["null","string"],"description":"FiatPayment.PaymentSystemID: the transfer's id in the payment system (IMAD for Fedwire, UETR for SWIFT, trace number for ACH)."},"updatedAt":{"type":"string"}},"required":["id","noahTransactionId","transactionType","status","createdAt","depositId","noahDepositId","direction","noahStatus","noahSubStatus","requestForInformation","refunds","ruleId","ruleExecutionId","reversesTransactionId","adjustment","breakdown","networkFee","fiatFeeAmount","fiatRate","paymentSystemId","updatedAt"],"additionalProperties":false}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["transactions","total","limit","offset"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payin/sandbox/simulate-deposit":{"post":{"summary":"Simulate a deposit (Sandbox only)","tags":["bank-ramp-payin","sandbox"],"description":"Ask the bank ramp's sandbox to simulate a bank transfer to one of the user's sandbox virtual accounts, in that account's own currency (a USD account is paid in dollars, an EUR account in euros). A payment method of another user, or of the production environment, returns 404. No deposit row is created by this call: the deposit appears when the bank ramp delivers the FiatDeposit webhook. The tenant must have switched the bank ramp's pay-in on in the sandbox, otherwise 403 with details.code NOAH_FUNCTION_OFF.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethodId":{"type":"string","format":"uuid"},"amount":{"type":"number","exclusiveMinimum":0,"maximum":15000},"reference":{"type":"string"}},"required":["paymentMethodId","amount"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"depositId":{"type":"string","format":"uuid"}},"required":["success","message"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payin/sync-status":{"post":{"summary":"Sync onboarding/KYC status from the bank ramp's API","tags":["bank-ramp-payin"],"description":"Fetch the customer from the bank ramp's environment named by `isTestnet` and record it on the user's profile by the same rules as the bank ramp's Customer webhook: the KYC and onboarding statuses never move backwards (an approved profile stays approved unless the bank ramp declines it), and the regions, what the bank ramp asks the customer to do and the agreements are kept and answered in `verification`. `synced` is true when the KYC or onboarding status changed. Send `isTestnet` in the JSON body (`true` for sandbox); the query parameter is read when the body has none, and production is used when neither is sent. Useful in sandbox where webhooks are not delivered to localhost.","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"properties":{"isTestnet":{"type":"boolean","description":"The bank ramp's environment: true for sandbox, false for production. Takes precedence over the query parameter."}}}}}},"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","format":"uuid"},"noahCustomerId":{"type":"string"},"bankRampCustomerId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"onboardingStatus":{"type":"string"},"kycStatus":{"type":"string"},"kycTier":{"type":"string"},"canInitiateDeposit":{"type":"boolean"},"message":{"type":"string"},"verification":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["Pending","Approved","Declined"]},{"type":"null"}],"description":"The bank ramp's overall verification: Approved once one region is approved, Declined is final. It never moves backwards. null before the bank ramp has said anything."},"customerType":{"type":["null","string"],"description":"Individual or Business, once the bank ramp has said which."},"regions":{"type":"array","items":{"type":"object","properties":{"entity":{"type":"string","description":"The bank ramp's legal entity that verifies the customer: Lt, Us or Ca."},"region":{"type":"string","description":"EU for Lt, US for Us, CA for Ca; the bank ramp's entity as it is for any other."},"status":{"type":["null","string"],"description":"Pending, Approved or Declined, for this region only."},"rejection":{"anyOf":[{"type":"string","enum":["retry","final"]},{"type":"null"}],"description":"For a declined region: retry when the customer may try again through a new onboarding session, final when not. null otherwise."}},"required":["entity","region","status","rejection"],"additionalProperties":false},"description":"Each region the bank ramp verifies the customer for, as the bank ramp last reported it."},"actionsRequired":{"type":"array","items":{"type":"string"},"description":"What the bank ramp asks the customer to do before the review continues, for example DocumentReupload, ProofOfAddress, SelfieReupload, HighRiskInfo. Empty when nothing is asked."},"agreements":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}]},"accepted":{"type":"boolean"},"acceptedAt":{"type":["null","string"]}},"required":["name","version","accepted","acceptedAt"],"additionalProperties":false},"description":"The agreements the bank ramp last listed for the customer."},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected"],"description":"start_onboarding: no profile, or the bank ramp has said nothing yet; continue_onboarding: the bank ramp asks for something, a region may retry, or an agreement is not accepted — open a new onboarding session; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: the bank ramp declined the customer for good."}},"required":["status","customerType","regions","actionsRequired","agreements","nextStep"],"additionalProperties":false,"description":"The verification as Aurea keeps it from the bank ramp: it only moves forward, and never includes a reviewer's comment."},"synced":{"type":"boolean","description":"Whether the KYC or onboarding status changed with this read of the bank ramp"}},"required":["onboardingStatus","kycStatus","canInitiateDeposit","message","verification","synced"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payin/checkout":{"post":{"summary":"Card top-up (unavailable)","tags":["bank-ramp-payin"],"description":"Card top-up is not available. Every request returns 403 with `details.code` `CARD_TOPUP_UNAVAILABLE`; top up by bank transfer with `POST /v1/ramp/bank/payin/initiate` instead. Checkout sessions created before card top-up was switched off still complete through `GET /v1/ramp/bank/payin/return` and the bank ramp's webhooks.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fiatAmount":{"type":"string","minLength":1,"pattern":"^\\d+(\\.\\d{1,2})?$"},"fiatCurrency":{"type":"string","minLength":2,"maxLength":10,"default":"EUR"},"cryptoCurrency":{"type":"string","minLength":2,"maxLength":50},"returnUrl":{"type":"string","format":"uri"},"paymentMethodCategory":{"type":"string"},"isTestnet":{"type":"boolean","default":false}},"required":["fiatAmount","returnUrl"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"400":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payin/return":{"get":{"summary":"Bank ramp pay-in checkout return redirect","tags":["bank-ramp-payin"],"description":"Browser redirect endpoint called by the bank ramp after a hosted checkout session completes (or is cancelled). Redirects the user's browser to the app deep link stored for this session. Not intended to be called directly by API clients. The redirect is written only to an address the tenant still allows; anything else is refused with 400 and `details.code` `RETURN_URL_NOT_ALLOWED`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"session","required":true,"description":"The externalId of the checkout session (UUID)"}],"responses":{"302":{"description":"Redirect to the app return URL"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v1/ramp/bank/payin/waiting":{"get":{"summary":"The user's pay-in accounts waiting for their verification","tags":["bank-ramp-payin"],"description":"Accounts asked for with bindOnApproval while the verification was under way: each opens by itself once the verification is approved and the wallet can receive (its backup confirmed). Newest first.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"waiting":{"type":"array","items":{"type":"object","description":"An account asked for while the verification is under way: it is opened by itself when the approval arrives and the wallet can receive.","required":["requestId","accountKind","currency","isSandbox","status","attempts","createdAt","nextStep"],"properties":{"requestId":{"type":"string","format":"uuid"},"accountKind":{"type":"string","enum":["bank_payin","remittance_account","bank_iban"]},"currency":{"type":"string"},"isSandbox":{"type":"boolean"},"status":{"type":"string","enum":["waiting","bound","failed","cancelled"]},"attempts":{"type":"integer"},"lastErrorCode":{"type":["string","null"]},"accountId":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"nextStep":{"type":"string","enum":["wait_for_approval","none","ask_again"],"description":"wait_for_approval: nothing to do, the account opens by itself; none: it is open (accountId); ask_again: it was given up (lastErrorCode) or withdrawn — ask for the account again"}}}}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot use the bank ramp","content":{"application/json":{"schema":{"type":"object","description":"The role cannot use the bank ramp","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payin/waiting/{requestId}/cancel":{"post":{"summary":"Withdraw a pay-in account waiting for the verification","tags":["bank-ramp-payin"],"description":"The request is withdrawn (nothing reached the bank ramp); ask for the account again when it is wanted.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"requestId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"waiting":{"type":"object","description":"An account asked for while the verification is under way: it is opened by itself when the approval arrives and the wallet can receive.","required":["requestId","accountKind","currency","isSandbox","status","attempts","createdAt","nextStep"],"properties":{"requestId":{"type":"string","format":"uuid"},"accountKind":{"type":"string","enum":["bank_payin","remittance_account","bank_iban"]},"currency":{"type":"string"},"isSandbox":{"type":"boolean"},"status":{"type":"string","enum":["waiting","bound","failed","cancelled"]},"attempts":{"type":"integer"},"lastErrorCode":{"type":["string","null"]},"accountId":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"nextStep":{"type":"string","enum":["wait_for_approval","none","ask_again"],"description":"wait_for_approval: nothing to do, the account opens by itself; none: it is open (accountId); ask_again: it was given up (lastErrorCode) or withdrawn — ask for the account again"}}}}}}}},"400":{"description":"The request id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The request id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot use the bank ramp","content":{"application/json":{"schema":{"type":"object","description":"The role cannot use the bank ramp","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such waiting account of the user (WAITING_ACCOUNT_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such waiting account of the user (WAITING_ACCOUNT_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payin/compare":{"post":{"summary":"Compare an app's pay-in account with the Hub's","tags":["bank-ramp-payin"],"description":"For an app moving its users' pay-in accounts to these routes: what it holds for the user's account is compared with the account the Hub holds for the same currency, pair and destination. The answer names the fields that differ (never their values) and the comparison is kept for the tenant's report. 403 RAMP_VIA_HUB_OFF where moving accounts to the Hub is not switched on.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["account"],"properties":{"isTestnet":{"type":"boolean"},"account":{"type":"object","description":"What the app holds for the account; a field not sent is not compared.","properties":{"paymentMethodId":{"type":"string","maxLength":300},"accountNumber":{"type":"string","maxLength":64},"bankCode":{"type":"string","maxLength":64},"fiatCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"cryptoCurrency":{"type":"string","maxLength":30},"network":{"type":"string","maxLength":40},"destinationAddress":{"type":"string","maxLength":255}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"matched":{"type":"boolean"},"differences":{"type":"array","items":{"type":"string"}},"accountId":{"type":["string","null"],"format":"uuid"},"comparedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role cannot use the bank ramp, or moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","content":{"application/json":{"schema":{"type":"object","description":"The role cannot use the bank ramp, or moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payin/compare/report":{"get":{"summary":"The tenant's account comparisons (its server)","tags":["bank-ramp-payin"],"description":"Called by the tenant's server with its signature: how many of its users' accounts were compared since a time (default: the last 7 days), how many matched, and how often each field differed. 403 RAMP_VIA_HUB_OFF where moving accounts to the Hub is not switched on.","parameters":[{"schema":{"type":"string","format":"date-time"},"in":"query","name":"since","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"since":{"type":"string","format":"date-time"},"compared":{"type":"integer"},"matched":{"type":"integer"},"differing":{"type":"integer"},"users":{"type":"integer"},"fields":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"count":{"type":"integer"}}}}}}}}},"400":{"description":"since is not a time (WALLET_EFFICIENCY_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"since is not a time (WALLET_EFFICIENCY_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"The tenant signature is missing or wrong","content":{"application/json":{"schema":{"type":"object","description":"The tenant signature is missing or wrong","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","content":{"application/json":{"schema":{"type":"object","description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payin/customer/adopt":{"post":{"summary":"Take over the app's existing customer for its user (its server)","tags":["bank-ramp-payin"],"description":"Called by the tenant's server with its signature, for an app that already made its user's customer at the bank ramp: the Hub records that customer for the user instead of making a second one (the bank ramp refuses a second verification for a person). The customer is read from the bank ramp with the tenant's own credentials, and its verification recorded. A user with another customer, or a customer another user has, is refused (409 RAMP_CUSTOMER_TAKEN); the same customer again answers adopted false. With `accounts` (the app's own pay-in accounts for that customer: the bank ramp's payment method id, and the currency, pair and destination the app asked it for), the customer's accounts are read from the bank ramp too, and each one the bank ramp lists for that customer on an active account and the app names is recorded for the user, insert only: the same accounts again add nothing, and an account the Hub already holds is never changed. Nothing is made or changed at the bank ramp. `accounts` in the answer counts what was done; `read: false` when the bank ramp could not be read (nothing recorded; the take-over stands). 403 RAMP_VIA_HUB_OFF where moving accounts to the Hub is not switched on.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId","customerId"],"properties":{"userId":{"type":"string","format":"uuid"},"isTestnet":{"type":"boolean"},"customerId":{"type":"string","maxLength":42},"accounts":{"type":"array","maxItems":10,"items":{"type":"object","required":["paymentMethodId","fiatCurrency"],"additionalProperties":false,"properties":{"paymentMethodId":{"type":"string","minLength":1,"maxLength":255},"fiatCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"cryptoCurrency":{"type":"string","minLength":1,"maxLength":50},"network":{"type":"string","minLength":1,"maxLength":50},"destinationAddress":{"type":"string","minLength":1,"maxLength":255}}}}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"adopted":{"type":"boolean"},"profileId":{"type":"string","format":"uuid"},"kycStatus":{"type":"string"},"accounts":{"type":"object","properties":{"read":{"type":"boolean"},"reason":{"type":"string"},"listed":{"type":"integer"},"imported":{"type":"integer"},"kept":{"type":"integer"},"taken":{"type":"integer"},"unrouted":{"type":"integer"},"notListed":{"type":"integer"},"invalid":{"type":"integer"}}}}}}}},"400":{"description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"The tenant signature is missing or wrong","content":{"application/json":{"schema":{"type":"object","description":"The tenant signature is missing or wrong","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","content":{"application/json":{"schema":{"type":"object","description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such user of the tenant (RAMP_USER_NOT_FOUND), or no such customer at the bank ramp (RAMP_CUSTOMER_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such user of the tenant (RAMP_USER_NOT_FOUND), or no such customer at the bank ramp (RAMP_CUSTOMER_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The user has another customer, or the customer is another user's (RAMP_CUSTOMER_TAKEN)","content":{"application/json":{"schema":{"type":"object","description":"The user has another customer, or the customer is another user's (RAMP_CUSTOMER_TAKEN)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/adopt":{"post":{"summary":"Take over the app's existing EUR customer for its user (its server)","tags":["bank-ramp-customers"],"description":"Called by the tenant's server with its signature, for an app that made its user's EUR customer at the bank ramp through its own connection (the user's authorization to the same application as the tenant's bank ramp set): the Hub keeps that customer for the user, with the user's authorization, instead of asking for a second one. `customerId` is the customer's id at the bank ramp; `refreshToken` the user's current authorization, which the Hub renews at once (the app's copy ends there) and keeps encrypted; it is never answered or logged. Once per user and environment: the same customer again answers adopted false and renews nothing; a user with another customer, or a customer another user has, is refused (409 RAMP_CUSTOMER_TAKEN). 404 RAMP_CUSTOMER_NOT_FOUND when the authorization is not that customer's. The IBAN function must be on in the environment. 403 RAMP_VIA_HUB_OFF where moving accounts to the Hub is not switched on.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId","customerId","refreshToken"],"properties":{"userId":{"type":"string","format":"uuid"},"isTestnet":{"type":"boolean"},"customerId":{"type":"string","format":"uuid"},"refreshToken":{"type":"string","minLength":1,"maxLength":4096}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"adopted":{"type":"boolean"},"profileId":{"type":"string","format":"uuid"},"kycStatus":{"type":"string"}}}}}},"400":{"description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (WALLET_EFFICIENCY_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"The tenant signature is missing or wrong","content":{"application/json":{"schema":{"type":"object","description":"The tenant signature is missing or wrong","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF), or the IBAN function is off in the environment","content":{"application/json":{"schema":{"type":"object","description":"Moving accounts to the Hub is off (RAMP_VIA_HUB_OFF), or the IBAN function is off in the environment","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such user of the tenant (RAMP_USER_NOT_FOUND), or the authorization is not that customer's (RAMP_CUSTOMER_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"No such user of the tenant (RAMP_USER_NOT_FOUND), or the authorization is not that customer's (RAMP_CUSTOMER_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The user has another customer, or the customer is another user's (RAMP_CUSTOMER_TAKEN); or the authorization handed over has ended at the bank ramp (BANK_RAMP_AUTHORIZATION_EXPIRED: the user authorizes again)","content":{"application/json":{"schema":{"type":"object","description":"The user has another customer, or the customer is another user's (RAMP_CUSTOMER_TAKEN); or the authorization handed over has ended at the bank ramp (BANK_RAMP_AUTHORIZATION_EXPIRED: the user authorizes again)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp set has no authorization code application in the environment (BANK_RAMP_NOT_CONFIGURED)","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp set has no authorization code application in the environment (BANK_RAMP_NOT_CONFIGURED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payout/countries":{"get":{"summary":"Countries the bank ramp pays out in","tags":["bank-ramp-payout"],"description":"The countries where the bank ramp pays out for the user's bank ramp customer profile, each with its fiat currencies, sorted by country. XX names channels usable internationally. The tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 with `details.code` `NOAH_FUNCTION_OFF`). The user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`); KYC approval is not required to read, and the bank ramp's own refusals pass through with their status and `details` (for example 403 `NOAH_FORBIDDEN` with `denyReasons`). Nothing is stored and nothing moves.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"countries":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string"},"fiatCurrencies":{"type":"array","items":{"type":"string"}}},"required":["country","fiatCurrencies"],"additionalProperties":false}}},"required":["environment","countries"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/channels/search":{"post":{"summary":"Search payout channels","tags":["bank-ramp-payout"],"description":"One page of the channels a payout of cryptoCurrency can go through, for the user's bank ramp customer profile: fees, limits in fiat and in crypto, processing time, the beneficiary form (JSON Schema) and the customer's saved payment methods. Card channels are left out: the bank ramp pays a card only through its hosted checkout. A channel the bank ramp sends without what a payout needs (id, type, country, fiat currency, rate, minimum, processing time) is left out. cryptoCurrency must be offered for payout by the registry and the tenant (400 `NOAH_PAIR_UNAVAILABLE` naming what is offered); in sandbox an asset code such as EURC is read as EURC_TEST. A POST, because a saved payment method's id embeds its account number and a request URL is written to logs; unknown fields are ignored. The tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 with `details.code` `NOAH_FUNCTION_OFF`). The user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`); KYC approval is not required to read, and the bank ramp's own refusals pass through with their status and `details` (for example 403 `NOAH_FORBIDDEN` with `denyReasons`). Nothing is stored and nothing moves.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["cryptoCurrency"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp environment: true for sandbox, false or omitted for production."},"cryptoCurrency":{"type":"string","minLength":1,"maxLength":64,"description":"The currency the user pays out, e.g. EURC_TEST."},"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2 country of the beneficiary."},"fiatCurrency":{"type":"string","pattern":"^[A-Z]{3}$","description":"ISO 4217 currency the beneficiary receives."},"fiatAmount":{"type":"string","maxLength":38,"pattern":"^[+]?([.]\\d+|\\d+[.]?\\d*)$","description":"Decimal text; with it the bank ramp answers each channel's totalFee."},"paymentMethodId":{"type":"string","minLength":1,"maxLength":150,"description":"A saved payment method: each channel's form then asks only for what the bank ramp does not have."},"pageSize":{"type":"integer","minimum":1,"maximum":100,"description":"How many items the bank ramp answers, 1 to 100; its default is 20."},"pageToken":{"type":"string","minLength":1,"maxLength":2048,"description":"nextPageToken of the previous page."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code of the currency read, e.g. EURC_TEST in sandbox."},"channels":{"type":"array","items":{"type":"object","properties":{"channelId":{"type":"string","description":"The bank ramp's channel id. Read channels right before showing them: the bank ramp changes ids and limits."},"country":{"type":"string","description":"ISO 3166-1 alpha-2; XX is a channel usable internationally."},"fiatCurrency":{"type":"string"},"paymentMethodCategory":{"type":["null","string"]},"paymentMethodType":{"type":"string","description":"e.g. BankSepa, BankAch, BankFedwire"},"rate":{"type":"string","description":"Fiat per unit of the cryptocurrency, without fees; not a quoted price. Exact decimal text, e.g. \"10.5\"."},"fee":{"anyOf":[{"type":"object","properties":{"fixed":{"type":["string","null"]},"percentage":{"type":["string","null"],"description":"A percent value: \"0.5\" is 0.5%."},"fiatCurrency":{"type":["string","null"]}},"required":["fixed","percentage","fiatCurrency"],"additionalProperties":false},{"type":"null"}],"description":"The channel's fee; null when the bank ramp sent none."},"totalFee":{"type":["null","string"],"description":"The channel fee for the fiatAmount asked, in fiatCurrency; null without fiatAmount."},"limits":{"type":"object","properties":{"min":{"type":"string","description":"The least amount. Exact decimal text, e.g. \"10.5\"."},"max":{"type":["null","string"],"description":"The most amount; null when the bank ramp sets none."}},"required":["min","max"],"additionalProperties":false,"description":"In fiatCurrency."},"cryptoLimits":{"anyOf":[{"type":"object","properties":{"min":{"type":"string","description":"The least amount. Exact decimal text, e.g. \"10.5\"."},"max":{"type":["string","null"],"description":"The most amount; null when the bank ramp sets none."}},"required":["min","max"],"additionalProperties":false},{"type":"null"}],"description":"The same limits in the cryptocurrency, fees included; null when the bank ramp sent none."},"processingSeconds":{"type":"integer"},"processingTier":{"anyOf":[{"type":"string","enum":["Standard","Priority"]},{"type":"null"}]},"issuer":{"type":["null","string"]},"formSchema":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}],"description":"The JSON Schema of the beneficiary details this channel needs, as the bank ramp sent it; only the missing fields when paymentMethodId was given; null when nothing is needed."},"formContentHash":{"type":["null","string"]},"savedPaymentMethods":{"type":"array","items":{"type":"object","properties":{"paymentMethodId":{"type":"string","description":"The bank ramp's id of the payment method, to name it on a form or a quote. It embeds the account number."},"paymentMethodType":{"type":["null","string"],"description":"The bank ramp's PaymentMethodType, e.g. BankSepa; given on a channel."},"country":{"type":["null","string"],"description":"ISO 3166-1 alpha-2; given on a saved beneficiary."},"paymentMethodCategory":{"type":["null","string"],"description":"Bank, Card or Identifier; given on a saved beneficiary."},"details":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bank","card","identifier","unknown"],"description":"Which fields apply: bank (account, bank code, routing, SWIFT, bank name, banking systems, bank address), card (last4, scheme), identifier (type and value, e.g. a tax id). unknown: a display type the bank ramp does not document, shown with no field."},"accountNumber":{"type":["string","null"]},"bankCode":{"type":["string","null"]},"routingNumber":{"type":["string","null"]},"swiftCode":{"type":["string","null"]},"bankName":{"type":["string","null"]},"bankingSystems":{"type":"array","items":{"type":"string"}},"bankAddress":{"anyOf":[{"type":"object","properties":{"street":{"type":["string","null"]},"street2":{"type":["string","null"]},"city":{"type":["string","null"]},"postCode":{"type":["string","null"]},"state":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["street","street2","city","postCode","state","country"],"additionalProperties":false},{"type":"null"}]},"last4":{"type":["string","null"]},"scheme":{"type":["string","null"]},"identifierType":{"type":["string","null"]},"identifier":{"type":["string","null"]}},"required":["type","accountNumber","bankCode","routingNumber","swiftCode","bankName","bankingSystems","bankAddress","last4","scheme","identifierType","identifier"],"additionalProperties":false},{"type":"null"}],"description":"How the bank ramp shows the payment method; null when it sent none."},"accountHolder":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string","enum":["Individual","Business"]},{"type":"null"}]},"firstName":{"type":["string","null"]},"middleName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"nameLocal":{"type":["string","null"]},"businessName":{"type":["string","null"]}},"required":["type","firstName","middleName","lastName","nameLocal","businessName"],"additionalProperties":false},{"type":"null"}]},"issuerName":{"type":["null","string"]},"capabilities":{"anyOf":[{"type":"object","properties":{"payoutTo":{"type":["boolean","null"]},"payoutFrom":{"type":["boolean","null"]},"payinTo":{"type":["boolean","null"]}},"required":["payoutTo","payoutFrom","payinTo"],"additionalProperties":false},{"type":"null"}],"description":"Given on a saved beneficiary."}},"required":["paymentMethodId","paymentMethodType","country","paymentMethodCategory","details","accountHolder","issuerName","capabilities"],"additionalProperties":false},"description":"The customer's recent payment methods on this channel."}},"required":["channelId","country","fiatCurrency","paymentMethodCategory","paymentMethodType","rate","fee","totalFee","limits","cryptoLimits","processingSeconds","processingTier","issuer","formSchema","formContentHash","savedPaymentMethods"],"additionalProperties":false}},"cardChannelsHidden":{"type":"integer","minimum":0,"description":"How many channels the bank ramp offered that Aurea did not return because they pay out to a card. Aurea does not support card payouts, so they are left out of `channels` — this count says whether the bank ramp has any, instead of leaving you to guess from a short list."},"nextPageToken":{"type":["null","string"],"description":"Send it back as pageToken to read the next page; null when there is none."}},"required":["environment","cryptoCurrency","channels","cardChannelsHidden","nextPageToken"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/channels/{channelId}/form":{"post":{"summary":"Payout channel form","tags":["bank-ramp-payout"],"description":"The beneficiary details a channel needs, as a JSON Schema to render or fill in. With paymentMethodId, only what the bank ramp does not have yet. channelId is the bank ramp's channel id, a UUID (400 otherwise). A POST, because a saved payment method's id embeds its account number and a request URL is written to logs: send a JSON body, `{}` to read production (a request without one answers 400); unknown fields are ignored. The tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 with `details.code` `NOAH_FUNCTION_OFF`). The user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`); KYC approval is not required to read, and the bank ramp's own refusals pass through with their status and `details` (for example 403 `NOAH_FORBIDDEN` with `denyReasons`). Nothing is stored and nothing moves.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp environment: true for sandbox, false or omitted for production."},"paymentMethodId":{"type":"string","minLength":1,"maxLength":150,"description":"A saved payment method of the user."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"channelId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"channelId":{"type":"string"},"formSchema":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}],"description":"The JSON Schema of the details to fill in, as the bank ramp sent it; null when it needs nothing more."},"formContentHash":{"type":["null","string"]}},"required":["environment","channelId","formSchema","formContentHash"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/beneficiaries":{"get":{"summary":"Saved payout beneficiaries","tags":["bank-ramp-payout"],"description":"One page of the payment methods the user's bank ramp customer profile can be paid out to (the bank ramp's Capability PayoutTo), read live from the bank ramp. The tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 with `details.code` `NOAH_FUNCTION_OFF`). The user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`); KYC approval is not required to read, and the bank ramp's own refusals pass through with their status and `details` (for example 403 `NOAH_FORBIDDEN` with `denyReasons`). Nothing is stored and nothing moves.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"How many items the bank ramp answers, 1 to 100; its default is 20."},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"pageToken","required":false,"description":"nextPageToken of the previous page."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"beneficiaries":{"type":"array","items":{"type":"object","properties":{"paymentMethodId":{"type":"string","description":"The bank ramp's id of the payment method, to name it on a form or a quote. It embeds the account number."},"paymentMethodType":{"type":["null","string"],"description":"The bank ramp's PaymentMethodType, e.g. BankSepa; given on a channel."},"country":{"type":["null","string"],"description":"ISO 3166-1 alpha-2; given on a saved beneficiary."},"paymentMethodCategory":{"type":["null","string"],"description":"Bank, Card or Identifier; given on a saved beneficiary."},"details":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bank","card","identifier","unknown"],"description":"Which fields apply: bank (account, bank code, routing, SWIFT, bank name, banking systems, bank address), card (last4, scheme), identifier (type and value, e.g. a tax id). unknown: a display type the bank ramp does not document, shown with no field."},"accountNumber":{"type":["string","null"]},"bankCode":{"type":["string","null"]},"routingNumber":{"type":["string","null"]},"swiftCode":{"type":["string","null"]},"bankName":{"type":["string","null"]},"bankingSystems":{"type":"array","items":{"type":"string"}},"bankAddress":{"anyOf":[{"type":"object","properties":{"street":{"type":["string","null"]},"street2":{"type":["string","null"]},"city":{"type":["string","null"]},"postCode":{"type":["string","null"]},"state":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["street","street2","city","postCode","state","country"],"additionalProperties":false},{"type":"null"}]},"last4":{"type":["string","null"]},"scheme":{"type":["string","null"]},"identifierType":{"type":["string","null"]},"identifier":{"type":["string","null"]}},"required":["type","accountNumber","bankCode","routingNumber","swiftCode","bankName","bankingSystems","bankAddress","last4","scheme","identifierType","identifier"],"additionalProperties":false},{"type":"null"}],"description":"How the bank ramp shows the payment method; null when it sent none."},"accountHolder":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string","enum":["Individual","Business"]},{"type":"null"}]},"firstName":{"type":["string","null"]},"middleName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"nameLocal":{"type":["string","null"]},"businessName":{"type":["string","null"]}},"required":["type","firstName","middleName","lastName","nameLocal","businessName"],"additionalProperties":false},{"type":"null"}]},"issuerName":{"type":["null","string"]},"capabilities":{"anyOf":[{"type":"object","properties":{"payoutTo":{"type":["boolean","null"]},"payoutFrom":{"type":["boolean","null"]},"payinTo":{"type":["boolean","null"]}},"required":["payoutTo","payoutFrom","payinTo"],"additionalProperties":false},{"type":"null"}],"description":"Given on a saved beneficiary."}},"required":["paymentMethodId","paymentMethodType","country","paymentMethodCategory","details","accountHolder","issuerName","capabilities"],"additionalProperties":false}},"nextPageToken":{"type":["null","string"],"description":"Send it back as pageToken to read the next page; null when there is none."}},"required":["environment","beneficiaries","nextPageToken"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/quotes":{"post":{"summary":"Create a payout quote","tags":["bank-ramp-payout"],"description":"Prices a payout with the bank ramp and keeps the answer: the channel is read first, and its payment method type picks the tenant's payout fee, which the bank ramp adds to the fees (breakdown BusinessFee). A card channel is refused with 400 `NOAH_CHANNEL_NOT_SUPPORTED`; a channel the bank ramp answers without what a payout needs, 502 `NOAH_UNEXPECTED_RESPONSE`. The bank ramp may first ask for a form step (a payee check, for instance): the quote is then `needs_step`, and the step is answered with POST /quotes/{quoteId}/steps. Once every step is done the quote is `ready` and, with `quoted` true, the bank ramp's quote locks the rate until `quote.expiresAt`. Send exactly one of fiatAmount, what the beneficiary receives, and cryptoAmount, what the user sends; each is a decimal above zero written as text, and is sent and kept written plainly (\"09.50\" is \"9.5\"). cryptoCurrency must be offered for payout by the registry and the tenant (400 `NOAH_PAIR_UNAVAILABLE`); in sandbox an asset code such as EURC is read as EURC_TEST. Unknown fields are ignored. Asked before the bank ramp is called: the tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 `NOAH_FUNCTION_OFF`); the user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`) with a completed onboarding and an approved KYC (422 `NOAH_KYC_NOT_APPROVED`, with `onboardingStatus` and `kycStatus`). The bank ramp's own refusals pass through with their status and `details` (for example 400 `NOAH_INVALID_REQUEST` with the form's `fields`). A quote moves nothing and is not a payout: GET /transactions does not list it. The form session and the bank ramp's signed quote stay in the Hub, and the form, the payment method id, the form session and the signed quote are never logged.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["channelId","cryptoCurrency"],"additionalProperties":false,"oneOf":[{"required":["fiatAmount"]},{"required":["cryptoAmount"]}],"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp environment: true for sandbox, false or omitted for production."},"channelId":{"type":"string","format":"uuid","description":"A channel of POST /channels/search."},"cryptoCurrency":{"type":"string","minLength":1,"maxLength":64,"description":"The currency the user pays out, e.g. EURC_TEST."},"fiatAmount":{"type":"string","maxLength":38,"pattern":"^(?=[^1-9]*[1-9])[+]?([.]\\d+|\\d+[.]?\\d*)$","description":"What the beneficiary receives, in the channel's currency."},"cryptoAmount":{"type":"string","maxLength":38,"pattern":"^(?=[^1-9]*[1-9])[+]?([.]\\d+|\\d+[.]?\\d*)$","description":"What the user sends, in cryptoCurrency."},"paymentMethodId":{"type":"string","minLength":1,"maxLength":150,"description":"A saved beneficiary of the user (GET /beneficiaries, or a channel's savedPaymentMethods)."},"form":{"type":"object","additionalProperties":true,"description":"The beneficiary details, as the channel's formSchema asks; the bank ramp validates them."},"quoted":{"type":"boolean","default":true,"description":"Ask the bank ramp for a quote that locks the rate once every step is done; true unless false is sent."}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the first quote again, with idempotency-replayed: true, and the bank ramp is not asked twice. The same key with a different request, or while the first is still running, answers 409 `IDEMPOTENCY_KEY_REUSED` or `IDEMPOTENCY_IN_PROGRESS`; a key that is not one, 400 `IDEMPOTENCY_KEY_INVALID`. Every check above is made before a key is replayed."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["needs_step","ready"],"description":"needs_step: the bank ramp asks for a form step first (nextStep), answered with POST /quotes/{quoteId}/steps. ready: every step is done, and the amounts are the payout's."},"channelId":{"type":"string"},"paymentMethodType":{"type":"string","description":"The channel's, e.g. BankSepa."},"country":{"type":"string","description":"The channel's ISO 3166-1 alpha-2 country."},"fiatCurrency":{"type":"string","description":"What the beneficiary receives."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code of the currency paid out, e.g. EURC_TEST."},"requestedFiatAmount":{"type":["null","string"],"description":"The fiatAmount asked for, written plainly; null when cryptoAmount was."},"requestedCryptoAmount":{"type":["null","string"],"description":"The cryptoAmount asked for, written plainly; null when fiatAmount was."},"nextStep":{"anyOf":[{"type":"object","properties":{"stepId":{"type":["string","null"],"description":"Vop (payee check), Cob or PaymentDetails in the bank ramp's document."},"stepType":{"type":["string","null"],"description":"Ack: an acknowledgement; DataEntry: new details to fill in."},"schema":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}],"description":"The JSON Schema of the answers to send, as the bank ramp sent it."}},"required":["stepId","stepType","schema"],"additionalProperties":false},{"type":"null"}],"description":"The form step the bank ramp asks for; null when the quote is ready."},"totalFee":{"type":["null","string"],"description":"Every fee, the tenant's included, in fiatCurrency."},"cryptoAmountEstimate":{"type":["null","string"],"description":"What the user sends, in cryptoCurrency; fixed while quote.locked."},"cryptoAuthorizedAmount":{"type":["null","string"],"description":"The most the payout may take, in cryptoCurrency."},"fiatAmount":{"type":["null","string"],"description":"What the beneficiary receives after every fee."},"rate":{"type":["null","string"],"description":"Fiat per unit of cryptoCurrency, any exchange included."},"breakdown":{"type":"array","items":{"type":"object","properties":{"type":{"type":["null","string"],"description":"ChannelFee, BusinessFee (the tenant's fee) or Remaining."},"amount":{"type":["null","string"]},"fixedAmount":{"type":["null","string"]},"variableAmount":{"type":["null","string"]}},"required":["type","amount","fixedAmount","variableAmount"],"additionalProperties":false},"description":"In cryptoCurrency: ChannelFee + BusinessFee + Remaining = cryptoAmountEstimate. Empty when the bank ramp sent none."},"quote":{"type":"object","properties":{"locked":{"type":"boolean","description":"True while the bank ramp's signed quote locks the rate and the beneficiary's amount: the quote is kept by the Hub, never answered."},"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the locked rate to apply; null without a quote."}},"required":["locked","expiresAt"],"additionalProperties":false,"description":"With quoted false, or while a step is open, never locked."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["quoteId","environment","status","channelId","paymentMethodType","country","fiatCurrency","cryptoCurrency","requestedFiatAmount","requestedCryptoAmount","nextStep","totalFee","cryptoAmountEstimate","cryptoAuthorizedAmount","fiatAmount","rate","breakdown","quote","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/quotes/{quoteId}/steps":{"post":{"summary":"Answer a payout quote's form step","tags":["bank-ramp-payout"],"description":"Sends the bank ramp the answers to the step a `needs_step` quote shows, on the quote's form session, and keeps the bank ramp's answer: another step, or the ready quote. The rest is sent as first asked. A quote of another user or environment answers 404 `NOAH_QUOTE_NOT_FOUND`; a ready quote, 409 `NOAH_QUOTE_READY`; a currency the tenant no longer offers for payout, 400 `NOAH_PAIR_UNAVAILABLE`. Unknown fields are ignored. Asked before the bank ramp is called: the tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 `NOAH_FUNCTION_OFF`); the user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`) with a completed onboarding and an approved KYC (422 `NOAH_KYC_NOT_APPROVED`, with `onboardingStatus` and `kycStatus`). The bank ramp's own refusals pass through with their status and `details` (for example 400 `NOAH_INVALID_REQUEST` with the form's `fields`). A quote moves nothing and is not a payout: GET /transactions does not list it. The form session and the bank ramp's signed quote stay in the Hub, and the form, the payment method id, the form session and the signed quote are never logged.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["form"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp environment: true for sandbox, false or omitted for production."},"form":{"type":"object","additionalProperties":true,"description":"The answers nextStep.schema asks for."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["needs_step","ready"],"description":"needs_step: the bank ramp asks for a form step first (nextStep), answered with POST /quotes/{quoteId}/steps. ready: every step is done, and the amounts are the payout's."},"channelId":{"type":"string"},"paymentMethodType":{"type":"string","description":"The channel's, e.g. BankSepa."},"country":{"type":"string","description":"The channel's ISO 3166-1 alpha-2 country."},"fiatCurrency":{"type":"string","description":"What the beneficiary receives."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code of the currency paid out, e.g. EURC_TEST."},"requestedFiatAmount":{"type":["null","string"],"description":"The fiatAmount asked for, written plainly; null when cryptoAmount was."},"requestedCryptoAmount":{"type":["null","string"],"description":"The cryptoAmount asked for, written plainly; null when fiatAmount was."},"nextStep":{"anyOf":[{"type":"object","properties":{"stepId":{"type":["string","null"],"description":"Vop (payee check), Cob or PaymentDetails in the bank ramp's document."},"stepType":{"type":["string","null"],"description":"Ack: an acknowledgement; DataEntry: new details to fill in."},"schema":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}],"description":"The JSON Schema of the answers to send, as the bank ramp sent it."}},"required":["stepId","stepType","schema"],"additionalProperties":false},{"type":"null"}],"description":"The form step the bank ramp asks for; null when the quote is ready."},"totalFee":{"type":["null","string"],"description":"Every fee, the tenant's included, in fiatCurrency."},"cryptoAmountEstimate":{"type":["null","string"],"description":"What the user sends, in cryptoCurrency; fixed while quote.locked."},"cryptoAuthorizedAmount":{"type":["null","string"],"description":"The most the payout may take, in cryptoCurrency."},"fiatAmount":{"type":["null","string"],"description":"What the beneficiary receives after every fee."},"rate":{"type":["null","string"],"description":"Fiat per unit of cryptoCurrency, any exchange included."},"breakdown":{"type":"array","items":{"type":"object","properties":{"type":{"type":["null","string"],"description":"ChannelFee, BusinessFee (the tenant's fee) or Remaining."},"amount":{"type":["null","string"]},"fixedAmount":{"type":["null","string"]},"variableAmount":{"type":["null","string"]}},"required":["type","amount","fixedAmount","variableAmount"],"additionalProperties":false},"description":"In cryptoCurrency: ChannelFee + BusinessFee + Remaining = cryptoAmountEstimate. Empty when the bank ramp sent none."},"quote":{"type":"object","properties":{"locked":{"type":"boolean","description":"True while the bank ramp's signed quote locks the rate and the beneficiary's amount: the quote is kept by the Hub, never answered."},"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the locked rate to apply; null without a quote."}},"required":["locked","expiresAt"],"additionalProperties":false,"description":"With quoted false, or while a step is open, never locked."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["quoteId","environment","status","channelId","paymentMethodType","country","fiatCurrency","cryptoCurrency","requestedFiatAmount","requestedCryptoAmount","nextStep","totalFee","cryptoAmountEstimate","cryptoAuthorizedAmount","fiatAmount","rate","breakdown","quote","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/quotes/{quoteId}":{"get":{"summary":"Get a payout quote","tags":["bank-ramp-payout"],"description":"A quote of the user as the Hub keeps it, in the environment named by `isTestnet`; the bank ramp is not asked, and `quote.locked` turns false once the quote has expired. Needs a tenant (403 otherwise); a quote of another user or environment answers 404 `NOAH_QUOTE_NOT_FOUND`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["needs_step","ready"],"description":"needs_step: the bank ramp asks for a form step first (nextStep), answered with POST /quotes/{quoteId}/steps. ready: every step is done, and the amounts are the payout's."},"channelId":{"type":"string"},"paymentMethodType":{"type":"string","description":"The channel's, e.g. BankSepa."},"country":{"type":"string","description":"The channel's ISO 3166-1 alpha-2 country."},"fiatCurrency":{"type":"string","description":"What the beneficiary receives."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code of the currency paid out, e.g. EURC_TEST."},"requestedFiatAmount":{"type":["null","string"],"description":"The fiatAmount asked for, written plainly; null when cryptoAmount was."},"requestedCryptoAmount":{"type":["null","string"],"description":"The cryptoAmount asked for, written plainly; null when fiatAmount was."},"nextStep":{"anyOf":[{"type":"object","properties":{"stepId":{"type":["string","null"],"description":"Vop (payee check), Cob or PaymentDetails in the bank ramp's document."},"stepType":{"type":["string","null"],"description":"Ack: an acknowledgement; DataEntry: new details to fill in."},"schema":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}],"description":"The JSON Schema of the answers to send, as the bank ramp sent it."}},"required":["stepId","stepType","schema"],"additionalProperties":false},{"type":"null"}],"description":"The form step the bank ramp asks for; null when the quote is ready."},"totalFee":{"type":["null","string"],"description":"Every fee, the tenant's included, in fiatCurrency."},"cryptoAmountEstimate":{"type":["null","string"],"description":"What the user sends, in cryptoCurrency; fixed while quote.locked."},"cryptoAuthorizedAmount":{"type":["null","string"],"description":"The most the payout may take, in cryptoCurrency."},"fiatAmount":{"type":["null","string"],"description":"What the beneficiary receives after every fee."},"rate":{"type":["null","string"],"description":"Fiat per unit of cryptoCurrency, any exchange included."},"breakdown":{"type":"array","items":{"type":"object","properties":{"type":{"type":["null","string"],"description":"ChannelFee, BusinessFee (the tenant's fee) or Remaining."},"amount":{"type":["null","string"]},"fixedAmount":{"type":["null","string"]},"variableAmount":{"type":["null","string"]}},"required":["type","amount","fixedAmount","variableAmount"],"additionalProperties":false},"description":"In cryptoCurrency: ChannelFee + BusinessFee + Remaining = cryptoAmountEstimate. Empty when the bank ramp sent none."},"quote":{"type":"object","properties":{"locked":{"type":"boolean","description":"True while the bank ramp's signed quote locks the rate and the beneficiary's amount: the quote is kept by the Hub, never answered."},"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the locked rate to apply; null without a quote."}},"required":["locked","expiresAt"],"additionalProperties":false,"description":"With quoted false, or while a step is open, never locked."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["quoteId","environment","status","channelId","paymentMethodType","country","fiatCurrency","cryptoCurrency","requestedFiatAmount","requestedCryptoAmount","nextStep","totalFee","cryptoAmountEstimate","cryptoAuthorizedAmount","fiatAmount","rate","breakdown","quote","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/payouts":{"post":{"summary":"Pay out a quote from the user's wallet","tags":["bank-ramp-payout"],"description":"Binds a ready quote to a bank ramp payout rule and answers where to send the deposit: `deposit.amountUnits` of the token to `deposit.address`, from `sourceAddress`, on `network`. The bank ramp pays the beneficiary once the deposit arrives. **How the rate is struck depends on the quote.** A quote with a locked rate (`quoted` true, and `quote.locked` on GET /quotes/{quoteId}) binds a Quoted trigger: the rate and both amounts are fixed until the quote expires. A quote the bank ramp answered but did not sign binds a **Single** trigger instead: the beneficiary still receives the quote's `fiatAmount`, and the bank ramp strikes the rate when the deposit lands, so `deposit.amount` is an estimate and the crypto actually sold may differ. Read the quote to know which you have. A Single rule fires on **any** positive deposit from the source address — matching an exact amount is fragile, since a deposit a fraction short would be ignored and the money would sit at an address with no rule to act on it. It holds its source for its whole window (24 hours, unless Aurea configures another) rather than 30 minutes past a quote. The source is `walletId`, one of the user's Aurea wallets when the tenant has the Aurea wallets mode (an EVM wallet sends on every EVM network; a watch-only import is refused), or `address`, an address the user proved they own in the environment (POST /v1/ramp/bank/addresses/challenge) when the tenant has the standalone mode. A refused source answers 400 `NOAH_SOURCE_NOT_ALLOWED` with `reason` `wallet_not_found`, `watch_only`, `wrong_network` or `address_not_proven`. A quote that prices the beneficiary at nothing answers 400 `NOAH_PAYOUT_AMOUNT_TOO_SMALL` with `details.quoteId`: below a channel's `cryptoLimits.min` the fixed fee takes the whole payout, and the bank ramp prices it at zero rather than refusing it — ask for a quote above that minimum. A quote the bank ramp still asks a step for, or whose locked rate has expired, answers 409 `NOAH_QUOTE_NOT_LOCKED` with `reason` `not_ready` or `expired` — a quote without a locked rate is paid by a Single rule and is no longer refused; a quote already bound to a payout, even a failed one, 409 `NOAH_QUOTE_USED`. One source holds one waiting payout per network and currency, across every tenant: another answers 409 `NOAH_PAYOUT_SOURCE_BUSY` until its deposit is paid out, the bank ramp refuses its rule, or the rule expires — 30 minutes after its quote when the rate was locked, and at the end of its own window otherwise. The bank ramp's refusals pass through with their status and `details`, and the payout is `failed`. When the Hub cannot tell whether the bank ramp made the rule (the bank ramp answered 5xx, did not answer, answered out of shape, or answered while the Hub could not store the answer — 500), the Hub answers that status with `details.payoutId` and `details.outcome` `unknown`: the payout stays `pending`, the source stays held, and nothing is asked again — read it with GET /payouts/{payoutId}. When the tenant's bank ramp credentials are missing, the answer is 503 `NOAH_NOT_CONFIGURED`, before anything is stored. Unknown fields are ignored. The source and deposit addresses, the form session and the signed quote are never logged. Asked before the Idempotency-Key is looked at, and before anything is stored: the tenant must use the bank ramp as its banking provider (403 otherwise) and have switched bank ramp payouts on in the environment (403 `NOAH_FUNCTION_OFF`); the user needs a bank ramp customer profile in the environment (404 `NOAH_CUSTOMER_NOT_FOUND`) with a completed onboarding and an approved KYC (422 `NOAH_KYC_NOT_APPROVED`); the quote must be the user's in the environment (404 `NOAH_QUOTE_NOT_FOUND`); the quote's currency on `network` must be offered for payout by the registry and the tenant (400 `NOAH_PAIR_UNAVAILABLE`); and the source must be allowed (403 `NOAH_MODE_OFF`, 400 `NOAH_SOURCE_NOT_ALLOWED`). When Aurea requires a passkey step-up for money out, the request carries the user's step-up token for `bank_ramp.payout` (POST /v1/auth/step-up/options, then POST /v1/auth/step-up) in the `x-aurea-step-up` header, otherwise 403 `STEP_UP_REQUIRED` (`STEP_UP_INVALID` for a token that is not one, another user's, another action's or one already used), before anything else.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["quoteId","network","source"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp environment: true for sandbox, false or omitted for production."},"quoteId":{"type":"string","format":"uuid","description":"A ready quote of POST /quotes with quoted true."},"network":{"type":"string","enum":["Base","BaseTestSepolia","Bitcoin","BitcoinTest","Celo","CeloTestSepolia","Ethereum","EthereumTestSepolia","FlowEvm","FlowEvmTest","Gnosis","GnosisTestChiado","PolygonPos","PolygonTestAmoy","Solana","SolanaDevnet"],"description":"The network the deposit is sent on, as the bank ramp names it, e.g. PolygonTestAmoy; a payout pair of GET /v1/ramp/bank/currencies."},"source":{"type":"object","additionalProperties":false,"oneOf":[{"required":["walletId"]},{"required":["address"]}],"properties":{"walletId":{"type":"string","format":"uuid","description":"One of the user's Aurea wallets."},"address":{"type":"string","minLength":1,"maxLength":128,"description":"An address the user proved they own."}},"description":"Where the deposit comes from: exactly one of the two."}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the first payout again, with idempotency-replayed: true, and the bank ramp is not asked twice. The same key with a different request, or while the first is still running, answers 409 `IDEMPOTENCY_KEY_REUSED` or `IDEMPOTENCY_IN_PROGRESS`; a key that is not one, 400 `IDEMPOTENCY_KEY_INVALID`. Every check above is made before a key is replayed."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"payoutId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["pending","processing","completed","failed","cancelled","expired"],"description":"pending: waiting for the deposit. failed: the bank ramp refused the rule. expired: no deposit came before the rule's time ran out."},"quoteId":{"type":"string","format":"uuid","description":"The quote the payout pays."},"network":{"type":"string","description":"The network the deposit is sent on, as the bank ramp names it."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code, e.g. USDC_TEST."},"sourceAddress":{"type":"string","description":"The address the deposit must come from: the bank ramp matches the deposit to the payout by it."},"deposit":{"type":"object","properties":{"address":{"type":["null","string"],"description":"Where to send; null when the bank ramp's answer is not known (outcome unknown)."},"amount":{"type":"string","description":"What to send, in cryptoCurrency: the quote's estimate."},"amountUnits":{"type":"string","description":"The same, in the token's smallest unit: send exactly this."},"tokenAddress":{"type":["null","string"],"description":"The token contract (EVM) or mint (Solana)."},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}]},"chainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The EVM chain id; null on Solana."},"expiresAt":{"type":["null","string"],"description":"When the rule stops holding this address: the deposit must have arrived by then. Null while the bank ramp has never been asked for a rule."},"uri":{"type":["null","string"],"description":"The transfer to make, in the chain family's own standard: EIP-681 on EVM, Solana Pay on Solana. Null when there is no deposit address yet or the pair is no longer in the registry. It carries no reference and no memo."}},"required":["address","amount","amountUnits","tokenAddress","decimals","chainId","expiresAt","uri"],"additionalProperties":false,"description":"The token details are null when the pair is no longer in the registry."},"cryptoAuthorizedAmount":{"type":"string","description":"The most the rule may take, in cryptoCurrency."},"cryptoAuthorizedAmountUnits":{"type":"string","description":"The same, in the token's smallest unit."},"fiatCurrency":{"type":"string"},"fiatAmount":{"type":"string","description":"What the beneficiary receives."},"rate":{"type":["null","string"]},"totalFee":{"type":["null","string"],"description":"Every fee, in fiatCurrency."},"quote":{"type":"object","properties":{"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the quote's rate."}},"required":["expiresAt"],"additionalProperties":false},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["payoutId","environment","status","quoteId","network","cryptoCurrency","sourceAddress","deposit","cryptoAuthorizedAmount","cryptoAuthorizedAmountUnits","fiatCurrency","fiatAmount","rate","totalFee","quote","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List payouts paid from the user's wallet","tags":["bank-ramp-payout"],"description":"The user's payouts of POST /payouts in the environment named by `isTestnet`, newest first; the bank ramp is not asked. Needs a tenant (403 otherwise), and nothing else: a payout stays readable after payouts are switched off. Hosted checkout payouts are listed by GET /transactions.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"payouts":{"type":"array","items":{"type":"object","properties":{"payoutId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["pending","processing","completed","failed","cancelled","expired"],"description":"pending: waiting for the deposit. failed: the bank ramp refused the rule. expired: no deposit came before the rule's time ran out."},"quoteId":{"type":"string","format":"uuid","description":"The quote the payout pays."},"network":{"type":"string","description":"The network the deposit is sent on, as the bank ramp names it."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code, e.g. USDC_TEST."},"sourceAddress":{"type":"string","description":"The address the deposit must come from: the bank ramp matches the deposit to the payout by it."},"deposit":{"type":"object","properties":{"address":{"type":["null","string"],"description":"Where to send; null when the bank ramp's answer is not known (outcome unknown)."},"amount":{"type":"string","description":"What to send, in cryptoCurrency: the quote's estimate."},"amountUnits":{"type":"string","description":"The same, in the token's smallest unit: send exactly this."},"tokenAddress":{"type":["null","string"],"description":"The token contract (EVM) or mint (Solana)."},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}]},"chainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The EVM chain id; null on Solana."},"expiresAt":{"type":["null","string"],"description":"When the rule stops holding this address: the deposit must have arrived by then. Null while the bank ramp has never been asked for a rule."},"uri":{"type":["null","string"],"description":"The transfer to make, in the chain family's own standard: EIP-681 on EVM, Solana Pay on Solana. Null when there is no deposit address yet or the pair is no longer in the registry. It carries no reference and no memo."}},"required":["address","amount","amountUnits","tokenAddress","decimals","chainId","expiresAt","uri"],"additionalProperties":false,"description":"The token details are null when the pair is no longer in the registry."},"cryptoAuthorizedAmount":{"type":"string","description":"The most the rule may take, in cryptoCurrency."},"cryptoAuthorizedAmountUnits":{"type":"string","description":"The same, in the token's smallest unit."},"fiatCurrency":{"type":"string"},"fiatAmount":{"type":"string","description":"What the beneficiary receives."},"rate":{"type":["null","string"]},"totalFee":{"type":["null","string"],"description":"Every fee, in fiatCurrency."},"quote":{"type":"object","properties":{"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the quote's rate."}},"required":["expiresAt"],"additionalProperties":false},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["payoutId","environment","status","quoteId","network","cryptoCurrency","sourceAddress","deposit","cryptoAuthorizedAmount","cryptoAuthorizedAmountUnits","fiatCurrency","fiatAmount","rate","totalFee","quote","createdAt","updatedAt"],"additionalProperties":false}},"total":{"type":"integer"},"page":{"type":"integer"},"limit":{"type":"integer"},"totalPages":{"type":"integer"}},"required":["environment","payouts","total","page","limit","totalPages"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/payouts/{payoutId}":{"get":{"summary":"Get a payout paid from the user's wallet","tags":["bank-ramp-payout"],"description":"A payout of POST /payouts as the Hub keeps it, in the environment named by `isTestnet`; the bank ramp is not asked. Needs a tenant (403 otherwise); a payout of another user or environment, or a hosted checkout payout, answers 404 `NOAH_PAYOUT_NOT_FOUND`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"payoutId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"payoutId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["sandbox","production"],"description":"The bank ramp environment read: sandbox with isTestnet=true."},"status":{"type":"string","enum":["pending","processing","completed","failed","cancelled","expired"],"description":"pending: waiting for the deposit. failed: the bank ramp refused the rule. expired: no deposit came before the rule's time ran out."},"quoteId":{"type":"string","format":"uuid","description":"The quote the payout pays."},"network":{"type":"string","description":"The network the deposit is sent on, as the bank ramp names it."},"cryptoCurrency":{"type":"string","description":"The bank ramp's code, e.g. USDC_TEST."},"sourceAddress":{"type":"string","description":"The address the deposit must come from: the bank ramp matches the deposit to the payout by it."},"deposit":{"type":"object","properties":{"address":{"type":["null","string"],"description":"Where to send; null when the bank ramp's answer is not known (outcome unknown)."},"amount":{"type":"string","description":"What to send, in cryptoCurrency: the quote's estimate."},"amountUnits":{"type":"string","description":"The same, in the token's smallest unit: send exactly this."},"tokenAddress":{"type":["null","string"],"description":"The token contract (EVM) or mint (Solana)."},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}]},"chainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The EVM chain id; null on Solana."},"expiresAt":{"type":["null","string"],"description":"When the rule stops holding this address: the deposit must have arrived by then. Null while the bank ramp has never been asked for a rule."},"uri":{"type":["null","string"],"description":"The transfer to make, in the chain family's own standard: EIP-681 on EVM, Solana Pay on Solana. Null when there is no deposit address yet or the pair is no longer in the registry. It carries no reference and no memo."}},"required":["address","amount","amountUnits","tokenAddress","decimals","chainId","expiresAt","uri"],"additionalProperties":false,"description":"The token details are null when the pair is no longer in the registry."},"cryptoAuthorizedAmount":{"type":"string","description":"The most the rule may take, in cryptoCurrency."},"cryptoAuthorizedAmountUnits":{"type":"string","description":"The same, in the token's smallest unit."},"fiatCurrency":{"type":"string"},"fiatAmount":{"type":"string","description":"What the beneficiary receives."},"rate":{"type":["null","string"]},"totalFee":{"type":["null","string"],"description":"Every fee, in fiatCurrency."},"quote":{"type":"object","properties":{"expiresAt":{"type":["null","string"],"description":"When the deposit must have arrived and cleared for the quote's rate."}},"required":["expiresAt"],"additionalProperties":false},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["payoutId","environment","status","quoteId","network","cryptoCurrency","sourceAddress","deposit","cryptoAuthorizedAmount","cryptoAuthorizedAmountUnits","fiatCurrency","fiatAmount","rate","totalFee","quote","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/initiate":{"post":{"summary":"Initiate hosted fiat payout (sandbox only)","tags":["bank-ramp-payout"],"description":"Available only with `isTestnet: true`, against the bank ramp's sandbox. A production request (`isTestnet` false or omitted) returns 403 with `details.code` `PAYOUT_PRODUCTION_UNAVAILABLE` and moves no funds, whatever the tenant's settings. The tenant must have switched bank ramp payouts on in the sandbox, otherwise 403 with `details.code` `NOAH_FUNCTION_OFF`, and offer cryptoCurrency for payout, otherwise 400 `NOAH_PAIR_UNAVAILABLE` naming the currencies it offers; both are checked before an Idempotency-Key is replayed. A tenant whose banking provider is not the bank ramp gets 403. Returns a URL where the user completes the payout (bank account, confirmation) in the bank ramp's hosted UI. Requires prior KYC approval through the bank ramp's pay-in onboarding flow (POST /v1/ramp/bank/payin/onboard-session). cryptoCurrency must have a payout pair in the bank ramp's currency registry (GET /v1/ramp/bank/currencies), otherwise 400 with details.code NOAH_PAIR_UNAVAILABLE; cryptoAmount is read with that currency's decimals. The return URL must be one the tenant allows: a deep link or an https origin the Aurea operator has added. Anything else is refused with 400 and `details.code` `RETURN_URL_NOT_ALLOWED`. A tenant whose list is still empty is not checked. When Aurea requires a passkey step-up for money out, the request carries the user's step-up token for `bank_ramp.payout` (POST /v1/auth/step-up/options, then POST /v1/auth/step-up) in the `x-aurea-step-up` header, otherwise 403 `STEP_UP_REQUIRED` (`STEP_UP_INVALID` for a token that is not one, another user's, another action's or one already used); a replay of an answered Idempotency-Key needs none.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"cryptoCurrency":{"type":"string","minLength":1,"description":"A bank ramp currency code with a payout pair in GET /v1/ramp/bank/currencies, e.g. EURC_TEST. In sandbox an asset code such as EURC is read as EURC_TEST."},"cryptoAmount":{"type":"string","minLength":1,"pattern":"^\\d+$","description":"Integer string in the token's smallest unit, with the decimals GET /v1/ramp/bank/currencies lists for the currency: 25000000 is 25 with 6 decimals."},"fiatCurrency":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"returnUrl":{"type":"string","format":"uri"},"isTestnet":{"type":"boolean","default":false}},"required":["cryptoCurrency","cryptoAmount","fiatCurrency","returnUrl"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of creating a second one, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; a key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"payoutId":{"type":"string","format":"uuid"},"checkoutUrl":{"type":"string"},"fiatAmount":{"type":"string"},"fiatCurrency":{"type":"string"},"exchangeRate":{"type":"string"},"expiresAt":{"type":["null","string"]}},"required":["payoutId","checkoutUrl","fiatAmount","fiatCurrency","expiresAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/payout/transactions":{"get":{"summary":"List payout transactions","tags":["bank-ramp-payout"],"description":"Retrieve a paginated list of the authenticated user's fiat payout records in one bank ramp environment: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted.","parameters":[{"schema":{"type":"string","default":"1"},"in":"query","name":"page","required":false},{"schema":{"type":"string","default":"20"},"in":"query","name":"limit","required":false,"description":"Maximum 100"},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"payouts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"checkoutUrl":{"type":"string"},"checkoutExpiresAt":{"type":"string"},"cryptoCurrency":{"type":"string"},"cryptoAuthorizedAmount":{"type":"string"},"fiatCurrency":{"type":"string"},"fiatAmount":{"type":"string"},"exchangeRate":{"type":"string"},"status":{"type":"string"},"noahTransactionId":{"type":"string"},"bankRampTransactionId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"returnUrl":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","externalId","cryptoCurrency","cryptoAuthorizedAmount","fiatCurrency","fiatAmount","status","returnUrl","createdAt","updatedAt"],"additionalProperties":false}},"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"}},"required":["payouts","total","page","limit","totalPages"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payout/transactions/{id}":{"get":{"summary":"Get payout transaction by ID","tags":["bank-ramp-payout"],"description":"Retrieve details of a specific payout record. Only accessible by the owning user, and only in the bank ramp environment named by `isTestnet` (sandbox with `true`, production when false or omitted); a payout of the other environment returns 404.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"checkoutUrl":{"type":"string"},"checkoutExpiresAt":{"type":"string"},"cryptoCurrency":{"type":"string"},"cryptoAuthorizedAmount":{"type":"string"},"fiatCurrency":{"type":"string"},"fiatAmount":{"type":"string"},"exchangeRate":{"type":"string"},"status":{"type":"string"},"noahTransactionId":{"type":"string"},"bankRampTransactionId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"returnUrl":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","externalId","cryptoCurrency","cryptoAuthorizedAmount","fiatCurrency","fiatAmount","status","returnUrl","createdAt","updatedAt"],"additionalProperties":false}}}}}}},"/v1/ramp/bank/payout/return":{"get":{"summary":"Bank ramp payout checkout return handler","tags":["bank-ramp-payout"],"description":"HTTPS endpoint the bank ramp redirects to after payout checkout. Looks up the session's app_return_url and 302-redirects the browser (typically a mobile webview) back to the deep link. The redirect is written only to an address the tenant still allows; anything else is refused with 400 and `details.code` `RETURN_URL_NOT_ALLOWED`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"session","required":false,"description":"ExternalID of the payout session"}],"responses":{"302":{"description":"Redirect to the app return URL"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"No payout session with that id, or one without an app return URL (`{ error }`)","content":{"application/json":{"schema":{"type":"object","description":"No payout session with that id, or one without an app return URL (`{ error }`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/payout/sandbox/simulate":{"post":{"summary":"Simulate payout completion (Sandbox only)","tags":["bank-ramp-payout","sandbox"],"description":"Simulate a payout webhook event for testing purposes, on one of the user's sandbox payouts. A production payout, or another user's, returns 404. The tenant must have switched bank ramp payouts on in the sandbox, otherwise 403 with details.code NOAH_FUNCTION_OFF.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"payoutId":{"type":"string","format":"uuid"},"outcome":{"type":"string","enum":["completed","failed"],"default":"completed"}},"required":["payoutId"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/currencies":{"get":{"summary":"List the bank ramp's currencies and networks","tags":["bank-ramp-currencies"],"description":"The currency and network pairs a client can use with the bank ramp in one environment: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted. A tenant's user sees the pairs the tenant offers there — enabled by Aurea for pay-in, payout or both, and taken by the tenant for that use — and none when the tenant never switched the bank ramp on in that environment; an Aurea administrator's token, which names no tenant, sees every enabled pair. The bank ramp's own names, sorted by cryptoCurrency and then network. A pay-in or payout request for any other pair answers 400 with details.code NOAH_PAIR_UNAVAILABLE. Answers 403 when the tenant's banking provider is not the bank ramp.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","currencies"],"properties":{"environment":{"type":"string","enum":["production","sandbox"],"description":"The bank ramp environment the pairs belong to."},"currencies":{"type":"array","items":{"type":"object","required":["asset","cryptoCurrency","network","addressFormat","chainId","tokenAddress","decimals","payin","payout"],"properties":{"asset":{"type":"string","description":"The asset, the same in both environments, e.g. EURC."},"cryptoCurrency":{"type":"string","description":"The bank ramp's currency code: the asset in production, the asset with _TEST in sandbox (e.g. EURC_TEST)."},"network":{"type":"string","description":"The bank ramp's network name, e.g. Solana in production, SolanaDevnet or PolygonTestAmoy in sandbox."},"addressFormat":{"type":"string","enum":["evm","solana"],"description":"Format of a destination address on this network: evm (0x and 40 hex characters) or solana (base58)."},"chainId":{"type":["integer","null"],"description":"EVM chain id of the network; null on Solana."},"tokenAddress":{"type":"string","description":"Token contract address (EVM) or mint address (Solana)."},"decimals":{"type":"integer","description":"Decimals of the token."},"payin":{"type":"boolean","description":"true when POST /v1/ramp/bank/payin/initiate accepts this cryptoCurrency and network."},"payout":{"type":"boolean","description":"true when POST /v1/ramp/bank/payout/initiate accepts this cryptoCurrency."}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/settings":{"get":{"summary":"What this tenant offers with the bank ramp","tags":["bank-ramp-currencies"],"description":"What the tenant lets its users do with the bank ramp in one environment: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted. `switchedOn` is false when the tenant never switched the bank ramp on there, and then every function is off and no currency is offered. `functions` says whether KYC, pay-in and payout may be started; `modes` whether pay-ins go to the user's Aurea wallets or to verified external addresses; `currencies` the pairs the tenant offers, each for pay-in, payout or both; `fees` the business fee the bank ramp charges per flow and payment method type (null is every other type; amounts are decimals written as text). Answers 403 for a token without a tenant, or when the tenant's banking provider is not the bank ramp.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","switchedOn","functions","modes","currencies","fees"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"switchedOn":{"type":"boolean"},"functions":{"type":"object","required":["kyc","payin","payout"],"properties":{"kyc":{"type":"boolean"},"payin":{"type":"boolean"},"payout":{"type":"boolean"}}},"modes":{"type":"object","required":["aureaWallets","standalone"],"properties":{"aureaWallets":{"type":"boolean"},"standalone":{"type":"boolean"}}},"currencies":{"type":"array","items":{"type":"object","required":["asset","cryptoCurrency","network","addressFormat","chainId","tokenAddress","decimals","payin","payout"],"properties":{"asset":{"type":"string","description":"The asset, the same in both environments, e.g. EURC."},"cryptoCurrency":{"type":"string","description":"The bank ramp's currency code: the asset in production, the asset with _TEST in sandbox (e.g. EURC_TEST)."},"network":{"type":"string","description":"The bank ramp's network name, e.g. Solana in production, SolanaDevnet or PolygonTestAmoy in sandbox."},"addressFormat":{"type":"string","enum":["evm","solana"],"description":"Format of a destination address on this network: evm (0x and 40 hex characters) or solana (base58)."},"chainId":{"type":["integer","null"],"description":"EVM chain id of the network; null on Solana."},"tokenAddress":{"type":"string","description":"Token contract address (EVM) or mint address (Solana)."},"decimals":{"type":"integer","description":"Decimals of the token."},"payin":{"type":"boolean","description":"true when POST /v1/ramp/bank/payin/initiate accepts this cryptoCurrency and network."},"payout":{"type":"boolean","description":"true when POST /v1/ramp/bank/payout/initiate accepts this cryptoCurrency."}}}},"fees":{"type":"array","items":{"type":"object","required":["flow","paymentMethodType","feePct","feeBase","fiatCurrency"],"properties":{"flow":{"type":"string","enum":["payin","payout"]},"paymentMethodType":{"type":["string","null"]},"feePct":{"type":"string"},"feeBase":{"type":"string"},"fiatCurrency":{"type":["string","null"]}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/addresses/challenge":{"post":{"summary":"Ask for the message that proves an address","tags":["bank-ramp-addresses"],"description":"Issues a challenge for one address of the user: a message naming the tenant, the user, the address, its kind, the environment, a random nonce and an expiry ten minutes away. Sign it with the address's key and send the signature to POST /v1/ramp/bank/addresses/verify. A user has at most 5 open challenges: beyond that 409 `NOAH_ADDRESS_CHALLENGE_LIMIT`. An address that is not one of its kind answers 400 `NOAH_ADDRESS_INVALID`. EVM: an EIP-191 personal_sign of the message, from the externally owned account of the address (a smart account cannot prove an address this way); one proof covers every EVM chain. Solana: an ed25519 signature of the message's UTF-8 bytes, written in base58. Only where the tenant has the standalone mode switched on in that environment, otherwise 403 with `details.code` `NOAH_MODE_OFF`. Answers 403 to a token without a tenant, and when the tenant's banking provider is not the bank ramp.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","minLength":1,"maxLength":100},"isTestnet":{"type":"boolean","default":false}},"required":["family","address"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["challengeId","family","address","environment","message","issuedAt","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"The address in the form it is stored and signed for"},"environment":{"type":"string","enum":["production","sandbox"]},"message":{"type":"string","description":"Exactly the text to sign, line breaks included"},"issuedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"Ten minutes after issuedAt"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/addresses/verify":{"post":{"summary":"Prove an address with the signed challenge","tags":["bank-ramp-addresses"],"description":"Checks the signature of one of the user's challenges and keeps the address it proves: 201 with the address, or 200 with the address already proven. A wrong or unreadable signature answers 400 `NOAH_ADDRESS_SIGNATURE_INVALID` with `details.attemptsLeft`; the fifth one burns the challenge (400 `NOAH_ADDRESS_CHALLENGE_BURNT`). An expired challenge answers 400 `NOAH_ADDRESS_CHALLENGE_EXPIRED` whatever the signature, a challenge already used 409 `NOAH_ADDRESS_CHALLENGE_USED`, and a challenge that is not the user's 404. Ask for a new challenge in each of those cases. Only where the tenant has the standalone mode switched on in that environment, otherwise 403 with `details.code` `NOAH_MODE_OFF`. Answers 403 to a token without a tenant, and when the tenant's banking provider is not the bank ramp.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","minLength":1,"maxLength":200},"label":{"type":"string","maxLength":100}},"required":["challengeId","signature"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"Stored in one form: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"Stored in one form: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/addresses/":{"get":{"summary":"List the addresses the user proved","tags":["bank-ramp-addresses"],"description":"The addresses the user proved in one environment and has not revoked, oldest first: sandbox with `isTestnet=true`, production when `isTestnet` is false or omitted. Answers whatever the tenant's settings, so a user always sees what they proved; 403 to a token without a tenant, and when the tenant's banking provider is not the bank ramp.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","addresses"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"addresses":{"type":"array","items":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"Stored in one form: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/addresses/{id}":{"delete":{"summary":"Stop using an address the user proved","tags":["bank-ramp-addresses"],"description":"Revokes one of the user's proven addresses: 204, or 404 when the user holds no such address. Answers whatever the tenant's settings. A revoked address can be proven again with a new challenge. While one of the user's payouts is still waiting for a deposit from that address, it answers `409` `NOAH_ADDRESS_IN_USE` with the `payoutId` waiting and the `expiresAt` its rule stops holding the address, and the address is kept.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Address id"}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/bank/customer":{"post":{"summary":"Make the user a customer of the bank ramp","tags":["bank-ramp-customers"],"description":"Creates the user's customer profile at the bank ramp in one environment (`isTestnet`), personal or corporate: 201 when the bank ramp confirmed it in this call, 200 with the customer it already has. One customer per user and environment; asking for another kind answers 409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`. The profile's id is Aurea's and is kept before the bank ramp is asked, so a call that failed half way can simply be repeated. The tenant must have the bank ramp's KYC switched on in the environment (403 `BANK_RAMP_FUNCTION_OFF` otherwise). A token without a tenant answers 403. The tenant's KYC strategy must be one where the tenant sends the data (reliance or Sumsub sharing; 403 `BANK_RAMP_KYC_STRATEGY_OFF` with the hosted pages), and the kind one the tenant offers (400 `BANK_RAMP_PROFILE_KIND_UNAVAILABLE`). Without the tenant's bank ramp credentials: 503 `BANK_RAMP_NOT_CONFIGURED`, nothing kept. The bank ramp's refusals answer `BANK_RAMP_*` codes (403 `BANK_RAMP_PARTNER_REQUIRED`, 400 `BANK_RAMP_INVALID_REQUEST`, 503 `BANK_RAMP_UNAVAILABLE`…). An optional `Idempotency-Key` header answers a repeated call with the first call's answer.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false},"kind":{"type":"string","enum":["personal","corporate"]}},"required":["kind"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"400":{"description":"The body is not valid, or the kind is not offered (`BANK_RAMP_PROFILE_KIND_UNAVAILABLE`), or the bank ramp refused the request's fields (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the kind is not offered (`BANK_RAMP_PROFILE_KIND_UNAVAILABLE`), or the bank ramp refused the request's fields (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The user is a customer of the other kind (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"The user is a customer of the other kind (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The user's bank ramp customer","tags":["bank-ramp-customers"],"description":"The user's customer in one environment as Aurea keeps it — its state, its sections, and the next step — whatever the tenant's settings, so a customer always sees where it stands. Without a customer: `customer` null and `nextStep` start_onboarding, or 403 `BANK_RAMP_FUNCTION_OFF` when the tenant's KYC is off. The bank ramp's changes arrive by its notifications; POST /v1/ramp/bank/customer/sync reads it now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"403":{"description":"No tenant, or no customer and the tenant's KYC is off (`BANK_RAMP_FUNCTION_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or no customer and the tenant's KYC is off (`BANK_RAMP_FUNCTION_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/sync":{"post":{"summary":"Read the user's bank ramp customer now","tags":["bank-ramp-customers"],"description":"Reads the customer's profile at the bank ramp now and keeps what it says, along the bank ramp's documented transitions (a state it moves to outside them is kept out, and the customer keeps its state). A customer the bank ramp never confirmed is created again with its id. 404 `BANK_RAMP_CUSTOMER_NOT_FOUND` without a customer; 503 `BANK_RAMP_NOT_CONFIGURED` without the tenant's credentials.","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted (or no body) for production."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"400":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the bank ramp refused the read","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the bank ramp refused the read","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/details":{"patch":{"summary":"Send the customer's details","tags":["bank-ramp-customers"],"description":"The customer's identity details (a person: name, address, nationality, birthday, contacts, the identity document; a company: its registration, address, representatives, beneficial owners and directors). Reliance only. A body that does not pass answers 400 `BANK_RAMP_KYC_DATA_INVALID` with the names of the fields, never their values. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) and its strategy must send this data through Aurea (403 `BANK_RAMP_KYC_STRATEGY_OFF`): with reliance the tenant sends details, form, every verification and documents; with Sumsub sharing it shares the applicant, then sends the form, the `sourceOfFunds` verification and documents; with the hosted pages none of these. The customer must exist (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) and be of the kind the body names (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`). The bank ramp's refusals answer `BANK_RAMP_*` codes (409 `BANK_RAMP_CONFLICT` while it reviews the section, 400 `BANK_RAMP_INVALID_REQUEST` with the names of the fields it refused). Aurea keeps nothing of the data.","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The customer's identity details (a person: name, address, nationality, birthday, contacts, the identity document; a company: its registration, address, representatives, beneficial owners and directors). Reliance only. Exactly one of `personal` and `corporate`, as the customer's kind.","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"personal":{"type":"object","properties":{"firstName":{"type":"string","maxLength":255},"lastName":{"type":"string","maxLength":255},"address":{"type":"string","maxLength":70},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"countryState":{"type":"string","maxLength":255},"nationality":{"type":"string","minLength":2,"maxLength":2},"birthday":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d|3[01])$"},"phone":{"type":"string","maxLength":30},"email":{"type":"string","format":"email","maxLength":254},"idDocument":{"type":"object","properties":{"number":{"type":"string","maxLength":100},"kind":{"type":"string","enum":["passport","nationalIdentityCard"]}},"required":["number","kind"],"additionalProperties":false}},"required":["firstName","lastName","address","postalCode","city","country","nationality","birthday","phone","email"],"additionalProperties":false},"corporate":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"registrationNumber":{"type":"string","maxLength":100},"registrationDate":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d|3[01])$"},"vatNumber":{"type":"string","maxLength":100},"website":{"type":"string","maxLength":255},"address":{"type":"string","maxLength":70},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"countryState":{"type":"string","maxLength":255},"representatives":{"type":"array","items":{"type":"object","properties":{"firstName":{"type":"string","maxLength":255},"lastName":{"type":"string","maxLength":255},"address":{"type":"string","maxLength":70},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"countryState":{"type":"string","maxLength":255},"nationality":{"type":"string","minLength":2,"maxLength":2},"birthday":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d|3[01])$"},"phone":{"type":"string","maxLength":30},"email":{"type":"string","format":"email","maxLength":254},"idDocument":{"type":"object","properties":{"number":{"type":"string","maxLength":100},"kind":{"type":"string","enum":["passport","nationalIdentityCard"]}},"required":["number","kind"],"additionalProperties":false}},"required":["firstName","lastName","address","postalCode","city","country","nationality","birthday","phone","email","idDocument"],"additionalProperties":false},"maxItems":50},"finalBeneficiaries":{"type":"array","items":{"type":"object","properties":{"firstName":{"type":"string","maxLength":255},"lastName":{"type":"string","maxLength":255},"address":{"type":"string","maxLength":70},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"countryState":{"type":"string","maxLength":255},"nationality":{"type":"string","minLength":2,"maxLength":2},"birthday":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d|3[01])$"},"phone":{"type":"string","maxLength":30},"email":{"type":"string","format":"email","maxLength":254},"ownershipPercentage":{"type":"string","pattern":"^(?:25(?:\\.0{1,2})?|2[6-9](?:\\.\\d{1,2})?|[3-9]\\d(?:\\.\\d{1,2})?|100(?:\\.0{1,2})?)$"}},"required":["firstName","lastName","address","postalCode","city","country","nationality","birthday","phone","email","ownershipPercentage"],"additionalProperties":false},"maxItems":50},"directors":{"type":"array","items":{"type":"object","properties":{"firstName":{"type":"string","maxLength":255},"lastName":{"type":"string","maxLength":255},"address":{"type":"string","maxLength":70},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"countryState":{"type":"string","maxLength":255},"nationality":{"type":"string","minLength":2,"maxLength":2},"birthday":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1\\d|2\\d|3[01])$"},"phone":{"type":"string","maxLength":30},"email":{"type":"string","format":"email","maxLength":254}},"required":["firstName","lastName","address","postalCode","city","country","nationality","birthday","phone","email"],"additionalProperties":false},"maxItems":50}},"required":["name","registrationNumber","address","postalCode","city","country","countryState","representatives","finalBeneficiaries","directors"],"additionalProperties":false}}}}},"description":"The customer's identity details (a person: name, address, nationality, birthday, contacts, the identity document; a company: its registration, address, representatives, beneficial owners and directors). Reliance only. Exactly one of `personal` and `corporate`, as the customer's kind."},"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification","accepted"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}},"accepted":{"type":"string","enum":["details","form","verifications","share","files"],"description":"The section the bank ramp received for review. The customer's states move with the bank ramp's review: read the customer again, or sync it."}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","content":{"application/json":{"schema":{"type":"object","description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/form":{"patch":{"summary":"Send the customer's risk form","tags":["bank-ramp-customers"],"description":"The customer's risk form (occupation or activity, origin of funds, income and turnover ranges, tax residence). A body that does not pass answers 400 `BANK_RAMP_KYC_DATA_INVALID` with the names of the fields, never their values. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) and its strategy must send this data through Aurea (403 `BANK_RAMP_KYC_STRATEGY_OFF`): with reliance the tenant sends details, form, every verification and documents; with Sumsub sharing it shares the applicant, then sends the form, the `sourceOfFunds` verification and documents; with the hosted pages none of these. The customer must exist (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) and be of the kind the body names (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`). The bank ramp's refusals answer `BANK_RAMP_*` codes (409 `BANK_RAMP_CONFLICT` while it reviews the section, 400 `BANK_RAMP_INVALID_REQUEST` with the names of the fields it refused). Aurea keeps nothing of the data.","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The customer's risk form (occupation or activity, origin of funds, income and turnover ranges, tax residence). Exactly one of `personal` and `corporate`, as the customer's kind.","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"personal":{"type":"object","properties":{"occupation":{"type":"string","enum":["OCCUPATION_STUDENT","OCCUPATION_EMPLOYED","OCCUPATION_SELF_EMPLOYED","OCCUPATION_UNEMPLOYED","OCCUPATION_RETIRED"]},"profession":{"type":"string","enum":["PROFESSION_ACCOUNTANCY","PROFESSION_ADMINISTRATIVE","PROFESSION_AGRICULTURE","PROFESSION_ARTS_ENTERTAINMENT_MEDIA","PROFESSION_BROKER_DEALER","PROFESSION_CATERING_HOSPITALITY_TOURISM","PROFESSION_CHARITY","PROFESSION_CONSTRUCTION_REAL_ESTATE","PROFESSION_DEALER_HIGH_VALUE_GOODS","PROFESSION_DEALER_PRECIOUS_METALS","PROFESSION_EDUCATION","PROFESSION_EMERGENCY_SERVICES","PROFESSION_EXTRACTIVE_INDUSTRY","PROFESSION_FINANCIAL_SERVICES_BANKING","PROFESSION_FINANCIAL_SERVICES_INSURANCE","PROFESSION_FINANCIAL_SERVICES_OTHER","PROFESSION_FINANCIAL_SERVICES_PRIVATE_BANKING","PROFESSION_GAMBLING","PROFESSION_GOVERNMENT","PROFESSION_HEALTH_CARE","PROFESSION_INFORMATION_TECHNOLOGY","PROFESSION_LEGAL","PROFESSION_MANUFACTURING","PROFESSION_MARKETING","PROFESSION_MILITARY","PROFESSION_MONEY_SERVICE_BUSINESS","PROFESSION_PENSIONER","PROFESSION_PUBLIC_PROCUREMENT","PROFESSION_RETAIL_SALES"]},"fundOrigin":{"type":"string","enum":["FUND_ORIGIN_SALARY","FUND_ORIGIN_DIVIDENDS","FUND_ORIGIN_INHERITANCE","FUND_ORIGIN_SAVINGS","FUND_ORIGIN_INVESTMENT","FUND_ORIGIN_GIFT","FUND_ORIGIN_MINING","FUND_ORIGIN_REAL_ESTATE","FUND_ORIGIN_LOAN"]},"annualIncome":{"type":"string","enum":["ANNUAL_INCOME_UNDER_10K","ANNUAL_INCOME_FROM_10K_TO_50K","ANNUAL_INCOME_FROM_50K_TO_150K","ANNUAL_INCOME_FROM_150K_TO_300K","ANNUAL_INCOME_MORE_THAN_300K"]},"monthlyTurnover":{"type":"string","enum":["TURNOVER_UNDER_10K","TURNOVER_10K_TO_50K","TURNOVER_50K_TO_150K","TURNOVER_150K_TO_500K","TURNOVER_MORE_THAN_500K"]},"monthlyTransactionCount":{"type":"string","enum":["TRANSACTION_COUNT_UNDER_5","TRANSACTION_COUNT_5_TO_50","TRANSACTION_COUNT_50_TO_100","TRANSACTION_COUNT_100_TO_200","TRANSACTION_COUNT_MORE_THAN_200"]},"activities":{"type":"array","items":{"type":"string","enum":["ACTIVITY_COMMERCE_SELLING","ACTIVITY_COMMERCE_BUYING","ACTIVITY_INVESTING_CRYPTO","ACTIVITY_OTHER"]},"maxItems":4},"activityOther":{"type":"string","maxLength":500},"publicFunction":{"type":"boolean"},"fundOwner":{"type":"boolean"},"usCitizen":{"type":"boolean"},"usTaxPerson":{"type":"boolean"},"tin":{"type":"string","maxLength":50},"taxResidenceCountry":{"type":"string","minLength":2,"maxLength":2}},"required":["occupation","profession","fundOrigin","annualIncome","monthlyTurnover","monthlyTransactionCount","activities","publicFunction","fundOwner","usCitizen","usTaxPerson","tin","taxResidenceCountry"],"additionalProperties":false},"corporate":{"type":"object","properties":{"service":{"type":"string","maxLength":500},"legalForm":{"type":"string","enum":["LEGAL_FORM_PUBLIC_LIMITED","LEGAL_FORM_PRIVATE_LIMITED","LEGAL_FORM_PARTNERSHIPS","LEGAL_FORM_SOLE_TRADERS_PROPRIETORSHIPS","LEGAL_FORM_PUBLIC_AUTHORITIES","LEGAL_FORM_NON_PROFIT","LEGAL_FORM_BRANCHES","LEGAL_FORM_OTHER"]},"purpose":{"type":"string","enum":["PURPOSE_COLLECTING_PAYMENTS","PURPOSE_PAYING_FOR_GOODS","PURPOSE_BUY_SELL_CRYPTO_CURRENCIES","PURPOSE_ENGAGE_IN_DEFI","PURPOSE_OTHER"]},"activity":{"type":"string","enum":["ACTIVITY_ACCOMMODATION_FOOD_TRAVEL","ACTIVITY_ACCOUNTING_LEGAL_CONSULTANCY","ACTIVITY_ADULT_ENTERTAINMENT","ACTIVITY_ADVERTISING","ACTIVITY_AGRICULTURE","ACTIVITY_ARTS_ENTERTAINMENT","ACTIVITY_CHARITY","ACTIVITY_CONSTRUCTION","ACTIVITY_DEALER_HIGH_VALUE_GOODS","ACTIVITY_ECOMMERCE","ACTIVITY_EDUCATION","ACTIVITY_EXTRACTIVE_INDUSTRY","ACTIVITY_GAMBLING","ACTIVITY_HEALTH_SERVICES","ACTIVITY_MANUFACTURING","ACTIVITY_MARKETPLACE","ACTIVITY_MEDIA","ACTIVITY_MULTI_LEVEL_MARKETING","ACTIVITY_PERSONAL_INVESTMENT","ACTIVITY_PUBLIC_SECTOR","ACTIVITY_REAL_ESTATE","ACTIVITY_RETAIL","ACTIVITY_SOCIAL_WORK","ACTIVITY_SOFTWARE_TECHNOLOGY","ACTIVITY_TELECOM","ACTIVITY_TRANSPORTATION","ACTIVITY_UTILITIES","ACTIVITY_CRYPTO_SERVICES","ACTIVITY_FINANCIAL_INSTITUTION","ACTIVITY_OTHER"]},"fundOrigin":{"type":"string","enum":["FUND_ORIGIN_REVENUE","FUND_ORIGIN_PROFIT_DIVIDENDS","FUND_ORIGIN_LOAN","FUND_ORIGIN_INVESTMENTS","FUND_ORIGIN_CUSTOMER_FUNDS","FUND_ORIGIN_THIRD_PARTIES_FUNDS"]},"monthlyTurnover":{"type":"string","enum":["TURNOVER_UNDER_100K","TURNOVER_100K_TO_250K","TURNOVER_MORE_THAN_250K"]},"monthlyTransactionCount":{"type":"string","enum":["TRANSACTION_COUNT_UNDER_100","TRANSACTION_COUNT_100_TO_250","TRANSACTION_COUNT_MORE_THAN_250"]}},"required":["service","purpose","activity","fundOrigin","monthlyTurnover","monthlyTransactionCount"],"additionalProperties":false}}}}},"description":"The customer's risk form (occupation or activity, origin of funds, income and turnover ranges, tax residence). Exactly one of `personal` and `corporate`, as the customer's kind."},"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification","accepted"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}},"accepted":{"type":"string","enum":["details","form","verifications","share","files"],"description":"The section the bank ramp received for review. The customer's states move with the bank ramp's review: read the customer again, or sync it."}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","content":{"application/json":{"schema":{"type":"object","description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/verifications":{"patch":{"summary":"Send the customer's verifications","tags":["bank-ramp-customers"],"description":"The verifications given are updated, each with documents uploaded before (POST /v1/ramp/bank/customer/files): a document that is not this customer's answers 400 `BANK_RAMP_KYC_FILE_UNKNOWN`, a kind the strategy does not send 400 `BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`. A body that does not pass answers 400 `BANK_RAMP_KYC_DATA_INVALID` with the names of the fields, never their values. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) and its strategy must send this data through Aurea (403 `BANK_RAMP_KYC_STRATEGY_OFF`): with reliance the tenant sends details, form, every verification and documents; with Sumsub sharing it shares the applicant, then sends the form, the `sourceOfFunds` verification and documents; with the hosted pages none of these. The customer must exist (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) and be of the kind the body names (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`). The bank ramp's refusals answer `BANK_RAMP_*` codes (409 `BANK_RAMP_CONFLICT` while it reviews the section, 400 `BANK_RAMP_INVALID_REQUEST` with the names of the fields it refused). Aurea keeps nothing of the data.","requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The verifications given are updated, each with documents uploaded before (POST /v1/ramp/bank/customer/files): a document that is not this customer's answers 400 `BANK_RAMP_KYC_FILE_UNKNOWN`, a kind the strategy does not send 400 `BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`. Exactly one of `personal` and `corporate`, as the customer's kind.","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"personal":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["idDocument","facialSimilarity","proofOfResidency","sourceOfFunds"]},"documents":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["passport","nationalIdentityCard","drivingLicense","residencePermit","proofOfResidency","sourceOfFunds","companyFilePDF","other"]},"fileId":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"side":{"type":"string","enum":["front","back"]}},"required":["fileId"],"additionalProperties":false},"maxItems":10}},"required":["kind"],"additionalProperties":false},"minItems":1,"maxItems":4},"corporate":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["sourceOfFunds","corporateName","corporateAddress","registrationNumber","dateOfRegistration","beneficialOwnership","powerOfAttorney","idDocument","proofOfResidency"]},"personId":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"documents":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["passport","nationalIdentityCard","drivingLicense","residencePermit","proofOfResidency","sourceOfFunds","companyFilePDF","other"]},"fileId":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"side":{"type":"string","enum":["front","back"]}},"required":["fileId"],"additionalProperties":false},"maxItems":10}},"required":["kind"],"additionalProperties":false},"minItems":1,"maxItems":100}}}}},"description":"The verifications given are updated, each with documents uploaded before (POST /v1/ramp/bank/customer/files): a document that is not this customer's answers 400 `BANK_RAMP_KYC_FILE_UNKNOWN`, a kind the strategy does not send 400 `BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`. Exactly one of `personal` and `corporate`, as the customer's kind."},"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification","accepted"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}},"accepted":{"type":"string","enum":["details","form","verifications","share","files"],"description":"The section the bank ramp received for review. The customer's states move with the bank ramp's review: read the customer again, or sync it."}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","content":{"application/json":{"schema":{"type":"object","description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/share":{"post":{"summary":"Share the customer's KYC applicant","tags":["bank-ramp-customers"],"description":"Shares the applicant the tenant verified with its Sumsub account: the bank ramp reads the applicant's details and verifications with the token and moves the sections it can fill to review. Sumsub sharing only, for a personal customer (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH` for a company). The token is passed on, never kept or logged. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) and its strategy must send this data through Aurea (403 `BANK_RAMP_KYC_STRATEGY_OFF`): with reliance the tenant sends details, form, every verification and documents; with Sumsub sharing it shares the applicant, then sends the form, the `sourceOfFunds` verification and documents; with the hosted pages none of these. The customer must exist (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) and be of the kind the body names (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`). The bank ramp's refusals answer `BANK_RAMP_*` codes (409 `BANK_RAMP_CONFLICT` while it reviews the section, 400 `BANK_RAMP_INVALID_REQUEST` with the names of the fields it refused). Aurea keeps nothing of the data.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["token"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"token":{"type":"string","minLength":1,"maxLength":512,"description":"The applicant's share token, issued by the tenant's Sumsub account."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification","accepted"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}},"accepted":{"type":"string","enum":["details","form","verifications","share","files"],"description":"The section the bank ramp received for review. The customer's states move with the bank ramp's review: read the customer again, or sync it."}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_KYC_DATA_INVALID`, field names only), a verification the strategy does not send (`BANK_RAMP_KYC_VERIFICATION_UNAVAILABLE`), a document that is not the customer's (`BANK_RAMP_KYC_FILE_UNKNOWN`), or the bank ramp refused fields (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused (`BANK_RAMP_PARTNER_REQUIRED`, `BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","content":{"application/json":{"schema":{"type":"object","description":"The body is for the other kind of customer (`BANK_RAMP_CUSTOMER_KIND_MISMATCH`), or the bank ramp is reviewing the section (`BANK_RAMP_CONFLICT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/files":{"post":{"summary":"Upload a document for the customer's verifications","tags":["bank-ramp-customers"],"description":"A multipart upload with one `file`: a PDF or JPEG of at most 5 MB, recognised by its bytes (400 `BANK_RAMP_KYC_FILE_INVALID` otherwise; 413 above the API's upload limit). The bank ramp receives it under a neutral name; Aurea keeps its id, type, size and SHA-256, never the bytes or the file's name. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) and its strategy must send this data through Aurea (403 `BANK_RAMP_KYC_STRATEGY_OFF`): with reliance the tenant sends details, form, every verification and documents; with Sumsub sharing it shares the applicant, then sends the form, the `sourceOfFunds` verification and documents; with the hosted pages none of these. The customer must exist (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) and be of the kind the body names (409 `BANK_RAMP_CUSTOMER_KIND_MISMATCH`). The bank ramp's refusals answer `BANK_RAMP_*` codes (409 `BANK_RAMP_CONFLICT` while it reviews the section, 400 `BANK_RAMP_INVALID_REQUEST` with the names of the fields it refused). Aurea keeps nothing of the data.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["fileId","contentType","sizeBytes","sha256","environment","createdAt"],"properties":{"fileId":{"type":"string","format":"uuid","description":"The document's id at the bank ramp: name it in a verification's `documents`."},"contentType":{"type":"string","enum":["application/pdf","image/jpeg"]},"sizeBytes":{"type":"integer"},"sha256":{"type":"string","description":"The SHA-256 of the document's bytes, in hex."},"environment":{"type":"string","enum":["production","sandbox"]},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"No file, or not a PDF or JPEG of at most 5 MB (`BANK_RAMP_KYC_FILE_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"No file, or not a PDF or JPEG of at most 5 MB (`BANK_RAMP_KYC_FILE_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or its strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`); the bank ramp refused","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp in this environment (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The upload is larger than the API takes","content":{"application/json":{"schema":{"type":"object","description":"The upload is larger than the API takes","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The customer's documents","tags":["bank-ramp-customers"],"description":"The documents uploaded for the customer in one environment, newest first; an empty list without a customer.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["documents"],"properties":{"documents":{"type":"array","items":{"type":"object","required":["fileId","contentType","sizeBytes","sha256","environment","createdAt"],"properties":{"fileId":{"type":"string","format":"uuid","description":"The document's id at the bank ramp: name it in a verification's `documents`."},"contentType":{"type":"string","enum":["application/pdf","image/jpeg"]},"sizeBytes":{"type":"integer"},"sha256":{"type":"string","description":"The SHA-256 of the document's bytes, in hex."},"environment":{"type":"string","enum":["production","sandbox"]},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/authorize":{"post":{"summary":"Start the user's authorization on the bank ramp's pages","tags":["bank-ramp-customers"],"description":"For a tenant whose KYC goes through the bank ramp's own pages: answers the URL to send the user to, where they sign up, complete their KYC and grant the tenant's application access. The bank ramp then sends the user back to `redirectUri` (one the tenant's application registered with it) with `code` and `state`: hand both to POST /v1/ramp/bank/customer/authorize/complete. The PKCE verifier stays with Aurea; the `state` is signed, names this user and request, is used once and lasts a day (`expiresAt`). `redirectUri` is an https URL, http to the local machine, or an app's own scheme, without a fragment (400 `BANK_RAMP_REDIRECT_URI_INVALID` otherwise). The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) with the hosted strategy (403 `BANK_RAMP_KYC_STRATEGY_OFF`), and its bank ramp configured with an authorization client (503 `BANK_RAMP_NOT_CONFIGURED`). A token without a tenant answers 403.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["redirectUri"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"redirectUri":{"type":"string","minLength":1,"maxLength":2000},"authMode":{"type":"string","enum":["login","signup"],"description":"Which of the bank ramp's screens comes first."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","authorizationUrl","state","expiresAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"authorizationUrl":{"type":"string","description":"Where to send the user (a browser, or an in-app browser)."},"state":{"type":"string","description":"The value the bank ramp sends back with the code; it is also in the URL."},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, or the redirect URI is not one the bank ramp can send the user back to (`BANK_RAMP_REDIRECT_URI_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the redirect URI is not one the bank ramp can send the user back to (`BANK_RAMP_REDIRECT_URI_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or the hosted strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or the hosted strategy is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_KYC_STRATEGY_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured for the hosted pages (`BANK_RAMP_NOT_CONFIGURED`)","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured for the hosted pages (`BANK_RAMP_NOT_CONFIGURED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"Whether the user's authorization is kept","tags":["bank-ramp-customers"],"description":"Whether Aurea keeps the user's authorization at the bank ramp in one environment, for which customer, and the code its last use failed with: `BANK_RAMP_AUTHORIZATION_EXPIRED` means the user authorizes again.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","connected","customerId","lastError","connectedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"connected":{"type":"boolean"},"customerId":{"type":["string","null"],"format":"uuid"},"lastError":{"type":["string","null"]},"connectedAt":{"type":["string","null"],"format":"date-time"}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Forget the user's authorization","tags":["bank-ramp-customers"],"description":"Aurea forgets the user's authorization at the bank ramp in one environment (its tokens are wiped); the customer stays. 204; 404 `BANK_RAMP_AUTHORIZATION_NOT_FOUND` when there is none.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Forgotten"},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No authorization in this environment (`BANK_RAMP_AUTHORIZATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No authorization in this environment (`BANK_RAMP_AUTHORIZATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/authorize/complete":{"post":{"summary":"Finish the user's authorization","tags":["bank-ramp-customers"],"description":"The `code` and `state` the bank ramp sent the user back with: Aurea checks the state (its own, this user's, not expired, not used), exchanges the code with the PKCE verifier it kept, reads the user's profile with the user's authorization and makes it the user's customer in the state's environment (201; 200 when it already was). The authorization is kept (encrypted) for Aurea to read the customer's state: there are no notifications in this mode, so read it with POST /v1/ramp/bank/customer/sync. 400 `BANK_RAMP_AUTHORIZATION_INVALID` for a state or code that does not pass (start again); 409 `BANK_RAMP_AUTHORIZATION_NO_PROFILE` when the user has no profile at the bank ramp yet; 409 `BANK_RAMP_CUSTOMER_EXISTS` when the user is another customer in that environment, or the profile is another user's. The tenant's bank ramp KYC must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`) with the hosted strategy (403 `BANK_RAMP_KYC_STRATEGY_OFF`), and its bank ramp configured with an authorization client (503 `BANK_RAMP_NOT_CONFIGURED`). A token without a tenant answers 403.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["state","code"],"additionalProperties":false,"properties":{"state":{"type":"string","minLength":1,"maxLength":1024},"code":{"type":"string","minLength":1,"maxLength":512}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","customer","verification"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"customer":{"type":["object","null"],"required":["customerId","profileId","kind","environment","registered","state","sections","closedReason","errorFields","createdAt","updatedAt"],"properties":{"customerId":{"type":"string","format":"uuid","description":"Aurea's id of the customer."},"profileId":{"type":"string","format":"uuid","description":"The id of the customer's profile at the bank ramp, made by Aurea when the customer was created."},"kind":{"type":"string","enum":["personal","corporate"]},"environment":{"type":"string","enum":["production","sandbox"]},"registered":{"type":"boolean","description":"Whether the bank ramp confirmed the profile. False after a call that did not reach the end: asking to create the customer again (or a sync) finishes it with the same id."},"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null],"description":"The profile's state at the bank ramp, null until it confirmed the profile. created: nothing submitted; incomplete: a section needs data; pending: everything submitted, in review; review: held for a manual review; approved; rejected (final); closed. It moves only along the bank ramp's documented transitions, backward ones included (pending or review back to incomplete, any state to closed)."},"sections":{"type":"object","required":["details","form","verifications"],"properties":{"details":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"form":{"type":["string","null"],"enum":["incomplete","pending","approved","rejected",null]},"verifications":{"type":"array","items":{"type":"object","required":["kind","state"],"properties":{"kind":{"type":"string"},"state":{"type":"string"}}}}}},"closedReason":{"type":["string","null"],"enum":["compliance","inactive","user-requested","duplicate","other",null],"description":"Why the bank ramp closed the profile, as a code."},"errorFields":{"type":"array","items":{"type":"string"},"description":"The names of the fields the bank ramp last refused as invalid in the data it received: correct and send them again."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"verification":{"type":"object","required":["state","nextStep","missing","kycStrategy"],"properties":{"state":{"type":["string","null"],"enum":["created","incomplete","pending","review","approved","rejected","closed",null]},"nextStep":{"type":"string","enum":["start_onboarding","continue_onboarding","wait_for_review","approved","rejected","closed"],"description":"start_onboarding: no customer yet (or one the bank ramp has not confirmed) — create it; continue_onboarding: send what `missing` names; wait_for_review: the bank ramp is reviewing; approved: nothing to do; rejected: declined for good; closed: the bank ramp closed the profile."},"missing":{"type":"array","items":{"type":"string","enum":["details","form","verifications"]},"description":"The sections that still need data while the customer can send them: details, form, verifications."},"kycStrategy":{"type":["string","null"],"enum":["reliance","sumsub_sharing","hosted_oauth",null],"description":"How the tenant's KYC goes with the bank ramp in this environment: reliance (the tenant's own KYC, its data sent), sumsub_sharing (a Sumsub applicant shared), hosted_oauth (the bank ramp's own pages). null when KYC is off."},"kycStrategyNeutral":{"type":"string","enum":["identity_sharing"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."}}}}}}}},"400":{"description":"The body is not valid, or the authorization does not pass (`BANK_RAMP_AUTHORIZATION_INVALID`): start again","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the authorization does not pass (`BANK_RAMP_AUTHORIZATION_INVALID`): start again","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the KYC or the hosted strategy is off","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the KYC or the hosted strategy is off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"No profile at the bank ramp yet (`BANK_RAMP_AUTHORIZATION_NO_PROFILE`), or another customer already (`BANK_RAMP_CUSTOMER_EXISTS`)","content":{"application/json":{"schema":{"type":"object","description":"No profile at the bank ramp yet (`BANK_RAMP_AUTHORIZATION_NO_PROFILE`), or another customer already (`BANK_RAMP_CUSTOMER_EXISTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/wallets":{"post":{"summary":"Link one of the user's Aurea wallets to the customer","tags":["bank-ramp-customers"],"description":"The bank ramp takes payments to and from an address on a chain once the address signed its message. A custodial wallet is signed for by Aurea and linked at once (201); a client-side or MPC wallet's link waits for the wallet's signature of `message` (202): send it to POST /v1/ramp/bank/customer/wallets/{linkId}/signature within `expiresAt`. A live link for the wallet's address on that chain is answered as it is (200). The wallet must be the user's (404 `BANK_RAMP_WALLET_NOT_FOUND`), of the environment, an EVM account that can sign — not watch-only, not a contract wallet (409 `BANK_RAMP_WALLET_NOT_SIGNABLE`, with the `reason`). A frozen tenant, user or wallet answers 423. The tenant must have the bank ramp's Aurea wallets mode on in the environment (403 `BANK_RAMP_MODE_OFF`) and offer the chain (400 `BANK_RAMP_PAIR_UNAVAILABLE`); the user must be a customer of the bank ramp (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`). A token without a tenant answers 403. An optional `Idempotency-Key` header answers a repeated call with the first call's answer.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["walletId","network"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"walletId":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, or the chain is not offered (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused the signature (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the chain is not offered (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused the signature (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the Aurea wallets mode is off (`BANK_RAMP_MODE_OFF`); the bank ramp refused (`BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the Aurea wallets mode is off (`BANK_RAMP_MODE_OFF`); the bank ramp refused (`BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`), or not the user's wallet (`BANK_RAMP_WALLET_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`), or not the user's wallet (`BANK_RAMP_WALLET_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The wallet cannot sign the link (`BANK_RAMP_WALLET_NOT_SIGNABLE`), or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"The wallet cannot sign the link (`BANK_RAMP_WALLET_NOT_SIGNABLE`), or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, the user or the wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, the user or the wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The user's wallet links","tags":["bank-ramp-customers"],"description":"The user's Aurea wallets linked (or being linked) to its customer in one environment, newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["links"],"properties":{"links":{"type":"array","items":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/wallets/{linkId}/signature":{"post":{"summary":"Send the wallet's signature of a link","tags":["bank-ramp-customers"],"description":"The wallet's signature of the link's `message` (personal_sign, a 65-byte hex signature): Aurea checks it recovers to the wallet's address, then sends it to the bank ramp. 200 linked, 202 pending; a signature that is not the wallet's answers 400 `BANK_RAMP_SIGNATURE_INVALID` and the link keeps waiting; a link not waiting 409 `BANK_RAMP_LINK_NOT_AWAITING_SIGNATURE`; past its time 409 `BANK_RAMP_LINK_EXPIRED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["signature"],"additionalProperties":false,"properties":{"signature":{"type":"string","minLength":1,"maxLength":200}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"linkId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["linkId","walletId","address","network","environment","signer","status","message","digest","expiresAt","failureCode","linkedAt","createdAt"],"properties":{"linkId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"signer":{"type":"string","enum":["server","client"],"description":"server: Aurea signed with the wallet's key (a custodial wallet); client: the wallet's own device or MPC ceremony signs."},"status":{"type":"string","enum":["awaiting_signature","pending","linked","failed","expired"],"description":"awaiting_signature: sign `message` (its EIP-191 digest is `digest`) and send the signature; linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp is still checking; failed: refused (`failureCode`); expired: link the wallet again."},"message":{"type":["string","null"],"description":"While awaiting the signature: the message the wallet signs (personal_sign, EIP-191)."},"digest":{"type":["string","null"],"description":"While awaiting the signature: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"linkedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, or the signature is not the wallet's (`BANK_RAMP_SIGNATURE_INVALID`), or the bank ramp refused it (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or the signature is not the wallet's (`BANK_RAMP_SIGNATURE_INVALID`), or the bank ramp refused it (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the bank ramp refused","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the bank ramp refused","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such link of the user (`BANK_RAMP_LINK_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such link of the user (`BANK_RAMP_LINK_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The link is not waiting for a signature (`BANK_RAMP_LINK_NOT_AWAITING_SIGNATURE`) or its time is over (`BANK_RAMP_LINK_EXPIRED`)","content":{"application/json":{"schema":{"type":"object","description":"The link is not waiting for a signature (`BANK_RAMP_LINK_NOT_AWAITING_SIGNATURE`) or its time is over (`BANK_RAMP_LINK_EXPIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/addresses/challenge":{"post":{"summary":"Ask for the challenge that proves an address of the user","tags":["bank-ramp-customers"],"description":"An address outside Aurea is proven twice: it signs `message` (Aurea's challenge: the tenant, the user, the address, the environment, a nonce, ten minutes) and `linkMessage` (the bank ramp's own message). Send both signatures to POST /v1/ramp/bank/customer/addresses/verify. An EVM address with its checksum when mixed-case (400 `BANK_RAMP_ADDRESS_INVALID`); at most five open challenges per user (409 `BANK_RAMP_ADDRESS_CHALLENGE_LIMIT`). The tenant must have the bank ramp's standalone mode on in the environment (403 `BANK_RAMP_MODE_OFF`) and offer the chain (400 `BANK_RAMP_PAIR_UNAVAILABLE`); the user must be a customer of the bank ramp (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`). A token without a tenant answers 403.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["address","network"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"address":{"type":"string","minLength":1,"maxLength":100},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["challengeId","address","network","environment","message","linkMessage","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"message":{"type":"string","description":"Aurea's challenge, signed with personal_sign (or ERC-1271)."},"linkMessage":{"type":"string","description":"The bank ramp's message, signed with personal_sign (or ERC-1271), or on chain by a smart account."},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), or the chain is not offered (`BANK_RAMP_PAIR_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), or the chain is not offered (`BANK_RAMP_PAIR_UNAVAILABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the standalone mode is off (`BANK_RAMP_MODE_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the standalone mode is off (`BANK_RAMP_MODE_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is no customer of the bank ramp (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is no customer of the bank ramp (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Too many open challenges (`BANK_RAMP_ADDRESS_CHALLENGE_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"Too many open challenges (`BANK_RAMP_ADDRESS_CHALLENGE_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/addresses/verify":{"post":{"summary":"Prove an address of the user and link it","tags":["bank-ramp-customers"],"description":"`signature`: the address's signature of the challenge's `message` — an account's (personal_sign) or a smart account's (ERC-1271, checked on the chain). `linkSignature`: its signature of `linkMessage` the same ways, or `0x` for a smart account that signs on chain. Both are checked before anything reaches the bank ramp: a wrong one answers 400 `BANK_RAMP_ADDRESS_SIGNATURE_INVALID` (`signature`: challenge or link); five wrong challenge signatures spend the challenge. 201 linked, 202 pending (a smart account's on-chain signature: list the addresses to read it again), 200 when the customer had the address on that chain already. A challenge used, expired or spent answers 409 `BANK_RAMP_ADDRESS_CHALLENGE_SPENT`. A smart account's signatures are read through the chain's node (503 `BANK_RAMP_ADDRESS_UNVERIFIED` when it does not answer).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["challengeId","signature","linkSignature"],"additionalProperties":false,"properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","minLength":1,"maxLength":4000},"linkSignature":{"type":"string","minLength":2,"maxLength":4000}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["addressId","address","network","environment","proof","linkSignature","status","failureCode","verifiedAt","linkedAt"],"properties":{"addressId":{"type":"string","format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"proof":{"type":"string","enum":["eip191","erc1271"],"description":"How the address proved it is the user's: an account's signature (EIP-191), or a smart account's (ERC-1271)."},"linkSignature":{"type":"string","enum":["eoa","erc1271","onchain"],"description":"How the address signed the bank ramp's message: an account, a smart account off chain, or on chain (then `pending` until the signature is on chain)."},"status":{"type":"string","enum":["pending","linked","failed"],"description":"linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp waits for the smart account's signature on chain (listing the addresses reads it again); failed: refused (`failureCode`)."},"failureCode":{"type":["string","null"]},"verifiedAt":{"type":"string","format":"date-time"},"linkedAt":{"type":["string","null"],"format":"date-time"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["addressId","address","network","environment","proof","linkSignature","status","failureCode","verifiedAt","linkedAt"],"properties":{"addressId":{"type":"string","format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"proof":{"type":"string","enum":["eip191","erc1271"],"description":"How the address proved it is the user's: an account's signature (EIP-191), or a smart account's (ERC-1271)."},"linkSignature":{"type":"string","enum":["eoa","erc1271","onchain"],"description":"How the address signed the bank ramp's message: an account, a smart account off chain, or on chain (then `pending` until the signature is on chain)."},"status":{"type":"string","enum":["pending","linked","failed"],"description":"linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp waits for the smart account's signature on chain (listing the addresses reads it again); failed: refused (`failureCode`)."},"failureCode":{"type":["string","null"]},"verifiedAt":{"type":"string","format":"date-time"},"linkedAt":{"type":["string","null"],"format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["addressId","address","network","environment","proof","linkSignature","status","failureCode","verifiedAt","linkedAt"],"properties":{"addressId":{"type":"string","format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"proof":{"type":"string","enum":["eip191","erc1271"],"description":"How the address proved it is the user's: an account's signature (EIP-191), or a smart account's (ERC-1271)."},"linkSignature":{"type":"string","enum":["eoa","erc1271","onchain"],"description":"How the address signed the bank ramp's message: an account, a smart account off chain, or on chain (then `pending` until the signature is on chain)."},"status":{"type":"string","enum":["pending","linked","failed"],"description":"linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp waits for the smart account's signature on chain (listing the addresses reads it again); failed: refused (`failureCode`)."},"failureCode":{"type":["string","null"]},"verifiedAt":{"type":"string","format":"date-time"},"linkedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"The body is not valid, a signature is not the address's (`BANK_RAMP_ADDRESS_SIGNATURE_INVALID`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, a signature is not the address's (`BANK_RAMP_ADDRESS_SIGNATURE_INVALID`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the standalone mode is off (`BANK_RAMP_MODE_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the standalone mode is off (`BANK_RAMP_MODE_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such challenge of the user (`BANK_RAMP_ADDRESS_CHALLENGE_NOT_FOUND`), or no customer","content":{"application/json":{"schema":{"type":"object","description":"No such challenge of the user (`BANK_RAMP_ADDRESS_CHALLENGE_NOT_FOUND`), or no customer","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The challenge is used, expired or spent (`BANK_RAMP_ADDRESS_CHALLENGE_SPENT`)","content":{"application/json":{"schema":{"type":"object","description":"The challenge is used, expired or spent (`BANK_RAMP_ADDRESS_CHALLENGE_SPENT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The chain's node or the bank ramp is unavailable, or the tenant's bank ramp is not configured","content":{"application/json":{"schema":{"type":"object","description":"The chain's node or the bank ramp is unavailable, or the tenant's bank ramp is not configured","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/addresses":{"get":{"summary":"The user's proven addresses","tags":["bank-ramp-customers"],"description":"The addresses the user proved and did not revoke, in one environment, newest first; a pending one is read again from the bank ramp first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["addresses"],"properties":{"addresses":{"type":"array","items":{"type":"object","required":["addressId","address","network","environment","proof","linkSignature","status","failureCode","verifiedAt","linkedAt"],"properties":{"addressId":{"type":"string","format":"uuid"},"address":{"type":"string"},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"environment":{"type":"string","enum":["production","sandbox"]},"proof":{"type":"string","enum":["eip191","erc1271"],"description":"How the address proved it is the user's: an account's signature (EIP-191), or a smart account's (ERC-1271)."},"linkSignature":{"type":"string","enum":["eoa","erc1271","onchain"],"description":"How the address signed the bank ramp's message: an account, a smart account off chain, or on chain (then `pending` until the signature is on chain)."},"status":{"type":"string","enum":["pending","linked","failed"],"description":"linked: the bank ramp takes payments to and from this address on this chain; pending: the bank ramp waits for the smart account's signature on chain (listing the addresses reads it again); failed: refused (`failureCode`)."},"failureCode":{"type":["string","null"]},"verifiedAt":{"type":"string","format":"date-time"},"linkedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/addresses/{id}":{"delete":{"summary":"Stop using a proven address","tags":["bank-ramp-customers"],"description":"The user stops using the address with the bank ramp: Aurea no longer pays to it or takes from it. The bank ramp keeps its own record (it has no unlink). Refused 409 `BANK_RAMP_ADDRESS_IN_USE` while the customer's IBAN pays to it on its chain (`reason`: iban) or orders from it are not finished (`reason`: orders). 204; 404 `BANK_RAMP_ADDRESS_NOT_FOUND`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Stopped"},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such address of the user (`BANK_RAMP_ADDRESS_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such address of the user (`BANK_RAMP_ADDRESS_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The address is in use (`BANK_RAMP_ADDRESS_IN_USE`)","content":{"application/json":{"schema":{"type":"object","description":"The address is in use (`BANK_RAMP_ADDRESS_IN_USE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/iban":{"post":{"summary":"Ask for the customer's IBAN","tags":["bank-ramp-iban"],"description":"A customer has one euro IBAN with the bank ramp; payments to it mint the euro token to one of the customer's linked addresses on one chain. 202 while the bank ramp provisions it (`status: requested`; the IBAN is known once it is `active`: read it with GET /v1/ramp/bank/customer/iban). 200 when the customer has it on that address already; 409 `BANK_RAMP_IBAN_EXISTS` when it pays to another address (move it with PATCH). The tenant must have the bank ramp's IBAN on in the environment (403 `BANK_RAMP_FUNCTION_OFF`), offer euro on the chain (400 `BANK_RAMP_PAIR_UNAVAILABLE`) and the mode the address was linked in (403 `BANK_RAMP_MODE_OFF`); the user must be a customer (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) whose verification is approved (409 `BANK_RAMP_CUSTOMER_NOT_APPROVED`), and the address linked to it on that chain (409 `BANK_RAMP_ADDRESS_NOT_LINKED`). A token without a tenant answers 403. An optional `Idempotency-Key` header answers a repeated call with the first call's answer.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["address","network"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"address":{"type":"string","description":"One of the customer's linked addresses on `network`: an Aurea wallet linked with POST /v1/ramp/bank/customer/wallets, or a standalone address proven with POST /v1/ramp/bank/customer/addresses/verify."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ibanId","environment","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["string","null"],"description":"The customer's IBAN (no spaces, upper case); null while the bank ramp provisions it."},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the IBAN's payments mint on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to."},"status":{"type":"string","enum":["requested","active","closed"],"description":"requested: the bank ramp is provisioning the IBAN (`iban` is null until then); active: payments to it mint to `address` on `network`; closed: the customer's profile was closed, and its IBAN with it."},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ibanId","environment","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["string","null"],"description":"The customer's IBAN (no spaces, upper case); null while the bank ramp provisions it."},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the IBAN's payments mint on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to."},"status":{"type":"string","enum":["requested","active","closed"],"description":"requested: the bank ramp is provisioning the IBAN (`iban` is null until then); active: payments to it mint to `address` on `network`; closed: the customer's profile was closed, and its IBAN with it."},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), euro is not offered on the chain (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), euro is not offered on the chain (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the IBAN or the address's mode is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`); the bank ramp refused (`BANK_RAMP_FORBIDDEN`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the IBAN or the address's mode is off (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`); the bank ramp refused (`BANK_RAMP_FORBIDDEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not approved (`BANK_RAMP_CUSTOMER_NOT_APPROVED`), the address not linked (`BANK_RAMP_ADDRESS_NOT_LINKED`), an IBAN on another address (`BANK_RAMP_IBAN_EXISTS`) or closed (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"Not approved (`BANK_RAMP_CUSTOMER_NOT_APPROVED`), the address not linked (`BANK_RAMP_ADDRESS_NOT_LINKED`), an IBAN on another address (`BANK_RAMP_IBAN_EXISTS`) or closed (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The customer's IBAN","tags":["bank-ramp-iban"],"description":"What Aurea keeps of the user's IBAN in one environment (null before one is asked for).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","iban"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["object","null"],"required":["ibanId","environment","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["string","null"],"description":"The customer's IBAN (no spaces, upper case); null while the bank ramp provisions it."},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the IBAN's payments mint on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to."},"status":{"type":"string","enum":["requested","active","closed"],"description":"requested: the bank ramp is provisioning the IBAN (`iban` is null until then); active: payments to it mint to `address` on `network`; closed: the customer's profile was closed, and its IBAN with it."},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"patch":{"summary":"Move the customer's IBAN to another linked address","tags":["bank-ramp-iban"],"description":"Future payments to the IBAN mint to another of the customer's linked addresses (the IBAN stays the same). 200 with the IBAN; the address it mints to already answers it as it is. 404 `BANK_RAMP_IBAN_NOT_FOUND` without an IBAN; 409 `BANK_RAMP_IBAN_NOT_ACTIVE` while it is provisioned or closed. The tenant must have the bank ramp's IBAN on in the environment (403 `BANK_RAMP_FUNCTION_OFF`), offer euro on the chain (400 `BANK_RAMP_PAIR_UNAVAILABLE`) and the mode the address was linked in (403 `BANK_RAMP_MODE_OFF`); the user must be a customer (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`) whose verification is approved (409 `BANK_RAMP_CUSTOMER_NOT_APPROVED`), and the address linked to it on that chain (409 `BANK_RAMP_ADDRESS_NOT_LINKED`). A token without a tenant answers 403. An optional `Idempotency-Key` header answers a repeated call with the first call's answer.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["address","network"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"address":{"type":"string","description":"One of the customer's linked addresses on `network`: an Aurea wallet linked with POST /v1/ramp/bank/customer/wallets, or a standalone address proven with POST /v1/ramp/bank/customer/addresses/verify."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ibanId","environment","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["string","null"],"description":"The customer's IBAN (no spaces, upper case); null while the bank ramp provisions it."},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the IBAN's payments mint on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to."},"status":{"type":"string","enum":["requested","active","closed"],"description":"requested: the bank ramp is provisioning the IBAN (`iban` is null until then); active: payments to it mint to `address` on `network`; closed: the customer's profile was closed, and its IBAN with it."},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), euro is not offered on the chain (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), euro is not offered on the chain (`BANK_RAMP_PAIR_UNAVAILABLE`), or the bank ramp refused (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the IBAN or the address's mode is off; the bank ramp refused","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the IBAN or the address's mode is off; the bank ramp refused","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`) or no IBAN (`BANK_RAMP_IBAN_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`) or no IBAN (`BANK_RAMP_IBAN_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not approved, the address not linked, the IBAN not active (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"Not approved, the address not linked, the IBAN not active (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/iban/sync":{"post":{"summary":"Read the customer's IBAN from the bank ramp now","tags":["bank-ramp-iban"],"description":"Reads the customer's IBAN at the bank ramp and keeps what it says (an IBAN made outside Aurea too), then answers as GET /v1/ramp/bank/customer/iban.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","iban"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["object","null"],"required":["ibanId","environment","iban","bic","currency","network","chainId","address","status","requestedAt","activeAt","movedAt","closedAt","updatedAt"],"properties":{"ibanId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"iban":{"type":["string","null"],"description":"The customer's IBAN (no spaces, upper case); null while the bank ramp provisions it."},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the IBAN's payments mint on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's linked address the IBAN's payments mint to."},"status":{"type":"string","enum":["requested","active","closed"],"description":"requested: the bank ramp is provisioning the IBAN (`iban` is null until then); active: payments to it mint to `address` on `network`; closed: the customer's profile was closed, and its IBAN with it."},"requestedAt":{"type":["string","null"],"format":"date-time"},"activeAt":{"type":["string","null"],"format":"date-time"},"movedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the bank ramp refused","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the bank ramp refused","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the bank ramp is unavailable","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/iban/instructions":{"get":{"summary":"Deposit instructions for the customer's IBAN","tags":["bank-ramp-iban"],"description":"What a payer follows to pay the customer in euro: the IBAN, its bank's code, and the reference (`memo`) to write on the transfer so that the payment mints to one of the customer's linked addresses — the IBAN's own destination, or the `address` and `network` asked for (both, one of the customer's linked addresses: 409 `BANK_RAMP_ADDRESS_NOT_LINKED` otherwise). A pay-in is a transfer to the IBAN, so the tenant's pay-in must be on in the environment (403 `BANK_RAMP_FUNCTION_OFF`). 404 `BANK_RAMP_IBAN_NOT_FOUND` without an IBAN; 409 `BANK_RAMP_IBAN_NOT_ACTIVE` while it is provisioned or closed.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string"},"in":"query","name":"address","required":false},{"schema":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"in":"query","name":"network","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","ibanId","iban","bic","currency","paymentRail","destination","memo","ibanDestination"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"ibanId":{"type":"string","format":"uuid"},"iban":{"type":"string"},"bic":{"type":["string","null"]},"currency":{"type":"string","enum":["eur"]},"paymentRail":{"type":"string","enum":["sepa"]},"destination":{"type":"object","required":["network","chainId","address","token"],"properties":{"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":"integer"},"address":{"type":"string"},"token":{"type":"object","required":["symbol","address","decimals"],"properties":{"symbol":{"type":"string"},"address":{"type":"string"},"decimals":{"type":"integer"}}}}},"memo":{"type":"string","description":"The transfer's reference: `chain:address`, the chain as the bank ramp names it."},"ibanDestination":{"type":"boolean","description":"Whether the destination is the one the IBAN mints to without a reference."}}}}}},"400":{"description":"The query is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), or a destination is half given (`BANK_RAMP_DESTINATION_INCOMPLETE`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid, the address is not one (`BANK_RAMP_ADDRESS_INVALID`), or a destination is half given (`BANK_RAMP_DESTINATION_INCOMPLETE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant, or the pay-in is off (`BANK_RAMP_FUNCTION_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant, or the pay-in is off (`BANK_RAMP_FUNCTION_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`) or no IBAN (`BANK_RAMP_IBAN_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`) or no IBAN (`BANK_RAMP_IBAN_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The IBAN is not active (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the destination is not linked (`BANK_RAMP_ADDRESS_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The IBAN is not active (`BANK_RAMP_IBAN_NOT_ACTIVE`), or the destination is not linked (`BANK_RAMP_ADDRESS_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/deposits":{"get":{"summary":"The customer's deposits","tags":["bank-ramp-deposits"],"description":"The payments that arrived on the customer's IBAN in one environment, newest first: each one minted to the address the IBAN pays to (or the one its reference named). `status` filters by Aurea's status. Answered as Aurea keeps them — from the bank ramp's notifications, and from Aurea's reconciliation when it is on — whatever the tenant's settings.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","enum":["pending","completed","failed"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["deposits","total","limit","offset"],"properties":{"deposits":{"type":"array","items":{"type":"object","required":["id","environment","orderId","fiatAmount","fiatCurrency","senderName","status","state","eddRequired","eddReason","depositDate","createdAt","paymentMethodId","paymentMethodType","paymentSystemId","requestForInformation","refunds","network","chainId","address","transactionHashes","processedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's id of the payment's order."},"fiatAmount":{"type":"number"},"fiatCurrency":{"type":"string","example":"EUR"},"senderName":{"type":["string","null"],"description":"Not given by the bank ramp: always null."},"status":{"type":"string","enum":["pending","completed","failed"],"description":"Aurea's status: pending until the token is minted, completed once it is, failed when the bank ramp rejected the payment."},"state":{"type":"string","enum":["placed","pending","processed","rejected"],"description":"The bank ramp's own state of the payment's order."},"eddRequired":{"type":"boolean"},"eddReason":{"type":["string","null"]},"depositDate":{"type":["string","null"],"format":"date-time","description":"When the bank ramp placed the payment's order."},"createdAt":{"type":"string","format":"date-time"},"paymentMethodId":{"type":["string","null"],"format":"uuid","description":"Aurea's id of the customer's IBAN the payment arrived on."},"paymentMethodType":{"type":"string","enum":["sepa"]},"paymentSystemId":{"type":["string","null"]},"requestForInformation":{"type":["object","null"],"description":"Not used by this bank ramp: always null."},"refunds":{"type":"array","items":{"type":"object"},"description":"Not used by this bank ramp: always empty."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the token is minted on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's address the token is minted to."},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The mint's transactions, once processed."},"memo":{"type":["string","null"],"maxLength":140,"description":"The payment's SEPA remittance reference, as the payer wrote it (at most 140 characters): what a payment link's settlement is matched on. Null when the payment carries none, or for a deposit recorded before the reference was kept."},"processedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/deposits/{depositId}":{"get":{"summary":"One of the customer's deposits","tags":["bank-ramp-deposits"],"description":"One payment that arrived on the customer's IBAN. 404 `BANK_RAMP_DEPOSIT_NOT_FOUND` when it is not the user's.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"depositId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","orderId","fiatAmount","fiatCurrency","senderName","status","state","eddRequired","eddReason","depositDate","createdAt","paymentMethodId","paymentMethodType","paymentSystemId","requestForInformation","refunds","network","chainId","address","transactionHashes","processedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's id of the payment's order."},"fiatAmount":{"type":"number"},"fiatCurrency":{"type":"string","example":"EUR"},"senderName":{"type":["string","null"],"description":"Not given by the bank ramp: always null."},"status":{"type":"string","enum":["pending","completed","failed"],"description":"Aurea's status: pending until the token is minted, completed once it is, failed when the bank ramp rejected the payment."},"state":{"type":"string","enum":["placed","pending","processed","rejected"],"description":"The bank ramp's own state of the payment's order."},"eddRequired":{"type":"boolean"},"eddReason":{"type":["string","null"]},"depositDate":{"type":["string","null"],"format":"date-time","description":"When the bank ramp placed the payment's order."},"createdAt":{"type":"string","format":"date-time"},"paymentMethodId":{"type":["string","null"],"format":"uuid","description":"Aurea's id of the customer's IBAN the payment arrived on."},"paymentMethodType":{"type":"string","enum":["sepa"]},"paymentSystemId":{"type":["string","null"]},"requestForInformation":{"type":["object","null"],"description":"Not used by this bank ramp: always null."},"refunds":{"type":"array","items":{"type":"object"},"description":"Not used by this bank ramp: always empty."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"],"description":"The chain the token is minted on."},"chainId":{"type":["integer","null"]},"address":{"type":"string","description":"The customer's address the token is minted to."},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The mint's transactions, once processed."},"memo":{"type":["string","null"],"maxLength":140,"description":"The payment's SEPA remittance reference, as the payer wrote it (at most 140 characters): what a payment link's settlement is matched on. Null when the payment carries none, or for a deposit recorded before the reference was kept."},"processedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's deposit (`BANK_RAMP_DEPOSIT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's deposit (`BANK_RAMP_DEPOSIT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/payouts":{"post":{"summary":"Prepare a payout to a bank account","tags":["bank-ramp-payouts"],"description":"The bank ramp pays an IBAN from the customer's euro tokens: they are burned from one of the customer's linked addresses once the address signed the bank ramp's message. Preparing checks what can be checked before anything is signed and keeps the order, with the id Aurea makes for it (201): the tenant's payout on (403 `BANK_RAMP_FUNCTION_OFF`), euro offered on the chain (400 `BANK_RAMP_PAIR_UNAVAILABLE`) and the address's mode (403 `BANK_RAMP_MODE_OFF`); the customer approved (404 `BANK_RAMP_CUSTOMER_NOT_FOUND`, 409 `BANK_RAMP_CUSTOMER_NOT_APPROVED`) and the address linked to it on the chain (409 `BANK_RAMP_ADDRESS_NOT_LINKED`), a wallet that can sign (409 `BANK_RAMP_WALLET_NOT_SIGNABLE`); the amount, two decimals at most and 0.01 at least (400 `BANK_RAMP_PAYOUT_AMOUNT_INVALID`); the IBAN's check digits (400 `BANK_RAMP_PAYOUT_IBAN_INVALID`); `own` (the customer's own account) for a personal customer only (400 `BANK_RAMP_PAYOUT_OWN_ACCOUNT_UNAVAILABLE`); from EUR 15,000 to another account, a supporting document the customer uploaded with POST /v1/ramp/bank/customer/files (400 `BANK_RAMP_PAYOUT_DOCUMENT_REQUIRED`, `BANK_RAMP_PAYOUT_DOCUMENT_UNKNOWN`); the address's on-chain balance covering this payout and its payouts not burned yet (409 `BANK_RAMP_PAYOUT_BALANCE_LOW` with `available` and `needed`; 503 `BANK_RAMP_BALANCE_UNREAD`). A client signer is handed `message` and `digest` (a frozen tenant, user or wallet answers 423 first). Send it with POST /v1/ramp/bank/customer/payouts/{payoutId}/send before `expiresAt`. An optional `Idempotency-Key` header answers a repeated call with the first call's answer (the same order id).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["address","network","currency","amount","counterpart"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},"address":{"type":"string","description":"One of the customer's linked addresses on `network` (an Aurea wallet or a standalone address): the token is burned from it."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"currency":{"type":"string","enum":["eur"]},"amount":{"type":"string","description":"Decimal text, two decimals at most, 0.01 at least.","example":"1250.50"},"counterpart":{"type":"object","required":["iban","details"],"additionalProperties":false,"properties":{"iban":{"type":"string","description":"The IBAN paid (spaces allowed)."},"details":{"description":"Who is paid: `{ \"own\": true }` for the customer's own account (a personal customer), an individual, or a company.","oneOf":[{"type":"object","required":["own"],"additionalProperties":false,"properties":{"own":{"type":"boolean","enum":[true]}}},{"type":"object","required":["firstName","lastName","country"],"additionalProperties":false,"properties":{"firstName":{"type":"string","minLength":2},"lastName":{"type":"string","minLength":2},"country":{"type":"string","pattern":"^[A-Z]{2}$"}}},{"type":"object","required":["companyName","country"],"additionalProperties":false,"properties":{"companyName":{"type":"string","minLength":1},"country":{"type":"string","pattern":"^[A-Z]{2}$"}}}]}}},"memo":{"type":"string","minLength":5,"maxLength":140},"referenceNumber":{"type":"string","maxLength":35},"supportingDocumentId":{"type":"string","format":"uuid","description":"The `fileId` of a document the customer uploaded (an invoice or an agreement)."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["payoutId","orderId","environment","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","hasSupportingDocument","message","digest","expiresAt","failureCode","transactionHashes","sentAt","placedAt","processedAt","createdAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id. Aurea makes it when the payout is prepared: it is the same as `payoutId`, on every try."},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","sending","placed","pending_signatures","processed","rejected","failed","expired","unknown"],"description":"prepared: waiting to be sent (a client signs `message` first); sending: being sent; placed: the bank ramp took the order; pending_signatures: the bank ramp waits for the smart account's signature on chain; processed: paid; rejected: the bank ramp rejected it; failed: refused before the bank ramp took it (`failureCode`); expired: not sent before `expiresAt` — prepare it again; unknown: sent, its answer lost — Aurea reads the order again."},"state":{"type":["string","null"],"enum":["placed","pending","processed","rejected",null],"description":"The bank ramp's own state of the order, once it has one."},"signer":{"type":["string","null"],"enum":["server","client",null],"description":"server: Aurea signs with the wallet's key when it is sent (a custodial wallet); client: the address signs `message` and the signature is sent."},"source":{"type":["string","null"],"enum":["wallet","standalone",null]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":"string","description":"Decimal text, two decimals at most."},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"],"enum":["own","individual","company",null]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form (first and last four characters)."}}},"hasSupportingDocument":{"type":"boolean"},"message":{"type":["string","null"],"description":"While prepared: the message the address signs (personal_sign, EIP-191) — for a client signer, before `expiresAt`."},"digest":{"type":["string","null"],"description":"While prepared: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The burn's transactions, once processed."},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_PAYOUT_INVALID`, with the names of the refused fields), or one of its rules is broken (`BANK_RAMP_PAYOUT_*`, `BANK_RAMP_ADDRESS_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_PAYOUT_INVALID`, with the names of the refused fields), or one of its rules is broken (`BANK_RAMP_PAYOUT_*`, `BANK_RAMP_ADDRESS_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the payout or the address's mode is off","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the payout or the address's mode is off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No customer (`BANK_RAMP_CUSTOMER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not approved, the address not linked, a wallet that cannot sign, the balance too low (`BANK_RAMP_PAYOUT_BALANCE_LOW`), or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"Not approved, the address not linked, a wallet that cannot sign, the balance too low (`BANK_RAMP_PAYOUT_BALANCE_LOW`), or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, the user or the wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, the user or the wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, or the balance could not be read (`BANK_RAMP_BALANCE_UNREAD`)","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, or the balance could not be read (`BANK_RAMP_BALANCE_UNREAD`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The customer's payouts","tags":["bank-ramp-payouts"],"description":"The user's payouts in one environment, newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","payouts","total","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"payouts":{"type":"array","items":{"type":"object","required":["payoutId","orderId","environment","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","hasSupportingDocument","message","digest","expiresAt","failureCode","transactionHashes","sentAt","placedAt","processedAt","createdAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id. Aurea makes it when the payout is prepared: it is the same as `payoutId`, on every try."},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","sending","placed","pending_signatures","processed","rejected","failed","expired","unknown"],"description":"prepared: waiting to be sent (a client signs `message` first); sending: being sent; placed: the bank ramp took the order; pending_signatures: the bank ramp waits for the smart account's signature on chain; processed: paid; rejected: the bank ramp rejected it; failed: refused before the bank ramp took it (`failureCode`); expired: not sent before `expiresAt` — prepare it again; unknown: sent, its answer lost — Aurea reads the order again."},"state":{"type":["string","null"],"enum":["placed","pending","processed","rejected",null],"description":"The bank ramp's own state of the order, once it has one."},"signer":{"type":["string","null"],"enum":["server","client",null],"description":"server: Aurea signs with the wallet's key when it is sent (a custodial wallet); client: the address signs `message` and the signature is sent."},"source":{"type":["string","null"],"enum":["wallet","standalone",null]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":"string","description":"Decimal text, two decimals at most."},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"],"enum":["own","individual","company",null]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form (first and last four characters)."}}},"hasSupportingDocument":{"type":"boolean"},"message":{"type":["string","null"],"description":"While prepared: the message the address signs (personal_sign, EIP-191) — for a client signer, before `expiresAt`."},"digest":{"type":["string","null"],"description":"While prepared: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The burn's transactions, once processed."},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/payouts/{payoutId}":{"get":{"summary":"One of the customer's payouts","tags":["bank-ramp-payouts"],"description":"One payout, as Aurea keeps it: its status moves with the bank ramp's notifications. 404 `BANK_RAMP_PAYOUT_NOT_FOUND` when it is not the user's.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"payoutId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["payoutId","orderId","environment","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","hasSupportingDocument","message","digest","expiresAt","failureCode","transactionHashes","sentAt","placedAt","processedAt","createdAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id. Aurea makes it when the payout is prepared: it is the same as `payoutId`, on every try."},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","sending","placed","pending_signatures","processed","rejected","failed","expired","unknown"],"description":"prepared: waiting to be sent (a client signs `message` first); sending: being sent; placed: the bank ramp took the order; pending_signatures: the bank ramp waits for the smart account's signature on chain; processed: paid; rejected: the bank ramp rejected it; failed: refused before the bank ramp took it (`failureCode`); expired: not sent before `expiresAt` — prepare it again; unknown: sent, its answer lost — Aurea reads the order again."},"state":{"type":["string","null"],"enum":["placed","pending","processed","rejected",null],"description":"The bank ramp's own state of the order, once it has one."},"signer":{"type":["string","null"],"enum":["server","client",null],"description":"server: Aurea signs with the wallet's key when it is sent (a custodial wallet); client: the address signs `message` and the signature is sent."},"source":{"type":["string","null"],"enum":["wallet","standalone",null]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":"string","description":"Decimal text, two decimals at most."},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"],"enum":["own","individual","company",null]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form (first and last four characters)."}}},"hasSupportingDocument":{"type":"boolean"},"message":{"type":["string","null"],"description":"While prepared: the message the address signs (personal_sign, EIP-191) — for a client signer, before `expiresAt`."},"digest":{"type":["string","null"],"description":"While prepared: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The burn's transactions, once processed."},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"403":{"description":"No tenant","content":{"application/json":{"schema":{"type":"object","description":"No tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's payout (`BANK_RAMP_PAYOUT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's payout (`BANK_RAMP_PAYOUT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/payouts/{payoutId}/send":{"post":{"summary":"Send a prepared payout","tags":["bank-ramp-payouts"],"description":"Sends a prepared payout's order to the bank ramp, with the order id Aurea made: 200 with the order (`placed`, or already `processed` / `rejected`), 202 while the bank ramp waits for a smart account's signature on chain (`pending_signatures`). A custodial wallet: Aurea signs the message with the wallet's key — send no `signature` (400 `BANK_RAMP_PAYOUT_SIGNATURE_UNEXPECTED`). A client-side or MPC wallet or a standalone address: send the address's `signature` of the payout's `message` (400 `BANK_RAMP_PAYOUT_SIGNATURE_REQUIRED`); it must recover to the address, or the smart account must answer ERC-1271 for it, or `\"0x\"` for a smart account that signs on chain (400 `BANK_RAMP_SIGNATURE_INVALID` otherwise, and the payout keeps waiting). The address must still be linked (409 `BANK_RAMP_ADDRESS_NOT_LINKED`) and hold the payout with its others not burned yet (409 `BANK_RAMP_PAYOUT_BALANCE_LOW`); the payout must be waiting (409 `BANK_RAMP_PAYOUT_NOT_PREPARED`) and in its time (409 `BANK_RAMP_PAYOUT_EXPIRED`: prepare it again). A frozen tenant, user or wallet answers 423. A refusal by the bank ramp marks the payout `failed`; a failure that may have reached it marks it `unknown` until Aurea reads the order again. Its status then moves with the bank ramp's notifications.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"signature":{"type":"string","description":"The address's signature of the payout's `message` (a client signer only)."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"payoutId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["payoutId","orderId","environment","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","hasSupportingDocument","message","digest","expiresAt","failureCode","transactionHashes","sentAt","placedAt","processedAt","createdAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id. Aurea makes it when the payout is prepared: it is the same as `payoutId`, on every try."},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","sending","placed","pending_signatures","processed","rejected","failed","expired","unknown"],"description":"prepared: waiting to be sent (a client signs `message` first); sending: being sent; placed: the bank ramp took the order; pending_signatures: the bank ramp waits for the smart account's signature on chain; processed: paid; rejected: the bank ramp rejected it; failed: refused before the bank ramp took it (`failureCode`); expired: not sent before `expiresAt` — prepare it again; unknown: sent, its answer lost — Aurea reads the order again."},"state":{"type":["string","null"],"enum":["placed","pending","processed","rejected",null],"description":"The bank ramp's own state of the order, once it has one."},"signer":{"type":["string","null"],"enum":["server","client",null],"description":"server: Aurea signs with the wallet's key when it is sent (a custodial wallet); client: the address signs `message` and the signature is sent."},"source":{"type":["string","null"],"enum":["wallet","standalone",null]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":"string","description":"Decimal text, two decimals at most."},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"],"enum":["own","individual","company",null]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form (first and last four characters)."}}},"hasSupportingDocument":{"type":"boolean"},"message":{"type":["string","null"],"description":"While prepared: the message the address signs (personal_sign, EIP-191) — for a client signer, before `expiresAt`."},"digest":{"type":["string","null"],"description":"While prepared: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The burn's transactions, once processed."},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["payoutId","orderId","environment","status","state","signer","source","walletId","address","network","chainId","currency","amount","counterpart","hasSupportingDocument","message","digest","expiresAt","failureCode","transactionHashes","sentAt","placedAt","processedAt","createdAt","updatedAt"],"properties":{"payoutId":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid","description":"The bank ramp's order id. Aurea makes it when the payout is prepared: it is the same as `payoutId`, on every try."},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","sending","placed","pending_signatures","processed","rejected","failed","expired","unknown"],"description":"prepared: waiting to be sent (a client signs `message` first); sending: being sent; placed: the bank ramp took the order; pending_signatures: the bank ramp waits for the smart account's signature on chain; processed: paid; rejected: the bank ramp rejected it; failed: refused before the bank ramp took it (`failureCode`); expired: not sent before `expiresAt` — prepare it again; unknown: sent, its answer lost — Aurea reads the order again."},"state":{"type":["string","null"],"enum":["placed","pending","processed","rejected",null],"description":"The bank ramp's own state of the order, once it has one."},"signer":{"type":["string","null"],"enum":["server","client",null],"description":"server: Aurea signs with the wallet's key when it is sent (a custodial wallet); client: the address signs `message` and the signature is sent."},"source":{"type":["string","null"],"enum":["wallet","standalone",null]},"walletId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The address the token is burned from."},"network":{"type":"string","enum":["ethereum","gnosis","polygon","arbitrum","base"]},"chainId":{"type":["integer","null"]},"currency":{"type":"string"},"amount":{"type":"string","description":"Decimal text, two decimals at most."},"counterpart":{"type":"object","required":["kind","country","iban"],"properties":{"kind":{"type":["string","null"],"enum":["own","individual","company",null]},"country":{"type":["string","null"]},"iban":{"type":["string","null"],"description":"The IBAN's short form (first and last four characters)."}}},"hasSupportingDocument":{"type":"boolean"},"message":{"type":["string","null"],"description":"While prepared: the message the address signs (personal_sign, EIP-191) — for a client signer, before `expiresAt`."},"digest":{"type":["string","null"],"description":"While prepared: the message's EIP-191 digest, what an MPC ceremony signs."},"expiresAt":{"type":["string","null"],"format":"date-time"},"failureCode":{"type":["string","null"]},"transactionHashes":{"type":"array","items":{"type":"string"},"description":"The burn's transactions, once processed."},"sentAt":{"type":["string","null"],"format":"date-time"},"placedAt":{"type":["string","null"],"format":"date-time"},"processedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_PAYOUT_INVALID`), a signature missing, unexpected or not the address's, or the bank ramp refused the order (`BANK_RAMP_INVALID_REQUEST`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_PAYOUT_INVALID`), a signature missing, unexpected or not the address's, or the bank ramp refused the order (`BANK_RAMP_INVALID_REQUEST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant; the payout or the address's mode is off; the bank ramp refused","content":{"application/json":{"schema":{"type":"object","description":"No tenant; the payout or the address's mode is off; the bank ramp refused","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's payout (`BANK_RAMP_PAYOUT_NOT_FOUND`), or no customer","content":{"application/json":{"schema":{"type":"object","description":"Not the user's payout (`BANK_RAMP_PAYOUT_NOT_FOUND`), or no customer","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not waiting (`BANK_RAMP_PAYOUT_NOT_PREPARED`), expired (`BANK_RAMP_PAYOUT_EXPIRED`), the address not linked or the balance too low, or the Idempotency-Key belongs to another request","content":{"application/json":{"schema":{"type":"object","description":"Not waiting (`BANK_RAMP_PAYOUT_NOT_PREPARED`), expired (`BANK_RAMP_PAYOUT_EXPIRED`), the address not linked or the balance too low, or the Idempotency-Key belongs to another request","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant, the user or the wallet is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant, the user or the wallet is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered with an error or something unexpected","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered with an error or something unexpected","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The tenant's bank ramp is not configured, the bank ramp is unavailable, or the balance could not be read","content":{"application/json":{"schema":{"type":"object","description":"The tenant's bank ramp is not configured, the bank ramp is unavailable, or the balance could not be read","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/verification":{"get":{"summary":"The user's verification with the bank ramp's local rails","tags":["bank-ramp-local"],"description":"Whether the user may use the local rails in this environment, and what comes next: `register` (not registered yet), `await_verification` (the bank ramp's operations are verifying the user), `none` (verified), `renew_verification` (the verification expired), `contact_support` (refused). `required` is false when the tenant does not ask for verification. Every change is also sent to the tenant as `ramp.kyc.updated`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","state","kind","nextStep","required","verifiedAt","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"state":{"type":"string","enum":["none","registered","pending","verified","rejected","expired"]},"kind":{"type":["null","string"],"enum":["individual","business",null]},"nextStep":{"type":"string","enum":["register","await_verification","none","contact_support","renew_verification"]},"required":{"type":"boolean"},"verifiedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_CUSTOMER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_CUSTOMER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Register the user for the bank ramp's local rails","tags":["bank-ramp-local"],"description":"Records the user as a customer of the local rails (`individual` or `business`) with who they are: `legalName` and `country` (ISO 3166-1 alpha-2), and `dateOfBirth` (YYYY-MM-DD) for a person — payouts to the user's own wallet name them as the beneficiary. The bank ramp's operations then verify them. Registering again with the same details answers the same record; different details replace them only before the verification starts (409 `BANK_RAMP_CUSTOMER_INVALID` afterwards). 422 `BANK_RAMP_FUNCTION_OFF` when the tenant offers neither pay-ins nor withdrawals here.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["kind","legalName","country"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"kind":{"type":"string","enum":["individual","business"]},"legalName":{"type":"string","minLength":1,"maxLength":200},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"dateOfBirth":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD; required when `kind` is `individual`."}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","state","kind","nextStep","required","verifiedAt","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"state":{"type":"string","enum":["none","registered","pending","verified","rejected","expired"]},"kind":{"type":["null","string"],"enum":["individual","business",null]},"nextStep":{"type":"string","enum":["register","await_verification","none","contact_support","renew_verification"]},"required":{"type":"boolean"},"verifiedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":["null","string"],"format":"date-time"},"verificationId":{"type":"string","format":"uuid","description":"The user's identity verification (GET /v1/identity/verifications/{id}); present only where Aurea's identity verification serves the tenant's environment."},"verificationUrl":{"type":["null","string"],"description":"The verification page while the verification is started (a fresh one each call, never stored; open it in a browser or a WebView), null when there is nothing to complete; present only with verificationId."}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","state","kind","nextStep","required","verifiedAt","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"state":{"type":"string","enum":["none","registered","pending","verified","rejected","expired"]},"kind":{"type":["null","string"],"enum":["individual","business",null]},"nextStep":{"type":"string","enum":["register","await_verification","none","contact_support","renew_verification"]},"required":{"type":"boolean"},"verifiedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":["null","string"],"format":"date-time"},"verificationId":{"type":"string","format":"uuid","description":"The user's identity verification (GET /v1/identity/verifications/{id}); present only where Aurea's identity verification serves the tenant's environment."},"verificationUrl":{"type":["null","string"],"description":"The verification page while the verification is started (a fresh one each call, never stored; open it in a browser or a WebView), null when there is nothing to complete; present only with verificationId."}}}}}},"400":{"description":"The body is not valid: a person needs a date of birth, a business has none (`BANK_RAMP_CUSTOMER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid: a person needs a date of birth, a business has none (`BANK_RAMP_CUSTOMER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or neither the on-ramp nor the off-ramp is on for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or neither the on-ramp nor the off-ramp is on for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The verification has started: the identity can no longer change here (`BANK_RAMP_CUSTOMER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The verification has started: the identity can no longer change here (`BANK_RAMP_CUSTOMER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/balances":{"get":{"summary":"The user's balances on the local rails","tags":["bank-ramp-local"],"description":"Per asset: `spendable` (what the user may withdraw or convert now) and `onHold` (money reserved by withdrawals and orders in progress, and pay-ins still inside the tenant's reversal window).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balances"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balances":{"type":"array","items":{"type":"object","required":["asset","spendable","onHold"],"properties":{"asset":{"type":"string"},"spendable":{"type":"string"},"onHold":{"type":"string"}}}}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_BALANCE_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_BALANCE_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/institutions":{"get":{"summary":"Banks and mobile money operators for an asset","tags":["bank-ramp-local"],"description":"The institutions a withdrawal in `asset` can pay: each with its `institutionId`, name and type (`bank` or `momo`).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string"},"in":"query","name":"asset","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","asset","institutions"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"asset":{"type":"string"},"institutions":{"type":"array","items":{"type":"object","required":["institutionId","name","type"],"properties":{"institutionId":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["bank","momo"]}}}}}}}}},"400":{"description":"The query is not valid, or the asset is not offered (`BANK_RAMP_INSTITUTIONS_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid, or the asset is not offered (`BANK_RAMP_INSTITUTIONS_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or bank and mobile money payouts are off for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or bank and mobile money payouts are off for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank ramp is not set up for the tenant here (`BANK_RAMP_NOT_CONFIGURED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is not set up for the tenant here (`BANK_RAMP_NOT_CONFIGURED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/instructions":{"post":{"summary":"Ask how to pay in","tags":["bank-ramp-local"],"description":"Gives the user the account to pay and the **exact** amount to send (`amountToPay`, a few cents apart from what was asked so the payment is recognised), before `payBy`. The money lands on the user's balance (`delivery.kind` `balance`, the default) or is converted and sent as a stablecoin to an address (`stablecoin`). USD accounts have a rail each: `rail` picks one when there are several. Send an `Idempotency-Key`. 403 `BANK_RAMP_KYC_REQUIRED` until the user is verified; 422 `BANK_RAMP_LIMIT_EXCEEDED` past the tenant's 24-hour limit.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["asset","amount"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"asset":{"type":"string"},"amount":{"type":"string"},"rail":{"type":"string","enum":["ach","fedwire","swift"]},"delivery":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["balance","stablecoin"]},"asset":{"type":"string"},"network":{"type":"string","enum":["ethereum","solana","tron"]},"address":{"type":"string"}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","asset","requestedAmount","amountToPay","expectedCredit","status","delivery","payTo","payBy","matchedAt","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"asset":{"type":"string"},"requestedAmount":{"type":"string"},"amountToPay":{"type":"string"},"expectedCredit":{"type":"string"},"status":{"type":"string","enum":["open","matched","expired","cancelled"]},"delivery":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["balance","stablecoin"]},"asset":{"type":"string"},"network":{"type":"string"},"address":{"type":"string"}}},"payTo":{"type":["null","object"],"properties":{"asset":{"type":"string"},"rail":{"type":["null","string"]},"institution":{"type":["null","string"]},"accountName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"paybillNumber":{"type":["null","string"]},"routingNumber":{"type":["null","string"]},"bankCode":{"type":["null","string"]},"bankAddress":{"type":["null","string"]}}},"payBy":{"type":"string","format":"date-time"},"matchedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, the asset is not offered, or the terms do not fit the asset (`BANK_RAMP_INSTRUCTION_INVALID`, `BANK_RAMP_AMOUNT_INVALID` — also a `delivery` that is not a stablecoin on a network it exists on with an address of that network —, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_COLLECTION_TERMS_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, the asset is not offered, or the terms do not fit the asset (`BANK_RAMP_INSTRUCTION_INVALID`, `BANK_RAMP_AMOUNT_INVALID` — also a `delivery` that is not a stablecoin on a network it exists on with an address of that network —, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_COLLECTION_TERMS_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), or the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`); a stablecoin delivery for a user not registered (`BANK_RAMP_KYC_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), or the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`); a stablecoin delivery for a user not registered (`BANK_RAMP_KYC_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is not one of the tenant's (`BANK_RAMP_USER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is not one of the tenant's (`BANK_RAMP_USER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not set up yet for the tenant here (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_COLLECTION_TERMS_MISSING`, `BANK_RAMP_ACCOUNT_NOT_READY`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","content":{"application/json":{"schema":{"type":"object","description":"Not set up yet for the tenant here (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_COLLECTION_TERMS_MISSING`, `BANK_RAMP_ACCOUNT_NOT_READY`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Pay-ins of the asset are not enabled, or past the tenant's 24-hour limits (`BANK_RAMP_ASSET_NOT_ENABLED`, `BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","content":{"application/json":{"schema":{"type":"object","description":"Pay-ins of the asset are not enabled, or past the tenant's 24-hour limits (`BANK_RAMP_ASSET_NOT_ENABLED`, `BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"No unique amount is free now: try again shortly (`BANK_RAMP_INSTRUCTION_CAPACITY`); or the bank ramp is off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","content":{"application/json":{"schema":{"type":"object","description":"No unique amount is free now: try again shortly (`BANK_RAMP_INSTRUCTION_CAPACITY`); or the bank ramp is off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The user's pay-in instructions","tags":["bank-ramp-local"],"description":"Newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","instructions","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"instructions":{"type":"array","items":{"type":"object","required":["id","environment","asset","requestedAmount","amountToPay","expectedCredit","status","delivery","payTo","payBy","matchedAt","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"asset":{"type":"string"},"requestedAmount":{"type":"string"},"amountToPay":{"type":"string"},"expectedCredit":{"type":"string"},"status":{"type":"string","enum":["open","matched","expired","cancelled"]},"delivery":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["balance","stablecoin"]},"asset":{"type":"string"},"network":{"type":"string"},"address":{"type":"string"}}},"payTo":{"type":["null","object"],"properties":{"asset":{"type":"string"},"rail":{"type":["null","string"]},"institution":{"type":["null","string"]},"accountName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"paybillNumber":{"type":["null","string"]},"routingNumber":{"type":["null","string"]},"bankCode":{"type":["null","string"]},"bankAddress":{"type":["null","string"]}}},"payBy":{"type":"string","format":"date-time"},"matchedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/instructions/{id}":{"get":{"summary":"One pay-in instruction","tags":["bank-ramp-local"],"description":"404 when it is not the user's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","asset","requestedAmount","amountToPay","expectedCredit","status","delivery","payTo","payBy","matchedAt","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"asset":{"type":"string"},"requestedAmount":{"type":"string"},"amountToPay":{"type":"string"},"expectedCredit":{"type":"string"},"status":{"type":"string","enum":["open","matched","expired","cancelled"]},"delivery":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["balance","stablecoin"]},"asset":{"type":"string"},"network":{"type":"string"},"address":{"type":"string"}}},"payTo":{"type":["null","object"],"properties":{"asset":{"type":"string"},"rail":{"type":["null","string"]},"institution":{"type":["null","string"]},"accountName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"paybillNumber":{"type":["null","string"]},"routingNumber":{"type":["null","string"]},"bankCode":{"type":["null","string"]},"bankAddress":{"type":["null","string"]}}},"payBy":{"type":"string","format":"date-time"},"matchedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's instruction (`BANK_RAMP_INSTRUCTION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's instruction (`BANK_RAMP_INSTRUCTION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/instructions/{id}/cancel":{"post":{"summary":"Withdraw an open pay-in instruction","tags":["bank-ramp-local"],"description":"Only an `open` instruction; a payment of its amount arriving later goes to the tenant's review queue.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","asset","requestedAmount","amountToPay","expectedCredit","status","delivery","payTo","payBy","matchedAt","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"asset":{"type":"string"},"requestedAmount":{"type":"string"},"amountToPay":{"type":"string"},"expectedCredit":{"type":"string"},"status":{"type":"string","enum":["open","matched","expired","cancelled"]},"delivery":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["balance","stablecoin"]},"asset":{"type":"string"},"network":{"type":"string"},"address":{"type":"string"}}},"payTo":{"type":["null","object"],"properties":{"asset":{"type":"string"},"rail":{"type":["null","string"]},"institution":{"type":["null","string"]},"accountName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"paybillNumber":{"type":["null","string"]},"routingNumber":{"type":["null","string"]},"bankCode":{"type":["null","string"]},"bankAddress":{"type":["null","string"]}}},"payBy":{"type":"string","format":"date-time"},"matchedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_INSTRUCTION_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's instruction (`BANK_RAMP_INSTRUCTION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's instruction (`BANK_RAMP_INSTRUCTION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The instruction is not open (`BANK_RAMP_INSTRUCTION_CLOSED`)","content":{"application/json":{"schema":{"type":"object","description":"The instruction is not open (`BANK_RAMP_INSTRUCTION_CLOSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/offramps":{"post":{"summary":"Sell a stablecoin for local currency","tags":["bank-ramp-local"],"description":"Records the user's sale: the user's wallet sends exactly `transfer.amount` of `asset` on `network` from `fromAddress` to `transfer.toAddress`; once it arrives the bank ramp pays `payoutAsset` to `destination` (a bank account or a mobile money number) at the rate of that moment, less the bank ramp's fees and the tenant's markup. `indicativeRate` is a guide. Then call `…/sent` with the transaction hash. Send an `Idempotency-Key`. 403 `BANK_RAMP_KYC_REQUIRED`; 422 `BANK_RAMP_LIMIT_EXCEEDED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["network","asset","amount","fromAddress","payoutAsset","destination"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"network":{"type":"string","enum":["ethereum","solana","tron"]},"asset":{"type":"string"},"amount":{"type":"string"},"fromAddress":{"type":"string"},"payoutAsset":{"type":"string"},"destination":{"type":"object","additionalProperties":true},"travelRule":{"type":"object","additionalProperties":true}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","network","asset","amount","payoutAsset","destinationType","indicativeRate","state","failure","withdrawalId","transfer","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","enum":["bank","momo","wallet"]},"indicativeRate":{"type":["null","string"]},"state":{"type":"string","enum":["awaiting_transfer","sent","received","paying","paid","failed","cancelled"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"transfer":{"type":"object","required":["id","network","asset","amount","toAddress","fromAddress","status","txHash"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"},"status":{"type":"string"},"txHash":{"type":["null","string"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body or the destination is not valid, or the asset is not offered (`BANK_RAMP_OFFRAMP_INVALID`, `BANK_RAMP_DESTINATION_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_AMOUNT_INVALID`, `BANK_RAMP_COLLECTION_TERMS_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body or the destination is not valid, or the asset is not offered (`BANK_RAMP_OFFRAMP_INVALID`, `BANK_RAMP_DESTINATION_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_AMOUNT_INVALID`, `BANK_RAMP_COLLECTION_TERMS_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The user is not one of the tenant's (`BANK_RAMP_USER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The user is not one of the tenant's (`BANK_RAMP_USER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not set up yet for the tenant here (`BANK_RAMP_NOT_CONFIGURED`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","content":{"application/json":{"schema":{"type":"object","description":"Not set up yet for the tenant here (`BANK_RAMP_NOT_CONFIGURED`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Deposits of the asset are not taken, below 1 unit, or past the tenant's 24-hour limits (`BANK_RAMP_ASSET_NOT_ENABLED`, `BANK_RAMP_DEPOSIT_ASSET_NOT_ACCEPTED`, `BANK_RAMP_DEPOSIT_TOO_SMALL`, `BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","content":{"application/json":{"schema":{"type":"object","description":"Deposits of the asset are not taken, below 1 unit, or past the tenant's 24-hour limits (`BANK_RAMP_ASSET_NOT_ENABLED`, `BANK_RAMP_DEPOSIT_ASSET_NOT_ACCEPTED`, `BANK_RAMP_DEPOSIT_TOO_SMALL`, `BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"No unique amount is free now: try again shortly (`BANK_RAMP_INSTRUCTION_CAPACITY`); or the bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"No unique amount is free now: try again shortly (`BANK_RAMP_INSTRUCTION_CAPACITY`); or the bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The user's sales of stablecoin","tags":["bank-ramp-local"],"description":"Newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","offramps","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"offramps":{"type":"array","items":{"type":"object","required":["id","environment","network","asset","amount","payoutAsset","destinationType","indicativeRate","state","failure","withdrawalId","transfer","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","enum":["bank","momo","wallet"]},"indicativeRate":{"type":["null","string"]},"state":{"type":"string","enum":["awaiting_transfer","sent","received","paying","paid","failed","cancelled"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"transfer":{"type":"object","required":["id","network","asset","amount","toAddress","fromAddress","status","txHash"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"},"status":{"type":"string"},"txHash":{"type":["null","string"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_OFFRAMP_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_OFFRAMP_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/offramps/{id}":{"get":{"summary":"One sale of stablecoin","tags":["bank-ramp-local"],"description":"404 `BANK_RAMP_OFFRAMP_NOT_FOUND` when it is not the user's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","network","asset","amount","payoutAsset","destinationType","indicativeRate","state","failure","withdrawalId","transfer","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","enum":["bank","momo","wallet"]},"indicativeRate":{"type":["null","string"]},"state":{"type":"string","enum":["awaiting_transfer","sent","received","paying","paid","failed","cancelled"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"transfer":{"type":"object","required":["id","network","asset","amount","toAddress","fromAddress","status","txHash"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"},"status":{"type":"string"},"txHash":{"type":["null","string"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_OFFRAMP_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_OFFRAMP_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/offramps/{id}/sent":{"post":{"summary":"Say the stablecoin was sent","tags":["bank-ramp-local"],"description":"The transaction hash of the user's transfer (once; the same hash again answers the same).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["txHash"],"additionalProperties":false,"properties":{"txHash":{"type":"string"}}}}},"required":true},"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","network","asset","amount","payoutAsset","destinationType","indicativeRate","state","failure","withdrawalId","transfer","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","enum":["bank","momo","wallet"]},"indicativeRate":{"type":["null","string"]},"state":{"type":"string","enum":["awaiting_transfer","sent","received","paying","paid","failed","cancelled"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"transfer":{"type":"object","required":["id","network","asset","amount","toAddress","fromAddress","status","txHash"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"},"status":{"type":"string"},"txHash":{"type":["null","string"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Not a transaction hash of the network, or the sale is past this step (`BANK_RAMP_OFFRAMP_INVALID`, `BANK_RAMP_AMOUNT_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"Not a transaction hash of the network, or the sale is past this step (`BANK_RAMP_OFFRAMP_INVALID`, `BANK_RAMP_AMOUNT_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`, `BANK_RAMP_DEPOSIT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`, `BANK_RAMP_DEPOSIT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The hash was given for another transfer, or the transfer is past this step (`BANK_RAMP_DEPOSIT_TX_USED`, `BANK_RAMP_DEPOSIT_STATE`)","content":{"application/json":{"schema":{"type":"object","description":"The hash was given for another transfer, or the transfer is past this step (`BANK_RAMP_DEPOSIT_TX_USED`, `BANK_RAMP_DEPOSIT_STATE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/offramps/{id}/cancel":{"post":{"summary":"Cancel a sale whose stablecoin was not sent","tags":["bank-ramp-local"],"description":"Only while `awaiting_transfer`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","network","asset","amount","payoutAsset","destinationType","indicativeRate","state","failure","withdrawalId","transfer","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"payoutAsset":{"type":"string"},"destinationType":{"type":"string","enum":["bank","momo","wallet"]},"indicativeRate":{"type":["null","string"]},"state":{"type":"string","enum":["awaiting_transfer","sent","received","paying","paid","failed","cancelled"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"transfer":{"type":"object","required":["id","network","asset","amount","toAddress","fromAddress","status","txHash"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string"},"asset":{"type":"string"},"amount":{"type":"string"},"toAddress":{"type":"string"},"fromAddress":{"type":"string"},"status":{"type":"string"},"txHash":{"type":["null","string"]}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The stablecoin was sent already (`BANK_RAMP_OFFRAMP_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The stablecoin was sent already (`BANK_RAMP_OFFRAMP_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`, `BANK_RAMP_DEPOSIT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_OFFRAMP_NOT_FOUND`, `BANK_RAMP_DEPOSIT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The transfer is past this step (`BANK_RAMP_DEPOSIT_STATE`)","content":{"application/json":{"schema":{"type":"object","description":"The transfer is past this step (`BANK_RAMP_DEPOSIT_STATE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/deliveries":{"get":{"summary":"Stablecoin deliveries of the user's pay-ins","tags":["bank-ramp-local"],"description":"A pay-in whose instruction asked for a stablecoin is converted and sent to its address; each delivery says where it stands. Newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","deliveries","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"deliveries":{"type":"array","items":{"type":"object","required":["id","instructionId","fromAsset","fromAmount","toAsset","network","address","state","failure","withdrawalId","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"instructionId":{"type":"string","format":"uuid"},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"network":{"type":"string"},"address":{"type":"string"},"state":{"type":"string","enum":["converting","paying","delivered","failed"]},"failure":{"type":["null","string"]},"withdrawalId":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_DELIVERY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_DELIVERY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/withdrawals":{"post":{"summary":"Withdraw from the user's balance","tags":["bank-ramp-local"],"description":"Pays `amount` of `asset` to `destination` — a bank account, a mobile money number, or a wallet address — from the user's balance. To pay in another currency than the one held, name `sourceAsset` (what the user's balance gives) and `sourceAmountLimit` (the most it may give). Bank-ramp fees and the tenant's markup are reserved first and released when known. Send an `Idempotency-Key`. 403 `BANK_RAMP_KYC_REQUIRED`; 422 `BANK_RAMP_LIMIT_EXCEEDED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["asset","amount","destination"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"asset":{"type":"string"},"amount":{"type":"string"},"sourceAsset":{"type":"string"},"sourceAmountLimit":{"type":"string"},"destination":{"type":"object","additionalProperties":true},"travelRule":{"type":"object","additionalProperties":true}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","purpose","attempt","retryOf","asset","amount","sourceAsset","sourceAmount","fee","rate","destinationType","destination","status","failureCode","sentAt","completedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"purpose":{"type":"string","enum":["off_ramp","on_ramp","treasury"]},"attempt":{"type":"integer"},"retryOf":{"type":["null","string"],"format":"uuid"},"asset":{"type":"string"},"amount":{"type":"string"},"sourceAsset":{"type":"string"},"sourceAmount":{"type":["null","string"]},"fee":{"type":["null","string"]},"rate":{"type":["null","string"]},"destinationType":{"type":"string","enum":["bank","momo","wallet","beneficiary"]},"destination":{"type":"object","additionalProperties":{"type":"string"}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","held","pending","succeeded","failed","reversed"]},"failureCode":{"type":["null","string"]},"sentAt":{"type":["null","string"],"format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body or the destination is not valid, or the asset is not offered (`BANK_RAMP_PAYOUT_INVALID`, `BANK_RAMP_PAYOUT_AMOUNT_INVALID`, `BANK_RAMP_DESTINATION_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_PAYOUT_DOCUMENT_REQUIRED`, `BANK_RAMP_PAYOUT_DOCUMENT_UNKNOWN`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body or the destination is not valid, or the asset is not offered (`BANK_RAMP_PAYOUT_INVALID`, `BANK_RAMP_PAYOUT_AMOUNT_INVALID`, `BANK_RAMP_DESTINATION_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_PAYOUT_DOCUMENT_REQUIRED`, `BANK_RAMP_PAYOUT_DOCUMENT_UNKNOWN`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The USD beneficiary is not the tenant's (`BANK_RAMP_BENEFICIARY_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"The USD beneficiary is not the tenant's (`BANK_RAMP_BENEFICIARY_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not enough on the user's balance for the payout and its fees (`BANK_RAMP_PAYOUT_BALANCE_LOW`), payouts are held while the bank ramp's ledger is being reconciled (`BANK_RAMP_PAYOUTS_HELD_RECONCILIATION`: try again later), the USD beneficiary is not active (`BANK_RAMP_BENEFICIARY_NOT_ACTIVE`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","content":{"application/json":{"schema":{"type":"object","description":"Not enough on the user's balance for the payout and its fees (`BANK_RAMP_PAYOUT_BALANCE_LOW`), payouts are held while the bank ramp's ledger is being reconciled (`BANK_RAMP_PAYOUTS_HELD_RECONCILIATION`: try again later), the USD beneficiary is not active (`BANK_RAMP_BENEFICIARY_NOT_ACTIVE`), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Past the tenant's 24-hour limits: an amount per asset, or a number of operations per user (`BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","content":{"application/json":{"schema":{"type":"object","description":"Past the tenant's 24-hour limits: an amount per asset, or a number of operations per user (`BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is not set up for the tenant here, or off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is not set up for the tenant here, or off for the platform (`BANK_RAMP_NOT_CONFIGURED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The user's withdrawals","tags":["bank-ramp-local"],"description":"Newest first; a withdrawal sent again after a failure is its own attempt (`retryOf`).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","withdrawals","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"withdrawals":{"type":"array","items":{"type":"object","required":["id","environment","purpose","attempt","retryOf","asset","amount","sourceAsset","sourceAmount","fee","rate","destinationType","destination","status","failureCode","sentAt","completedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"purpose":{"type":"string","enum":["off_ramp","on_ramp","treasury"]},"attempt":{"type":"integer"},"retryOf":{"type":["null","string"],"format":"uuid"},"asset":{"type":"string"},"amount":{"type":"string"},"sourceAsset":{"type":"string"},"sourceAmount":{"type":["null","string"]},"fee":{"type":["null","string"]},"rate":{"type":["null","string"]},"destinationType":{"type":"string","enum":["bank","momo","wallet","beneficiary"]},"destination":{"type":"object","additionalProperties":{"type":"string"}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","held","pending","succeeded","failed","reversed"]},"failureCode":{"type":["null","string"]},"sentAt":{"type":["null","string"],"format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_PAYOUT_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_PAYOUT_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/withdrawals/{id}":{"get":{"summary":"One withdrawal","tags":["bank-ramp-local"],"description":"404 `BANK_RAMP_PAYOUT_NOT_FOUND` when it is not the user's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","purpose","attempt","retryOf","asset","amount","sourceAsset","sourceAmount","fee","rate","destinationType","destination","status","failureCode","sentAt","completedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"purpose":{"type":"string","enum":["off_ramp","on_ramp","treasury"]},"attempt":{"type":"integer"},"retryOf":{"type":["null","string"],"format":"uuid"},"asset":{"type":"string"},"amount":{"type":"string"},"sourceAsset":{"type":"string"},"sourceAmount":{"type":["null","string"]},"fee":{"type":["null","string"]},"rate":{"type":["null","string"]},"destinationType":{"type":"string","enum":["bank","momo","wallet","beneficiary"]},"destination":{"type":"object","additionalProperties":{"type":"string"}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","held","pending","succeeded","failed","reversed"]},"failureCode":{"type":["null","string"]},"sentAt":{"type":["null","string"],"format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_PAYOUT_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_PAYOUT_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_PAYOUT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_PAYOUT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/corridors":{"get":{"summary":"The desk's corridors","tags":["bank-ramp-desk"],"description":"Per asset, the desk's indicative rates to and from a bank, its minimum, and whether it is open now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","corridors"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"corridors":{"type":"array","items":{"type":"object","required":["asset","rateToBank","rateFromBank","minimum","open"],"properties":{"asset":{"type":"string"},"rateToBank":{"type":["null","string"]},"rateFromBank":{"type":["null","string"]},"minimum":{"type":"string"},"open":{"type":"boolean"}}}}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_ORDER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_ORDER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or the desk is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or the desk is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/quotes":{"post":{"summary":"Quote a desk order","tags":["bank-ramp-desk"],"description":"A stablecoin → local currency to a bank (`to_bank`) or local currency from a bank → stablecoin (`from_bank`): give `fromAmount` or `toAmount`. The quote holds until `quoteExpiresAt` (about a minute): confirm it before then; the tenant's 24-hour limit is checked when it is confirmed. Send an `Idempotency-Key`. 403 `BANK_RAMP_KYC_REQUIRED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["fromAsset","toAsset"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"fromAsset":{"type":"string"},"toAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAmount":{"type":"string"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","direction","fromAsset","fromAmount","toAsset","toAmount","rate","quoteExpiresAt","beneficiary","funding","status","failureCode","proofRejectedReason","refundStatus","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"direction":{"type":"string","enum":["to_bank","from_bank"]},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"quoteExpiresAt":{"type":"string","format":"date-time"},"beneficiary":{"type":["null","object"],"additionalProperties":{"type":"string"}},"funding":{"type":["null","object"],"properties":{"bankName":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"reference":{"type":"string"},"amount":{"type":"string"},"asset":{"type":"string"},"deadline":{"type":"string"}}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","accepted","processing","awaiting_instructions","awaiting_funds","proof_submitted","funds_confirmed","expired","completed","failed","cancelled"]},"failureCode":{"type":["null","string"]},"proofRejectedReason":{"type":["null","string"]},"refundStatus":{"type":["null","string"],"enum":["pending","returned",null]},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, the pair is not traded now, or below the desk's minimum (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_AMOUNT_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_AMOUNT_BELOW_MINIMUM`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, the pair is not traded now, or below the desk's minimum (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_AMOUNT_INVALID`, `BANK_RAMP_PAIR_UNAVAILABLE`, `BANK_RAMP_AMOUNT_BELOW_MINIMUM`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), or the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), or the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"`IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","content":{"application/json":{"schema":{"type":"object","description":"`IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Refused by the bank ramp (`BANK_RAMP_AMOUNT_BELOW_MINIMUM`, `BANK_RAMP_AMOUNT_ABOVE_MAXIMUM`, `BANK_RAMP_NOT_OFFERED`)","content":{"application/json":{"schema":{"type":"object","description":"Refused by the bank ramp (`BANK_RAMP_AMOUNT_BELOW_MINIMUM`, `BANK_RAMP_AMOUNT_ABOVE_MAXIMUM`, `BANK_RAMP_NOT_OFFERED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/orders/{id}/confirm":{"post":{"summary":"Confirm a quoted desk order","tags":["bank-ramp-desk"],"description":"A `to_bank` order names the `beneficiary` bank account and reserves the stablecoin on the user's balance; a `from_bank` order answers the `funding` block — the account to pay, the **reference** to write on the payment, the amount and the deadline. Send an `Idempotency-Key`. 403 `BANK_RAMP_KYC_REQUIRED`; 422 `BANK_RAMP_LIMIT_EXCEEDED` past the tenant's 24-hour limit.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"beneficiary":{"type":"object","required":["name","bankName","accountNumber"],"additionalProperties":false,"properties":{"name":{"type":"string"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"branch":{"type":["null","string"]}}}}}}}},"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","direction","fromAsset","fromAmount","toAsset","toAmount","rate","quoteExpiresAt","beneficiary","funding","status","failureCode","proofRejectedReason","refundStatus","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"direction":{"type":"string","enum":["to_bank","from_bank"]},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"quoteExpiresAt":{"type":"string","format":"date-time"},"beneficiary":{"type":["null","object"],"additionalProperties":{"type":"string"}},"funding":{"type":["null","object"],"properties":{"bankName":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"reference":{"type":"string"},"amount":{"type":"string"},"asset":{"type":"string"},"deadline":{"type":"string"}}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","accepted","processing","awaiting_instructions","awaiting_funds","proof_submitted","funds_confirmed","expired","completed","failed","cancelled"]},"failureCode":{"type":["null","string"]},"proofRejectedReason":{"type":["null","string"]},"refundStatus":{"type":["null","string"],"enum":["pending","returned",null]},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid, or a to-bank order without its beneficiary (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_BENEFICIARY_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or a to-bank order without its beneficiary (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_BENEFICIARY_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), the user is not verified (`BANK_RAMP_KYC_REQUIRED`), the function or the integration mode is off for the tenant here (`BANK_RAMP_FUNCTION_OFF`, `BANK_RAMP_MODE_OFF`), or a passkey step-up is required and missing or not valid (`STEP_UP_REQUIRED`, `STEP_UP_INVALID`: when Aurea requires it, the request carries the user's step-up token for `bank_ramp.payout` in the `x-aurea-step-up` header)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's order (`BANK_RAMP_ORDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's order (`BANK_RAMP_ORDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not waiting to be confirmed, the quote expired, or not enough on the balance (`BANK_RAMP_ORDER_NOT_PREPARED`, `BANK_RAMP_QUOTE_EXPIRED`, `BANK_RAMP_ORDER_BALANCE_LOW`), a to-bank order held while the bank ramp's ledger is being reconciled (`BANK_RAMP_PAYOUTS_HELD_RECONCILIATION`: try again later), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","content":{"application/json":{"schema":{"type":"object","description":"Not waiting to be confirmed, the quote expired, or not enough on the balance (`BANK_RAMP_ORDER_NOT_PREPARED`, `BANK_RAMP_QUOTE_EXPIRED`, `BANK_RAMP_ORDER_BALANCE_LOW`), a to-bank order held while the bank ramp's ledger is being reconciled (`BANK_RAMP_PAYOUTS_HELD_RECONCILIATION`: try again later), or `IDEMPOTENCY_KEY_REUSED` (the key came with another body), `IDEMPOTENCY_IN_PROGRESS`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Past the tenant's 24-hour limits: an amount per asset, or a number of operations per user (`BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","content":{"application/json":{"schema":{"type":"object","description":"Past the tenant's 24-hour limits: an amount per asset, or a number of operations per user (`BANK_RAMP_LIMIT_EXCEEDED`, `BANK_RAMP_VELOCITY_EXCEEDED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/orders":{"get":{"summary":"The user's desk orders","tags":["bank-ramp-desk"],"description":"Newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","orders","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"orders":{"type":"array","items":{"type":"object","required":["id","environment","direction","fromAsset","fromAmount","toAsset","toAmount","rate","quoteExpiresAt","beneficiary","funding","status","failureCode","proofRejectedReason","refundStatus","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"direction":{"type":"string","enum":["to_bank","from_bank"]},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"quoteExpiresAt":{"type":"string","format":"date-time"},"beneficiary":{"type":["null","object"],"additionalProperties":{"type":"string"}},"funding":{"type":["null","object"],"properties":{"bankName":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"reference":{"type":"string"},"amount":{"type":"string"},"asset":{"type":"string"},"deadline":{"type":"string"}}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","accepted","processing","awaiting_instructions","awaiting_funds","proof_submitted","funds_confirmed","expired","completed","failed","cancelled"]},"failureCode":{"type":["null","string"]},"proofRejectedReason":{"type":["null","string"]},"refundStatus":{"type":["null","string"],"enum":["pending","returned",null]},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The query is not valid (`BANK_RAMP_ORDER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`BANK_RAMP_ORDER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/orders/{id}":{"get":{"summary":"One desk order","tags":["bank-ramp-desk"],"description":"404 `BANK_RAMP_ORDER_NOT_FOUND` when it is not the user's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","direction","fromAsset","fromAmount","toAsset","toAmount","rate","quoteExpiresAt","beneficiary","funding","status","failureCode","proofRejectedReason","refundStatus","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"direction":{"type":"string","enum":["to_bank","from_bank"]},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"quoteExpiresAt":{"type":"string","format":"date-time"},"beneficiary":{"type":["null","object"],"additionalProperties":{"type":"string"}},"funding":{"type":["null","object"],"properties":{"bankName":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"reference":{"type":"string"},"amount":{"type":"string"},"asset":{"type":"string"},"deadline":{"type":"string"}}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","accepted","processing","awaiting_instructions","awaiting_funds","proof_submitted","funds_confirmed","expired","completed","failed","cancelled"]},"failureCode":{"type":["null","string"]},"proofRejectedReason":{"type":["null","string"]},"refundStatus":{"type":["null","string"],"enum":["pending","returned",null]},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_ORDER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_ORDER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/orders/{id}/proof":{"put":{"summary":"Upload the proof of a from-bank payment","tags":["bank-ramp-desk"],"description":"The receipt of the user's bank payment, as the raw body: `application/pdf`, `image/png` or `image/jpeg`, at most 10 MiB. A refused proof says why (`proofRejectedReason`): upload a new one.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","direction","fromAsset","fromAmount","toAsset","toAmount","rate","quoteExpiresAt","beneficiary","funding","status","failureCode","proofRejectedReason","refundStatus","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"direction":{"type":"string","enum":["to_bank","from_bank"]},"fromAsset":{"type":"string"},"fromAmount":{"type":"string"},"toAsset":{"type":"string"},"toAmount":{"type":"string"},"rate":{"type":"string"},"quoteExpiresAt":{"type":"string","format":"date-time"},"beneficiary":{"type":["null","object"],"additionalProperties":{"type":"string"}},"funding":{"type":["null","object"],"properties":{"bankName":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"reference":{"type":"string"},"amount":{"type":"string"},"asset":{"type":"string"},"deadline":{"type":"string"}}},"status":{"type":"string","enum":["prepared","sending","paused","unknown","refused","accepted","processing","awaiting_instructions","awaiting_funds","proof_submitted","funds_confirmed","expired","completed","failed","cancelled"]},"failureCode":{"type":["null","string"]},"proofRejectedReason":{"type":["null","string"]},"refundStatus":{"type":["null","string"],"enum":["pending","returned",null]},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Not a PDF, PNG or JPEG (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_PROOF_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"Not a PDF, PNG or JPEG (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_PROOF_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The order takes no proof now, or one is being sent, or the bank ramp lost track of the last one (`BANK_RAMP_ORDER_PROOF_NOT_EXPECTED`, `BANK_RAMP_ORDER_PROOF_IN_PROGRESS`, `BANK_RAMP_ORDER_PROOF_UNKNOWN`)","content":{"application/json":{"schema":{"type":"object","description":"The order takes no proof now, or one is being sent, or the bank ramp lost track of the last one (`BANK_RAMP_ORDER_PROOF_NOT_EXPECTED`, `BANK_RAMP_ORDER_PROOF_IN_PROGRESS`, `BANK_RAMP_ORDER_PROOF_UNKNOWN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"Larger than 10 MiB","content":{"application/json":{"schema":{"type":"object","description":"Larger than 10 MiB","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"A link to the order's proof","tags":["bank-ramp-desk"],"description":"A signed link valid for about five minutes.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["url","expiresAt"],"properties":{"url":{"type":"string"},"expiresAt":{"type":"string"}}}}}},"400":{"description":"The id or the query is not valid (`BANK_RAMP_ORDER_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id or the query is not valid (`BANK_RAMP_ORDER_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's order, or it has no proof (`BANK_RAMP_ORDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's order, or it has no proof (`BANK_RAMP_ORDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp answered unusably (`BANK_RAMP_UPSTREAM_ERROR`, `BANK_RAMP_UNEXPECTED_RESPONSE`, `BANK_RAMP_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The bank ramp is off for the platform, paused or not reachable now (`BANK_RAMP_NOT_CONFIGURED`, `BANK_RAMP_PAUSED`, `BANK_RAMP_UNAVAILABLE`, `BANK_RAMP_UNREACHABLE`, `BANK_RAMP_TIMEOUT`, `BANK_RAMP_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/ramp/bank/customer/desk/orders/{id}/cancellation":{"post":{"summary":"Ask to cancel a desk order","tags":["bank-ramp-desk"],"description":"The desk's operations decide; the order's status then moves with them. One request at a time.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reason"],"additionalProperties":false,"properties":{"reason":{"type":"string"}}}}},"required":true},"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The bank ramp's environment: true for sandbox, false or omitted for production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","orderId","status","reason","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"orderId":{"type":"string","format":"uuid"},"status":{"type":"string"},"reason":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The body is not valid (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_CANCELLATION_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`BANK_RAMP_ORDER_INVALID`, `BANK_RAMP_ORDER_CANCELLATION_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"Not the user's (`BANK_RAMP_ORDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The order ended, or a request is in progress (`BANK_RAMP_ORDER_FINAL`, `BANK_RAMP_ORDER_CANCELLATION_OPEN`)","content":{"application/json":{"schema":{"type":"object","description":"The order ended, or a request is in progress (`BANK_RAMP_ORDER_FINAL`, `BANK_RAMP_ORDER_CANCELLATION_OPEN`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles":{"get":{"summary":"The tenant's fiat account profiles","tags":["fiat-profiles"],"description":"Newest first; `state` filters (several, comma-separated).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string"},"in":"query","name":"state","required":false,"description":"e.g. verified,under_review"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","profiles","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"profiles":{"type":"array","items":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Open a fiat account for one of the tenant's end users","tags":["fiat-profiles"],"description":"Creates the user's account (KYC for a person, KYB for a business) with what `profile` says; the account is then verified (`state`). One profile per user and environment. 202 when the answer could not be matched to the request: Aurea's operators settle it, the profile moves then. Every change of `state` is sent as `fiat.profile.updated`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId","profile"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"userId":{"type":"string","format":"uuid","description":"The tenant's end user this profile is for"},"profile":{"type":"object","required":["type","email","firstName","lastName","country","phone","entityType","taxId","address"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["business","person","incomplete"]},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"middleName":{"type":"string"},"lastName":{"type":"string"},"otherName":{"type":"string"},"displayName":{"type":"string"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"phone":{"type":"object","required":["number"],"additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,15}$"}}},"businessName":{"type":"string","description":"Required for a business"},"entityType":{"type":"string","enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project"],"description":"A business: corporation, limited_company, non_profit or partnership; a person: contractor, sole_proprietorship, personal_use, freelancer or side_project"},"dateOfBirth":{"type":"string","format":"date","description":"Required for a person"},"taxId":{"type":"string"},"industry":{"type":"string"},"subIndustry":{"type":"string"},"website":{"type":"string","format":"uri"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"purposeOfPayment":{"type":"string"},"purposeOfPaymentDescription":{"type":"string"},"platform":{"type":"object","additionalProperties":false,"properties":{"joinedOn":{"type":"string","format":"date"},"lastActiveOn":{"type":"string","format":"date"},"merchantCategoryCode":{"type":"string","pattern":"^[0-9]{4}$"}}},"managingPartner":{"type":"object","required":["fullName","taxId"],"additionalProperties":false,"properties":{"fullName":{"type":"string"},"taxId":{"type":"string"}}}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the account's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the account's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such user of the tenant (`FIAT_HOLDER_USER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such user of the tenant (`FIAT_HOLDER_USER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The user already has a profile here, or the account exists (`FIAT_HOLDER_EXISTS`, `FIAT_ALREADY_EXISTS`)","content":{"application/json":{"schema":{"type":"object","description":"The user already has a profile here, or the account exists (`FIAT_HOLDER_EXISTS`, `FIAT_ALREADY_EXISTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/tenant":{"post":{"summary":"Use the tenant's own fiat account as a profile","tags":["fiat-profiles"],"description":"The tenant's own account (the one its fiat accounts are set up with) as a profile of its own: its balances, virtual accounts and transfers then work as an end user's.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["type","country"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The tenant's profile exists already (`FIAT_HOLDER_EXISTS`)","content":{"application/json":{"schema":{"type":"object","description":"The tenant's profile exists already (`FIAT_HOLDER_EXISTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}":{"get":{"summary":"One profile","tags":["fiat-profiles"],"description":"As the Hub last knows it; `POST …/refresh` reads it again.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"patch":{"summary":"Change a profile","tags":["fiat-profiles"],"description":"Only the fields sent change; a phone number changes with its country code, a sub-industry with its industry.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"firstName":{"type":"string"},"lastName":{"type":"string"},"displayName":{"type":"string"},"phone":{"type":"object","required":["number"],"additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,15}$"}}},"businessName":{"type":"string"},"taxId":{"type":"string"},"industry":{"type":"string"},"subIndustry":{"type":"string"},"website":{"type":"string","format":"uri"},"entityType":{"type":"string","enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"address":{"type":"object","required":[],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"platform":{"type":"object","additionalProperties":false,"properties":{"joinedOn":{"type":"string","format":"date"},"lastActiveOn":{"type":"string","format":"date"},"merchantCategoryCode":{"type":"string","pattern":"^[0-9]{4}$"}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the account's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the account's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/refresh":{"post":{"summary":"Read a profile's verification again now","tags":["fiat-profiles"],"description":"What the account says now (the Hub also follows it by itself).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/documents":{"get":{"summary":"A profile's verification documents","tags":["fiat-profiles"],"description":"Their types, states and SHA-256 only: the files are never kept.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","documents"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"documents":{"type":"array","items":{"type":"object","required":["id","profileId","type","ownerId","sha256","sizeBytes","extension","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["address","business","identity","selfie","photo_id_front","photo_id_back","source_of_funds","beneficial_ownership","proof_of_balance","accountant_authorization","non_profit_registration","non_profit_signatories","other"]},"ownerId":{"type":["null","string"]},"sha256":{"type":"string"},"sizeBytes":{"type":"integer"},"extension":{"type":"string"},"status":{"type":"string","enum":["uploading","uploaded","unconfirmed","failed"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Send a verification document","tags":["fiat-profiles"],"description":"multipart/form-data: the fields `type` (address, business, identity, selfie, photo_id_front, photo_id_back, source_of_funds, beneficial_ownership, proof_of_balance, accountant_authorization, non_profit_registration, non_profit_signatories, other), `description`, `ownerId` (a beneficial owner's, optional) and `isTestnet`, then the `file` (at most 10 MB). Only its SHA-256 is kept. 202 when the answer could not be matched.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","profileId","type","ownerId","sha256","sizeBytes","extension","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["address","business","identity","selfie","photo_id_front","photo_id_back","source_of_funds","beneficial_ownership","proof_of_balance","accountant_authorization","non_profit_registration","non_profit_signatories","other"]},"ownerId":{"type":["null","string"]},"sha256":{"type":"string"},"sizeBytes":{"type":"integer"},"extension":{"type":"string"},"status":{"type":"string","enum":["uploading","uploaded","unconfirmed","failed"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","profileId","type","ownerId","sha256","sizeBytes","extension","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["address","business","identity","selfie","photo_id_front","photo_id_back","source_of_funds","beneficial_ownership","proof_of_balance","accountant_authorization","non_profit_registration","non_profit_signatories","other"]},"ownerId":{"type":["null","string"]},"sha256":{"type":"string"},"sizeBytes":{"type":"integer"},"extension":{"type":"string"},"status":{"type":"string","enum":["uploading","uploaded","unconfirmed","failed"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Not a document the account takes (`FIAT_DOCUMENT_INVALID`, `FIAT_REQUEST_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"Not a document the account takes (`FIAT_DOCUMENT_INVALID`, `FIAT_REQUEST_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The document is too large","content":{"application/json":{"schema":{"type":"object","description":"The document is too large","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/owners":{"get":{"summary":"A business profile's beneficial owners","tags":["fiat-profiles"],"description":"Their structure only (ids, kinds, ownership, documents): names and tax ids are never kept.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Send a business's beneficial ownership (KYB)","tags":["fiat-profiles"],"description":"The whole ownership at once: people owning 25% or more, businesses owning them (three levels at most), and the control person, with the profile's attestation.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["attested"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"attested":{"type":"boolean","description":"The profile attests the ownership given is complete and true"},"people":{"type":"array","items":{"type":"object","required":["controlPerson","firstName","lastName","taxId","ownership","dateOfBirth","citizenship","address"],"additionalProperties":false,"properties":{"controlPerson":{"type":"boolean"},"title":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"object","additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,12}$"},"type":{"type":"string","enum":["mobile","home","business"]}}},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"dateOfBirth":{"type":"string","format":"date"},"citizenship":{"type":"string","pattern":"^[A-Z]{2}$"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}}}},"maxItems":50},"businesses":{"type":"array","items":{"type":"object","required":["name","taxId","ownership","address"],"additionalProperties":false,"properties":{"name":{"type":"string"},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"people":{"type":"array","items":{"type":"object","required":["controlPerson","firstName","lastName","taxId","ownership","dateOfBirth","citizenship","address"],"additionalProperties":false,"properties":{"controlPerson":{"type":"boolean"},"title":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"object","additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,12}$"},"type":{"type":"string","enum":["mobile","home","business"]}}},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"dateOfBirth":{"type":"string","format":"date"},"citizenship":{"type":"string","pattern":"^[A-Z]{2}$"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}}}},"maxItems":50},"businesses":{"type":"array","maxItems":50,"items":{"type":"object","description":"A business owner of this business (the same shape)"}}}},"maxItems":50}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/owners/refresh":{"post":{"summary":"Read a profile's beneficial owners again","tags":["fiat-profiles"],"description":"What the account holds now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/owners/{ownerId}":{"patch":{"summary":"Change a beneficial owner's fields","tags":["fiat-profiles"],"description":"`person` or `business`, one of them.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"person":{"type":"object","required":[],"additionalProperties":false,"properties":{"controlPerson":{"type":"boolean"},"title":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"object","additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,12}$"},"type":{"type":"string","enum":["mobile","home","business"]}}},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"dateOfBirth":{"type":"string","format":"date"},"citizenship":{"type":"string","pattern":"^[A-Z]{2}$"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}}}},"business":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true},{"schema":{"type":"string","pattern":"^[0-9]{1,19}$"},"in":"path","name":"ownerId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"put":{"summary":"Replace a beneficial owner, or add one under `parentId`","tags":["fiat-profiles"],"description":"`person` or `business`, one of them.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"person":{"type":"object","required":["controlPerson","firstName","lastName","taxId","ownership","dateOfBirth","citizenship","address"],"additionalProperties":false,"properties":{"controlPerson":{"type":"boolean"},"title":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"object","additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,12}$"},"type":{"type":"string","enum":["mobile","home","business"]}}},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"dateOfBirth":{"type":"string","format":"date"},"citizenship":{"type":"string","pattern":"^[A-Z]{2}$"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"parentId":{"type":"string","pattern":"^[0-9]{1,19}$"}}},"business":{"type":"object","required":["name","taxId","ownership","address"],"additionalProperties":false,"properties":{"name":{"type":"string"},"taxId":{"type":"string"},"ownership":{"type":"string","pattern":"^(100(\\.0{1,6})?|[0-9]{1,2}(\\.[0-9]{1,6})?)$","description":"Percent owned, as a decimal string (at least 25)"},"documentIds":{"type":"array","items":{"type":"string"},"maxItems":100},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"parentId":{"type":"string","pattern":"^[0-9]{1,19}$"}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true},{"schema":{"type":"string","pattern":"^[0-9]{1,19}$"},"in":"path","name":"ownerId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Remove a beneficial owner (and those it owns)","tags":["fiat-profiles"],"description":"`person` or `business`, one of them.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true},{"schema":{"type":"string","pattern":"^[0-9]{1,19}$"},"in":"path","name":"ownerId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","attested","syncedAt","owners"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"attested":{"type":["null","boolean"]},"syncedAt":{"type":["null","string"],"format":"date-time"},"owners":{"type":"array","items":{"type":"object","required":["id","parentId","kind","depth","controlPerson","hasTitle","ownership","documentIds"],"properties":{"id":{"type":"string"},"parentId":{"type":["null","string"]},"kind":{"type":"string","enum":["person","business"]},"depth":{"type":"integer"},"controlPerson":{"type":["null","boolean"]},"hasTitle":{"type":["null","boolean"]},"ownership":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The ownership, in percent"},"documentIds":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the ownership's rules (`FIAT_REQUEST_INVALID`, `FIAT_OWNERS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile or owner of the tenant (`FIAT_HOLDER_NOT_FOUND`, `FIAT_OWNER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or its ownership was sent already (`FIAT_HOLDER_NOT_LINKED`, `FIAT_OWNERS_EXIST`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/profiles/{profileId}/regulatory-data":{"put":{"summary":"Send a Canadian profile's regulatory data","tags":["fiat-profiles"],"description":"For a profile in Canada: the person's occupation, date of birth (18 to 120 years old) and Canadian address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["firstName","lastName","occupation","dateOfBirth","address"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"firstName":{"type":"string"},"lastName":{"type":"string"},"middleName":{"type":"string"},"occupation":{"type":"string"},"dateOfBirth":{"type":"string","format":"date"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","enum":["CA"]},"line1":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The province's two letters"}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the data's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the data's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts":{"get":{"summary":"The tenant's profiles' bank accounts","tags":["fiat-bank-accounts"],"description":"Newest first; `profileId` keeps one profile's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","bankAccounts","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"bankAccounts":{"type":"array","items":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Add a bank account to a profile","tags":["fiat-bank-accounts"],"description":"Its fields are checked against its country's needs before anything is sent: a refusal (`FIAT_BANK_FIELDS_INVALID`) names each missing or malformed field. 202 when the answer could not be matched. Every change is sent as `fiat.bank_account.updated`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId","bankAccount"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"},"bankAccount":{"type":"object","required":["country","currency"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"routingNumber":{"type":"string"},"swiftBic":{"type":"string"},"iban":{"type":"string"},"sortCode":{"type":"string"},"accountType":{"type":"string"},"transitCode":{"type":"string"},"institutionNumber":{"type":"string"},"branchCode":{"type":"string"},"bankCode":{"type":"string"},"ifscCode":{"type":"string"},"accountHolderName":{"type":"string"},"cnapsCode":{"type":"string"},"bsbCode":{"type":"string"},"clabe":{"type":"string"},"bankAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"}}}},"description":"The fields the account's country needs (a refusal names the missing ones)"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or the fields do not suit the country (`FIAT_REQUEST_INVALID`, `FIAT_BANK_FIELDS_INVALID`, `FIAT_ACCOUNT_DATA_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or the fields do not suit the country (`FIAT_REQUEST_INVALID`, `FIAT_BANK_FIELDS_INVALID`, `FIAT_ACCOUNT_DATA_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet, or the bank account exists (`FIAT_HOLDER_NOT_LINKED`, `FIAT_ALREADY_EXISTS`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet, or the bank account exists (`FIAT_HOLDER_NOT_LINKED`, `FIAT_ALREADY_EXISTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts/{bankAccountId}":{"get":{"summary":"One bank account","tags":["fiat-bank-accounts"],"description":"With its latest verification.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"put":{"summary":"Replace a bank account's fields","tags":["fiat-bank-accounts"],"description":"All the fields again, checked as when it was added.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["bankAccount"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"bankAccount":{"type":"object","required":["country","currency"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"routingNumber":{"type":"string"},"swiftBic":{"type":"string"},"iban":{"type":"string"},"sortCode":{"type":"string"},"accountType":{"type":"string"},"transitCode":{"type":"string"},"institutionNumber":{"type":"string"},"branchCode":{"type":"string"},"bankCode":{"type":"string"},"ifscCode":{"type":"string"},"accountHolderName":{"type":"string"},"cnapsCode":{"type":"string"},"bsbCode":{"type":"string"},"clabe":{"type":"string"},"bankAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"}}}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or the fields do not suit the country (`FIAT_REQUEST_INVALID`, `FIAT_BANK_FIELDS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or the fields do not suit the country (`FIAT_REQUEST_INVALID`, `FIAT_BANK_FIELDS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank account cannot be changed now (`FIAT_BANK_ACCOUNT_NOT_UPDATABLE`)","content":{"application/json":{"schema":{"type":"object","description":"The bank account cannot be changed now (`FIAT_BANK_ACCOUNT_NOT_UPDATABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts/{bankAccountId}/verification":{"post":{"summary":"Verify a bank account by small deposits","tags":["fiat-bank-accounts"],"description":"Two small deposits are sent to the account; confirm their amounts with `…/verification/confirm`. 202 when the answer could not be matched.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts/{bankAccountId}/verification/refresh":{"post":{"summary":"Read a bank account's verification again","tags":["fiat-bank-accounts"],"description":"On the bank account's latest verification.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts/{bankAccountId}/verification/confirm":{"post":{"summary":"Confirm the two small deposits' amounts","tags":["fiat-bank-accounts"],"description":"The two amounts received, as decimal strings of the account's currency. A wrong pair counts as an attempt; too many lock the verification.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["amounts"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"amounts":{"type":"array","items":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"minItems":2,"maxItems":2,"description":"The two small deposits received, in the account's currency"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/bank-accounts/{bankAccountId}/verification/micro-debit":{"post":{"summary":"Ask for a small debit to finish the verification","tags":["fiat-bank-accounts"],"description":"On the bank account's latest verification.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"bankAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or no verification was started (`FIAT_REQUEST_INVALID`, `FIAT_BANK_VERIFICATION_NOT_STARTED`, `FIAT_AMOUNT_PRECISION`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such bank account of the tenant (`FIAT_BANK_ACCOUNT_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"The bank account is not active, the verification ended, or its attempts are used up (`FIAT_BANK_ACCOUNT_NOT_ACTIVE`, `FIAT_BANK_VERIFICATION_CLOSED`, `FIAT_VERIFICATION_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/funding-sources":{"get":{"summary":"A profile's funding sources","tags":["fiat-bank-accounts"],"description":"What can fund or receive its money (bank accounts, cards, balances, virtual accounts), read now, with its defaults. A top-up names one by `id` and `type`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","fundingSources"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"fundingSources":{"type":"array","items":{"type":"object","required":["id","type","active","country","currency","card","defaults"],"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]},"active":{"type":"boolean"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"card":{"type":["null","object"],"required":["type","lastFour"],"properties":{"type":{"type":["null","string"]},"lastFour":{"type":["null","string"]}}},"defaults":{"type":"object","required":["credit","debit","billing"],"properties":{"credit":{"type":"boolean"},"debit":{"type":"boolean"},"billing":{"type":"boolean"}}}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/funding-sources/defaults":{"put":{"summary":"Set a profile's default funding sources","tags":["fiat-bank-accounts"],"description":"`credit` (where its money arrives), `debit` (what pays), `billing` (what pays the fees): each an active funding source of the profile.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"},"credit":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}},"debit":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}},"billing":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","fundingSources"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"fundingSources":{"type":"array","items":{"type":"object","required":["id","type","active","country","currency","card","defaults"],"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]},"active":{"type":"boolean"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"card":{"type":["null","object"],"required":["type","lastFour"],"properties":{"type":{"type":["null","string"]},"lastFour":{"type":["null","string"]}}},"defaults":{"type":"object","required":["credit","debit","billing"],"properties":{"credit":{"type":"boolean"},"debit":{"type":"boolean"},"billing":{"type":"boolean"}}}}}}}}}}},"400":{"description":"The request is not valid, or a source is not an active one of the profile (`FIAT_REQUEST_INVALID`, `FIAT_FUNDING_DEFAULT_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or a source is not an active one of the profile (`FIAT_REQUEST_INVALID`, `FIAT_FUNDING_DEFAULT_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/beneficiaries":{"get":{"summary":"The tenant's beneficiaries","tags":["fiat-beneficiaries"],"description":"Newest first; `profileId` keeps one profile's, `status` some statuses (comma-separated).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","beneficiaries","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"beneficiaries":{"type":"array","items":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Add a beneficiary","tags":["fiat-beneficiaries"],"description":"A person or business a profile pays, with its bank account: its names are screened against the sanctions lists before it is kept (refused when they match). `replaces` names a beneficiary this one replaces. 202 when the answer could not be matched.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["beneficiary"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The profile it belongs to; without one, the tenant's own beneficiary"},"replaces":{"type":"string","format":"uuid","description":"A beneficiary this one replaces"},"beneficiary":{"type":"object","required":["type","email","firstName","lastName","country","phone"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["business","person","incomplete"]},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"phone":{"type":"object","required":["number"],"additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,15}$"}}},"businessName":{"type":"string"},"businessId":{"type":"string","pattern":"^[0-9]{1,18}$"},"businessAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"bankAccount":{"type":"object","required":["country","currency"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"routingNumber":{"type":"string"},"swiftBic":{"type":"string"},"iban":{"type":"string"},"sortCode":{"type":"string"},"accountType":{"type":"string"},"transitCode":{"type":"string"},"institutionNumber":{"type":"string"},"branchCode":{"type":"string"},"bankCode":{"type":"string"},"ifscCode":{"type":"string"},"accountHolderName":{"type":"string"},"cnapsCode":{"type":"string"},"bsbCode":{"type":"string"},"clabe":{"type":"string"},"bankAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"}}}}}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the beneficiary's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_BANK_FIELDS_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the beneficiary's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_BANK_FIELDS_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Refused by the screening: the tenant's compliance reviews it (`SCREENING_REVIEW_REQUIRED`); or as every route (`TENANT_REQUIRED`, `FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"Refused by the screening: the tenant's compliance reviews it (`SCREENING_REVIEW_REQUIRED`); or as every route (`TENANT_REQUIRED`, `FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Already there (`FIAT_ALREADY_EXISTS`)","content":{"application/json":{"schema":{"type":"object","description":"Already there (`FIAT_ALREADY_EXISTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/beneficiaries/batches":{"post":{"summary":"Add up to 100 beneficiaries at once","tags":["fiat-beneficiaries"],"description":"Each screened as one added alone; the batch is then created and followed (`…/batches/:batchId/refresh`).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["beneficiaries"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"},"beneficiaries":{"type":"array","items":{"type":"object","required":["type","email","firstName","lastName","country","phone"],"additionalProperties":false,"properties":{"type":{"type":"string","enum":["business","person","incomplete"]},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"phone":{"type":"object","required":["number"],"additionalProperties":false,"properties":{"countryCode":{"type":"string","pattern":"^\\+[0-9]{1,4}$"},"number":{"type":"string","pattern":"^[0-9]{1,15}$"}}},"businessName":{"type":"string"},"businessId":{"type":"string","pattern":"^[0-9]{1,18}$"},"businessAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"bankAccount":{"type":"object","required":["country","currency"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"routingNumber":{"type":"string"},"swiftBic":{"type":"string"},"iban":{"type":"string"},"sortCode":{"type":"string"},"accountType":{"type":"string"},"transitCode":{"type":"string"},"institutionNumber":{"type":"string"},"branchCode":{"type":"string"},"bankCode":{"type":"string"},"ifscCode":{"type":"string"},"accountHolderName":{"type":"string"},"cnapsCode":{"type":"string"},"bsbCode":{"type":"string"},"clabe":{"type":"string"},"bankAddress":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string"}}}}}}},"minItems":1,"maxItems":100}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","batchId","status","beneficiaries","refused"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"batchId":{"type":["null","string"]},"status":{"type":["null","string"]},"beneficiaries":{"type":"array","items":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"refused":{"type":"array","items":{"type":"integer"},"description":"The positions of the beneficiaries refused by the screening"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/beneficiaries/batches/{batchId}/refresh":{"post":{"summary":"Read a batch of beneficiaries again","tags":["fiat-beneficiaries"],"description":"Its status and each beneficiary's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","pattern":"^[0-9]{1,19}$"},"in":"path","name":"batchId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","batchId","status","beneficiaries","refused"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"batchId":{"type":["null","string"]},"status":{"type":["null","string"]},"beneficiaries":{"type":"array","items":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"refused":{"type":"array","items":{"type":"integer"},"description":"The positions of the beneficiaries refused by the screening"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/beneficiaries/{beneficiaryId}":{"get":{"summary":"One beneficiary","tags":["fiat-beneficiaries"],"description":"Its country, currency and the last four digits of its bank account; never its names.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"beneficiaryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/beneficiaries/{beneficiaryId}/refresh":{"post":{"summary":"Read a beneficiary again","tags":["fiat-beneficiaries"],"description":"Its state now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"beneficiaryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such beneficiary of the tenant (`FIAT_BENEFICIARY_NOT_FOUND`), or profile (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me":{"get":{"summary":"The caller's own fiat account profile","tags":["fiat-me"],"description":"404 `FIAT_HOLDER_NOT_FOUND` until the tenant opens one for the user.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","owner","userId","type","entityType","country","state","reasons","missing","paymentReady","virtualAccountsReady","ownersAttested","ownersSyncedAt","regulatoryDataAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"owner":{"type":"string","enum":["tenant","user"],"description":"`tenant`: the tenant's own account; `user`: one of its end users"},"userId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"entityType":{"type":["null","string"],"enum":["corporation","limited_company","non_profit","partnership","contractor","sole_proprietorship","personal_use","freelancer","side_project","other",null]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"state":{"type":"string","enum":["creating","failed","missing_information","unverified","under_review","verified","blocked"],"description":"`creating` (being opened), `failed` (could not be opened), `missing_information` (see `missing`), `unverified`, `under_review`, `verified` (money may move), `blocked`"},"reasons":{"type":"array","items":{"type":"string"},"description":"The review's reason codes"},"missing":{"type":"array","items":{"type":"string"},"description":"What the verification still needs, as codes"},"paymentReady":{"type":["null","boolean"]},"virtualAccountsReady":{"type":["null","boolean"]},"ownersAttested":{"type":["null","boolean"]},"ownersSyncedAt":{"type":["null","string"],"format":"date-time"},"regulatoryDataAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/bank-accounts":{"get":{"summary":"The caller's own bank accounts","tags":["fiat-me"],"description":"With their latest verification.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","bankAccounts","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"bankAccounts":{"type":"array","items":{"type":"object","required":["id","environment","profileId","country","currency","bankName","accountType","lastFour","status","canRemove","verification","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"bankName":{"type":["null","string"]},"accountType":{"type":["null","string"]},"lastFour":{"type":["null","string"]},"status":{"type":"string","enum":["linking","active","inactive","deleted","closed","unconfirmed","failed"]},"canRemove":{"type":["null","boolean"]},"verification":{"type":["null","object"],"required":["id","state","microDepositStatus","microDebitStatus","confirmationAttempts","debitAttempts","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["requesting","open","passed","locked","expired","unconfirmed","failed"]},"microDepositStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"microDebitStatus":{"type":["null","string"],"enum":["requested","sent","passed","failed","locked","expired",null]},"confirmationAttempts":{"type":"integer"},"debitAttempts":{"type":"integer"},"expiresAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"The latest micro-deposit verification, if any"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/funding-sources":{"get":{"summary":"The caller's own funding sources","tags":["fiat-me"],"description":"Read now, with their defaults.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["profileId","environment","fundingSources"],"properties":{"profileId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"fundingSources":{"type":"array","items":{"type":"object","required":["id","type","active","country","currency","card","defaults"],"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]},"active":{"type":"boolean"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"card":{"type":["null","object"],"required":["type","lastFour"],"properties":{"type":{"type":["null","string"]},"lastFour":{"type":["null","string"]}}},"defaults":{"type":"object","required":["credit","debit","billing"],"properties":{"credit":{"type":"boolean"},"debit":{"type":"boolean"},"billing":{"type":"boolean"}}}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/beneficiaries":{"get":{"summary":"The caller's own beneficiaries","tags":["fiat-me"],"description":"Newest first.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","beneficiaries","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"beneficiaries":{"type":"array","items":{"type":"object","required":["id","environment","profileId","type","country","bankCountry","currency","bankLastFour","screening","status","replacedBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"type":{"type":"string","enum":["business","person","incomplete"]},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"bankCountry":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"bankLastFour":{"type":["null","string"]},"screening":{"type":"string","enum":["passed","flagged","pending","bypassed"]},"status":{"type":"string","enum":["creating","active","refused","unconfirmed","failed","replaced"]},"replacedBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/corridors":{"get":{"summary":"The countries money can be sent to","tags":["fiat-fx"],"description":"Each country with the currencies it sends and receives among the tenant's, and what a payment to it needs: a purpose of payment (its codes), a description, an invoice.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","pattern":"^[A-Z]{2}$"},"in":"query","name":"country","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","fetchedAt","countries"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"fetchedAt":{"type":"string","format":"date-time"},"countries":{"type":"array","items":{"type":"object","required":["country","countryName","sendingCurrencies","receivingCurrencies","purposeOfPayment"],"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"countryName":{"type":["null","string"]},"sendingCurrencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"receivingCurrencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfPayment":{"type":"object","required":["required","descriptionRequired","invoiceRequired","purposes"],"properties":{"required":{"type":"boolean"},"descriptionRequired":{"type":"boolean"},"invoiceRequired":{"type":"boolean"},"purposes":{"type":"array","items":{"type":"object","required":["code","description"],"properties":{"code":{"type":"string"},"description":{"type":["null","string"]}}}}}}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/corridors":{"get":{"summary":"The countries money can be sent to","tags":["fiat-me"],"description":"Each country with the currencies it sends and receives among the tenant's, and what a payment to it needs: a purpose of payment (its codes), a description, an invoice.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","pattern":"^[A-Z]{2}$"},"in":"query","name":"country","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","fetchedAt","countries"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"fetchedAt":{"type":"string","format":"date-time"},"countries":{"type":"array","items":{"type":"object","required":["country","countryName","sendingCurrencies","receivingCurrencies","purposeOfPayment"],"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"countryName":{"type":["null","string"]},"sendingCurrencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"receivingCurrencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfPayment":{"type":"object","required":["required","descriptionRequired","invoiceRequired","purposes"],"properties":{"required":{"type":"boolean"},"descriptionRequired":{"type":"boolean"},"invoiceRequired":{"type":"boolean"},"purposes":{"type":"array","items":{"type":"object","required":["code","description"],"properties":{"code":{"type":"string"},"description":{"type":["null","string"]}}}}}}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/quotes":{"post":{"summary":"Ask for an FX quote","tags":["fiat-fx"],"description":"Exactly one side's `amount` (what is sent, or what arrives). A quote holds until `expiresAt` and is used once, by the conversion or the transfer that names it.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["kind","purpose","from","to"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The paying profile; without one, the caller's own (another profile's needs the tenant's permission)"},"kind":{"type":"string","enum":["standard","enhanced"],"description":"`standard`: by currencies and countries; `enhanced`: by the funding sources used"},"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"from":{"type":"object","required":["currency"],"additionalProperties":false,"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The exact amount on this side (one side only)"},"fundingSource":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}},"to":{"type":"object","required":["currency"],"additionalProperties":false,"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The exact amount on this side (one side only)"},"fundingSource":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}},"toProfileId":{"type":"string","format":"uuid","description":"An enhanced quote's receiving profile (default: the paying one)"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","purpose","side","from","to","rate","usdAmount","status","expiresAt","usedBy","supersededBy","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["standard","enhanced","bulk"]},"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"side":{"type":"string","enum":["send","receive"],"description":"`send`: `from.amount` is exact; `receive`: `to.amount` is"},"from":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"to":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"rate":{"type":["null","string"]},"usdAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"status":{"type":"string","enum":["open","used","superseded","expired"]},"expiresAt":{"type":"string","format":"date-time"},"usedBy":{"type":["null","string"]},"supersededBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_QUOTE_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_CORRIDOR_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_QUOTE_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_CORRIDOR_UNAVAILABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/quotes/batch":{"post":{"summary":"Ask for up to 50 standard quotes at once","tags":["fiat-fx"],"description":"Each kept as its own quote, in the order asked.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["quotes"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The paying profile; without one, the caller's own (another profile's needs the tenant's permission)"},"quotes":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["purpose","from","to"],"additionalProperties":false,"properties":{"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"from":{"type":"object","required":["currency"],"additionalProperties":false,"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The exact amount on this side (one side only)"},"fundingSource":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}},"to":{"type":"object","required":["currency"],"additionalProperties":false,"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"The exact amount on this side (one side only)"},"fundingSource":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}}}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","quotes"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"quotes":{"type":"array","items":{"type":"object","required":["id","environment","kind","purpose","side","from","to","rate","usdAmount","status","expiresAt","usedBy","supersededBy","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["standard","enhanced","bulk"]},"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"side":{"type":"string","enum":["send","receive"],"description":"`send`: `from.amount` is exact; `receive`: `to.amount` is"},"from":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"to":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"rate":{"type":["null","string"]},"usdAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"status":{"type":"string","enum":["open","used","superseded","expired"]},"expiresAt":{"type":"string","format":"date-time"},"usedBy":{"type":["null","string"]},"supersededBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_QUOTE_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_QUOTE_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/quotes/{quoteId}":{"get":{"summary":"One quote","tags":["fiat-fx"],"description":"With its state: `open`, `used`, `superseded` or `expired`.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","purpose","side","from","to","rate","usdAmount","status","expiresAt","usedBy","supersededBy","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["standard","enhanced","bulk"]},"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"side":{"type":"string","enum":["send","receive"],"description":"`send`: `from.amount` is exact; `receive`: `to.amount` is"},"from":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"to":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"rate":{"type":["null","string"]},"usdAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"status":{"type":"string","enum":["open","used","superseded","expired"]},"expiresAt":{"type":"string","format":"date-time"},"usedBy":{"type":["null","string"]},"supersededBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such quote (`FIAT_QUOTE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such quote (`FIAT_QUOTE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/quotes/{quoteId}":{"get":{"summary":"One quote (the caller's own)","tags":["fiat-me"],"description":"With its state: `open`, `used`, `superseded` or `expired`. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","purpose","side","from","to","rate","usdAmount","status","expiresAt","usedBy","supersededBy","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["standard","enhanced","bulk"]},"purpose":{"type":"string","enum":["conversion","transfer","top_up","withdrawal","reference"]},"side":{"type":"string","enum":["send","receive"],"description":"`send`: `from.amount` is exact; `receive`: `to.amount` is"},"from":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"to":{"type":"object","required":["currency","country","amount","fee","fundingSource"],"properties":{"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"fee":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}}}},"rate":{"type":["null","string"]},"usdAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"status":{"type":"string","enum":["open","used","superseded","expired"]},"expiresAt":{"type":"string","format":"date-time"},"usedBy":{"type":["null","string"]},"supersededBy":{"type":["null","string"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such quote (`FIAT_QUOTE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such quote (`FIAT_QUOTE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/balances":{"get":{"summary":"Multi-currency balances","tags":["fiat-balances"],"description":"One per profile and currency, as last read (`readAt`); `profileId` keeps one profile's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balances","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balances":{"type":"array","items":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Open a balance in a currency for a profile","tags":["fiat-balances"],"description":"One of the tenant's currencies; opening one that exists answers it (200).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId","currency"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or the currency is not offered (`FIAT_REQUEST_INVALID`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_WALLET_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or the currency is not offered (`FIAT_REQUEST_INVALID`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_WALLET_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/balances":{"get":{"summary":"Multi-currency balances (the caller's own)","tags":["fiat-me"],"description":"One per profile and currency, as last read (`readAt`); `profileId` keeps one profile's. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balances","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balances":{"type":"array","items":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/balances/refresh":{"post":{"summary":"Read a profile's balances again now","tags":["fiat-balances"],"description":"Every balance of the profile, as its account holds them now.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balances","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balances":{"type":"array","items":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/balances/{balanceId}":{"get":{"summary":"One balance","tags":["fiat-balances"],"description":"`refresh=true` reads it again now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"boolean","default":false},"in":"query","name":"refresh","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"balanceId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/balances/{balanceId}":{"get":{"summary":"One balance (the caller's own)","tags":["fiat-me"],"description":"`refresh=true` reads it again now. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"boolean","default":false},"in":"query","name":"refresh","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"balanceId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","currency","status","available","pending","total","readAt","movementsSyncedTo","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":["null","string"]},"available":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"pending":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"total":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"readAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"],"description":"The last day read (YYYY-MM-DD)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/balances/{balanceId}/movements":{"get":{"summary":"A balance's movements","tags":["fiat-balances"],"description":"Newest first, as last read (the Hub reads them every few minutes).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"balanceId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balanceId","movementsSyncedTo","movements","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balanceId":{"type":"string","format":"uuid"},"movementsSyncedTo":{"type":["null","string"]},"movements":{"type":"array","items":{"type":"object","required":["id","balanceId","kind","direction","amount","currency","balance","balanceCurrency","operationId","recordedAt"],"properties":{"id":{"type":"string","format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"kind":{"type":["null","string"]},"direction":{"type":"string","enum":["credit","debit","unknown"]},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"balance":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"balanceCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"operationId":{"type":["null","string"],"format":"uuid"},"recordedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/balances/{balanceId}/movements":{"get":{"summary":"A balance's movements (the caller's own)","tags":["fiat-me"],"description":"Newest first, as last read (the Hub reads them every few minutes). The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"balanceId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balanceId","movementsSyncedTo","movements","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balanceId":{"type":"string","format":"uuid"},"movementsSyncedTo":{"type":["null","string"]},"movements":{"type":"array","items":{"type":"object","required":["id","balanceId","kind","direction","amount","currency","balance","balanceCurrency","operationId","recordedAt"],"properties":{"id":{"type":"string","format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"kind":{"type":["null","string"]},"direction":{"type":"string","enum":["credit","debit","unknown"]},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"balance":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"balanceCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"operationId":{"type":["null","string"],"format":"uuid"},"recordedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/balances/{balanceId}/movements/refresh":{"post":{"summary":"Read a balance's movements now","tags":["fiat-balances"],"description":"What the account says since the last read (each new one is sent as `fiat.balance.movement`).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"balanceId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","balanceId","added"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"balanceId":{"type":"string","format":"uuid"},"added":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such balance or profile (`FIAT_WALLET_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/top-ups":{"post":{"summary":"Top up a balance from the profile's own bank or card","tags":["fiat-balances"],"description":"From one of the profile's funding sources (`/v1/fiat/funding-sources`) into its balance, in the balance's currency. A money route: it takes an `Idempotency-Key`, records an operation (`/v1/operations`) named by the answer's `id`, and goes through Aurea's controls first — the tenant's and the user's freezes, the signing policy (an approval holds it: 202 with the approval request), the screening of the counterparty, the Travel Rule data, the tenant's limits per operation and per day, the tenant's callback — before anything is sent. The answer's `status` then moves with the account's news (`fiat.*` and `operation.*` tenant events).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reference","balanceId","amount","fundingSource"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The profile whose money it is; without one, the caller's own (another profile's needs the tenant's permission)"},"reference":{"type":"string","pattern":"^[\\x21-\\x7e]{1,200}$","description":"The caller's own reference: the same reference with the same request is the same operation, with another request 409 `FIAT_REFERENCE_REUSED`"},"balanceId":{"type":"string","format":"uuid"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"The balance's currency (default)"},"fundingSource":{"type":"object","required":["id","type"],"additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{1,19}$"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account"]}}}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","content":{"application/json":{"schema":{"type":"object","description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The top ups","tags":["fiat-balances"],"description":"Newest first; `profileId`, `balanceId` and `status` filter.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/withdrawals":{"post":{"summary":"Withdraw from a balance to the profile's own bank","tags":["fiat-balances"],"description":"To the profile's default bank account for money arriving (`/v1/fiat/funding-sources/defaults`, `credit`), in the balance's currency. A money route: it takes an `Idempotency-Key`, records an operation (`/v1/operations`) named by the answer's `id`, and goes through Aurea's controls first — the tenant's and the user's freezes, the signing policy (an approval holds it: 202 with the approval request), the screening of the counterparty, the Travel Rule data, the tenant's limits per operation and per day, the tenant's callback — before anything is sent. The answer's `status` then moves with the account's news (`fiat.*` and `operation.*` tenant events).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reference","balanceId","amount"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The profile whose money it is; without one, the caller's own (another profile's needs the tenant's permission)"},"reference":{"type":"string","pattern":"^[\\x21-\\x7e]{1,200}$","description":"The caller's own reference: the same reference with the same request is the same operation, with another request 409 `FIAT_REFERENCE_REUSED`"},"balanceId":{"type":"string","format":"uuid"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","content":{"application/json":{"schema":{"type":"object","description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The withdrawals","tags":["fiat-balances"],"description":"Newest first; `profileId`, `balanceId` and `status` filter.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/conversions":{"post":{"summary":"Convert between two of the profile's balances","tags":["fiat-balances"],"description":"On a quote asked for with purpose `conversion` between the two balances' currencies. A money route: it takes an `Idempotency-Key`, records an operation (`/v1/operations`) named by the answer's `id`, and goes through Aurea's controls first — the tenant's and the user's freezes, the signing policy (an approval holds it: 202 with the approval request), the screening of the counterparty, the Travel Rule data, the tenant's limits per operation and per day, the tenant's callback — before anything is sent. The answer's `status` then moves with the account's news (`fiat.*` and `operation.*` tenant events).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reference","fromBalanceId","toBalanceId","quoteId"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The profile whose money it is; without one, the caller's own (another profile's needs the tenant's permission)"},"reference":{"type":"string","pattern":"^[\\x21-\\x7e]{1,200}$","description":"The caller's own reference: the same reference with the same request is the same operation, with another request 409 `FIAT_REFERENCE_REUSED`"},"fromBalanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":"string","format":"uuid"},"quoteId":{"type":"string","format":"uuid","description":"A quote asked for with purpose `conversion`; past its expiry a new one is taken only when it is no worse (409 `FIAT_QUOTE_CHANGED` otherwise)"}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), or the policy refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile, balance or quote (`FIAT_HOLDER_NOT_FOUND`, `FIAT_WALLET_NOT_FOUND`, `FIAT_QUOTE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","content":{"application/json":{"schema":{"type":"object","description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"The conversions","tags":["fiat-balances"],"description":"Newest first; `profileId`, `balanceId` and `status` filter.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/top-ups":{"get":{"summary":"The top ups (the caller's own)","tags":["fiat-me"],"description":"Newest first; `profileId`, `balanceId` and `status` filter. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/top-ups/{operationId}":{"get":{"summary":"One of the top ups","tags":["fiat-balances"],"description":"Its status moves with the account's news.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/top-ups/{operationId}":{"get":{"summary":"One of the top ups (the caller's own)","tags":["fiat-me"],"description":"Its status moves with the account's news. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/withdrawals":{"get":{"summary":"The withdrawals (the caller's own)","tags":["fiat-me"],"description":"Newest first; `profileId`, `balanceId` and `status` filter. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/withdrawals/{operationId}":{"get":{"summary":"One of the withdrawals","tags":["fiat-balances"],"description":"Its status moves with the account's news.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/withdrawals/{operationId}":{"get":{"summary":"One of the withdrawals (the caller's own)","tags":["fiat-me"],"description":"Its status moves with the account's news. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/conversions":{"get":{"summary":"The conversions (the caller's own)","tags":["fiat-me"],"description":"Newest first; `profileId`, `balanceId` and `status` filter. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"balanceId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","operations","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"operations":{"type":"array","items":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/conversions/{operationId}":{"get":{"summary":"One of the conversions","tags":["fiat-balances"],"description":"Its status moves with the account's news.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/conversions/{operationId}":{"get":{"summary":"One of the conversions (the caller's own)","tags":["fiat-me"],"description":"Its status moves with the account's news. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","kind","status","failureCode","reference","profileId","balanceId","toBalanceId","currency","amount","side","toCurrency","toAmount","quoteId","fundingSource","executed","createdAt","submittedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The record's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["top_up","withdrawal","conversion"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","needs_review"],"description":"`awaiting_provider_approval`: Aurea's own controls passed and the account's approval is being given; `needs_review`: Aurea's operators settle it"},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":["null","string"],"format":"uuid"},"balanceId":{"type":"string","format":"uuid"},"toBalanceId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"side":{"type":"string","enum":["send","receive"]},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"quoteId":{"type":["null","string"],"format":"uuid"},"fundingSource":{"type":["null","object"],"required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["bank_account","card","balance","virtual_card","virtual_account","other"]}}},"executed":{"type":"object","required":["amount","currency","toAmount","toCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"toAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"toCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such operation (`FIAT_OPERATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts":{"get":{"summary":"Virtual bank accounts","tags":["fiat-virtual-accounts"],"description":"One per profile and currency once its application is accepted; `profileId` keeps one profile's.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","virtualAccounts","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"virtualAccounts":{"type":"array","items":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts":{"get":{"summary":"Virtual bank accounts (the caller's own)","tags":["fiat-me"],"description":"One per profile and currency once its application is accepted; `profileId` keeps one profile's. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","virtualAccounts","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"virtualAccounts":{"type":"array","items":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/applications":{"get":{"summary":"Virtual bank account applications","tags":["fiat-virtual-accounts"],"description":"Newest first; `profileId` keeps one profile's latest, `status` filters.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","applications","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"applications":{"type":"array","items":{"type":"object","required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"post":{"summary":"Apply for virtual bank accounts for a profile","tags":["fiat-virtual-accounts"],"description":"For a verified profile: the currencies wanted, the account's name, the terms accepted and what the profile declares (as a business or an individual). The accounts appear once the application is accepted; every change is sent as `fiat.virtual_account.updated`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId","application"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"},"application":{"type":"object","required":["currencies","name","acceptTerms"],"additionalProperties":false,"properties":{"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"},"minItems":1},"name":{"type":"string","description":"The account's name: letters and spaces only"},"acceptTerms":{"type":"boolean","enum":[true]},"business":{"type":"object","additionalProperties":false,"properties":{"sendingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"receivingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"purposeOfAccount":{"type":"string","enum":["vendor_supplier_payments","payroll_salary_disbursements","employee_reimbursements","tax_regulatory_payments","collections_from_customers","refunds_chargebacks","escrow_marketplace_settlements","internal_fund_transfers","holding_pooling_customer_funds","liquidity_management","import_export_settlements","international_customer_collections","overseas_supplier_payments","other"]},"monthlyExpectedActivity":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"annualRevenue":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"registrationNumber":{"type":"string"},"incorporationDate":{"type":"string","format":"date"},"sourceOfFunds":{"type":"string","enum":["revenue_from_business_operations","merchant_sales_transactions","investment_capital","loans_credit_lines","grants_government_subsidies","sale_of_business_assets","shareholder_contributions","franchise_licensing_fees","subscription_membership_fees"]},"website":{"type":"string","format":"uri"}}},"individual":{"type":"object","additionalProperties":false,"properties":{"sendingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"receivingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"purposeOfAccount":{"type":"string","enum":["vendor_supplier_payments","payroll_salary_disbursements","employee_reimbursements","tax_regulatory_payments","collections_from_customers","refunds_chargebacks","escrow_marketplace_settlements","internal_fund_transfers","holding_pooling_customer_funds","liquidity_management","import_export_settlements","international_customer_collections","overseas_supplier_payments","other"]},"monthlyExpectedActivity":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"annualIncome":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"occupation":{"type":"string"},"sourceOfFunds":{"type":"string","enum":["salary_wages","freelance_consulting_income","peer_to_peer_transfers","investments_crypto_earnings","real_estate_sales_rentals","inheritance","gifts_donations","royalties_licensing","pension_retirement_funds"]},"socialMediaLink":{"type":"string"}}}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts/applications":{"get":{"summary":"Virtual bank account applications (the caller's own)","tags":["fiat-me"],"description":"Newest first; `profileId` keeps one profile's latest, `status` filters. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","applications","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"applications":{"type":"array","items":{"type":"object","required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/applications/{applicationId}":{"patch":{"summary":"Change what an application declares","tags":["fiat-virtual-accounts"],"description":"`business` or `individual`, as applied.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"business":{"type":"object","additionalProperties":false,"properties":{"sendingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"receivingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"purposeOfAccount":{"type":"string","enum":["vendor_supplier_payments","payroll_salary_disbursements","employee_reimbursements","tax_regulatory_payments","collections_from_customers","refunds_chargebacks","escrow_marketplace_settlements","internal_fund_transfers","holding_pooling_customer_funds","liquidity_management","import_export_settlements","international_customer_collections","overseas_supplier_payments","other"]},"monthlyExpectedActivity":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"annualRevenue":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"registrationNumber":{"type":"string"},"incorporationDate":{"type":"string","format":"date"},"sourceOfFunds":{"type":"string","enum":["revenue_from_business_operations","merchant_sales_transactions","investment_capital","loans_credit_lines","grants_government_subsidies","sale_of_business_assets","shareholder_contributions","franchise_licensing_fees","subscription_membership_fees"]},"website":{"type":"string","format":"uri"}}},"individual":{"type":"object","additionalProperties":false,"properties":{"sendingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"receivingCountries":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"},"minItems":1},"purposeOfAccount":{"type":"string","enum":["vendor_supplier_payments","payroll_salary_disbursements","employee_reimbursements","tax_regulatory_payments","collections_from_customers","refunds_chargebacks","escrow_marketplace_settlements","internal_fund_transfers","holding_pooling_customer_funds","liquidity_management","import_export_settlements","international_customer_collections","overseas_supplier_payments","other"]},"monthlyExpectedActivity":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"annualIncome":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string, at most the currency's decimals (ISO 4217); more are refused, never rounded"},"occupation":{"type":"string"},"sourceOfFunds":{"type":"string","enum":["salary_wages","freelance_consulting_income","peer_to_peer_transfers","investments_crypto_earnings","real_estate_sales_rentals","inheritance","gifts_donations","royalties_licensing","pension_retirement_funds"]},"socialMediaLink":{"type":"string"}}}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"applicationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/applications/{applicationId}/currencies":{"post":{"summary":"Add currencies to an application","tags":["fiat-virtual-accounts"],"description":"More virtual accounts for the profile, in these currencies.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["currencies"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"},"minItems":1}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"applicationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid, or breaks the application's rules (`FIAT_REQUEST_INVALID`, `FIAT_PROFILE_INVALID`, `FIAT_VIRTUAL_ACCOUNT_FORM`, `FIAT_VIRTUAL_ACCOUNT_CURRENCY`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); or the profile is not verified or not eligible yet (`FIAT_VERIFICATION_REQUIRED`, `FIAT_VIRTUAL_ACCOUNT_NOT_ELIGIBLE`, `FIAT_VIRTUAL_ACCOUNT_REQUIREMENTS`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"An application exists already, or its state does not allow it (`FIAT_VIRTUAL_ACCOUNT_EXISTS`, `FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/refresh":{"post":{"summary":"Read a profile's virtual accounts again now","tags":["fiat-virtual-accounts"],"description":"Its application and accounts as they are now.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["profileId"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","application","virtualAccounts"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"application":{"type":["null","object"],"required":["id","environment","profileId","form","currencies","purposeOfAccount","sourceOfFunds","termsAcceptedAt","status","missing","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":"string","format":"uuid"},"form":{"type":"string","enum":["business","individual"]},"currencies":{"type":"array","items":{"type":"string","pattern":"^[A-Z]{3}$"}},"purposeOfAccount":{"type":"string"},"sourceOfFunds":{"type":"string"},"termsAcceptedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["preparing","submitted","in_review","active","partially_active","rejected","deactivated","failed","needs_review"]},"missing":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"virtualAccounts":{"type":"array","items":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","content":{"application/json":{"schema":{"type":"object","description":"The profile has no account yet (`FIAT_HOLDER_NOT_LINKED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/{virtualAccountId}":{"get":{"summary":"One virtual bank account","tags":["fiat-virtual-accounts"],"description":"With its balance as last read.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts/{virtualAccountId}":{"get":{"summary":"One virtual bank account (the caller's own)","tags":["fiat-me"],"description":"With its balance as last read. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/{virtualAccountId}/balance":{"get":{"summary":"A virtual bank account's balance, read now","tags":["fiat-virtual-accounts"],"description":"The account with its balance as it is now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts/{virtualAccountId}/balance":{"get":{"summary":"A virtual bank account's balance, read now (the caller's own)","tags":["fiat-me"],"description":"The account with its balance as it is now. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","profileId","applicationId","currency","status","balance","balanceReadAt","movementsSyncedTo","deactivatedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"profileId":{"type":["null","string"],"format":"uuid"},"applicationId":{"type":["null","string"],"format":"uuid"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"status":{"type":"string","enum":["active","pending","inactive","deactivated","unknown"]},"balance":{"type":["null","object"],"required":["amount","currency"],"properties":{"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}}},"balanceReadAt":{"type":["null","string"],"format":"date-time"},"movementsSyncedTo":{"type":["null","string"]},"deactivatedAt":{"type":["null","string"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/{virtualAccountId}/details":{"get":{"summary":"How to pay into a virtual bank account","tags":["fiat-virtual-accounts"],"description":"The bank details a payer uses, per rail, read now and never kept. Once the account is active (409 `FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE` before).","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["virtualAccountId","environment","currency","country","instructions"],"properties":{"virtualAccountId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"instructions":{"type":"array","description":"How a payer funds the account, one entry per rail","items":{"type":"object","required":["holderName","accountNumber","accountNumberType","routingCode","routingCodeType","bankName","bankAddress","bankCountry","currency","rail"],"properties":{"holderName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"accountNumberType":{"type":["null","string"]},"routingCode":{"type":["null","string"]},"routingCodeType":{"type":["null","string"]},"bankName":{"type":["null","string"]},"bankAddress":{"type":["null","string"]},"bankCountry":{"type":["null","string"]},"currency":{"type":["null","string"]},"rail":{"type":["null","string"]}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not active yet (`FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE`)","content":{"application/json":{"schema":{"type":"object","description":"Not active yet (`FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts/{virtualAccountId}/details":{"get":{"summary":"How to pay into a virtual bank account (the caller's own)","tags":["fiat-me"],"description":"The bank details a payer uses, per rail, read now and never kept. Once the account is active (409 `FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE` before). The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["virtualAccountId","environment","currency","country","instructions"],"properties":{"virtualAccountId":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"country":{"type":["null","string"],"pattern":"^[A-Z]{2}$"},"instructions":{"type":"array","description":"How a payer funds the account, one entry per rail","items":{"type":"object","required":["holderName","accountNumber","accountNumberType","routingCode","routingCodeType","bankName","bankAddress","bankCountry","currency","rail"],"properties":{"holderName":{"type":["null","string"]},"accountNumber":{"type":["null","string"]},"accountNumberType":{"type":["null","string"]},"routingCode":{"type":["null","string"]},"routingCodeType":{"type":["null","string"]},"bankName":{"type":["null","string"]},"bankAddress":{"type":["null","string"]},"bankCountry":{"type":["null","string"]},"currency":{"type":["null","string"]},"rail":{"type":["null","string"]}}}}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"Not active yet (`FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE`)","content":{"application/json":{"schema":{"type":"object","description":"Not active yet (`FIAT_VIRTUAL_ACCOUNT_NOT_ACTIVE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/{virtualAccountId}/movements":{"get":{"summary":"A virtual bank account's movements","tags":["fiat-virtual-accounts"],"description":"Newest first: what was paid in (each credit is sent as `fiat.balance.movement`) and paid out.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","movements","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"movements":{"type":"array","items":{"type":"object","required":["id","virtualAccountId","direction","amount","currency","balance","rail","recordedAt","completedAt","transferId"],"properties":{"id":{"type":"string","format":"uuid"},"virtualAccountId":{"type":["null","string"],"format":"uuid"},"direction":{"type":"string","enum":["credit","debit","unknown"]},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"balance":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"rail":{"type":["null","string"]},"recordedAt":{"type":"string","format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"transferId":{"type":["null","string"],"format":"uuid"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/virtual-accounts/{virtualAccountId}/movements":{"get":{"summary":"A virtual bank account's movements (the caller's own)","tags":["fiat-me"],"description":"Newest first: what was paid in (each credit is sent as `fiat.balance.movement`) and paid out. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","movements","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"movements":{"type":"array","items":{"type":"object","required":["id","virtualAccountId","direction","amount","currency","balance","rail","recordedAt","completedAt","transferId"],"properties":{"id":{"type":"string","format":"uuid"},"virtualAccountId":{"type":["null","string"],"format":"uuid"},"direction":{"type":"string","enum":["credit","debit","unknown"]},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"balance":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"rail":{"type":["null","string"]},"recordedAt":{"type":"string","format":"date-time"},"completedAt":{"type":["null","string"],"format":"date-time"},"transferId":{"type":["null","string"],"format":"uuid"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/virtual-accounts/{virtualAccountId}/movements/refresh":{"post":{"summary":"Read a virtual bank account's movements now","tags":["fiat-virtual-accounts"],"description":"What arrived or left since the last read.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"virtualAccountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","virtualAccountId","read","applied"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"virtualAccountId":{"type":"string","format":"uuid"},"read":{"type":"integer"},"applied":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such virtual account, application or profile (`FIAT_VIRTUAL_ACCOUNT_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/transfers":{"post":{"summary":"Send money to a beneficiary","tags":["fiat-transfers"],"description":"From one of the profile's balances, virtual accounts or bank accounts to one of its beneficiaries; across currencies on a quote (purpose `transfer`). The corridor's rules apply (`/v1/fiat/corridors`): its purpose of payment, and an invoice attached (`/v1/fiat/attachments`) where it asks for one. Every change is sent as `fiat.transfer.updated`. A money route: it takes an `Idempotency-Key`, records an operation (`/v1/operations`) named by the answer's `id`, and goes through Aurea's controls first — the tenant's and the user's freezes, the signing policy (an approval holds it: 202 with the approval request), the screening of the counterparty, the Travel Rule data, the tenant's limits per operation and per day, the tenant's callback — before anything is sent. The answer's `status` then moves with the account's news (`fiat.*` and `operation.*` tenant events).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reference","beneficiaryId","source","amount","currency","purposeOfPayment","purposeOfPaymentDescription","payee"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false,"description":"The sandbox when true; production otherwise"},"profileId":{"type":"string","format":"uuid","description":"The profile whose money it is; without one, the caller's own (another profile's needs the tenant's permission)"},"reference":{"type":"string","pattern":"^[\\x21-\\x7e]{1,200}$","description":"The caller's own reference: the same reference with the same request is the same operation, with another request 409 `FIAT_REFERENCE_REUSED`"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account"]},"id":{"type":"string","format":"uuid","description":"The balance's, virtual account's or bank account's id"}}},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"What leaves, in the source's currency"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"quoteId":{"type":"string","format":"uuid","description":"A cross-currency transfer's quote (purpose `transfer`)"},"purposeOfPayment":{"type":"string","description":"One of the corridor's purposes (`/v1/fiat/corridors`)"},"purposeOfPaymentDescription":{"type":"string"},"notes":{"type":"string"},"invoiceReference":{"type":"string"},"payee":{"type":"object","required":["business"],"additionalProperties":false,"properties":{"business":{"type":"object","required":["entityType","taxId","address"],"additionalProperties":false,"properties":{"entityType":{"type":"string"},"taxId":{"type":"string"},"address":{"type":"object","required":["country","line1","city","postalCode","region"],"additionalProperties":false,"properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"region":{"type":"string","description":"The state, province or region"}}},"website":{"type":"string","format":"uri"}}},"industry":{"type":"string","enum":["Agriculture","Business Services","Construction","Consumer Services","Education","Energy, Utilities, Waste & Minerals","Finance, Insurance","Government, Organizations","Holding Companies & Conglomerates","Hospitality, Recreation & Tourism","Hospitals, Clinics & Healthcare Services","Law Firms & Legal Services","Manufacturing","Media, Arts & Entertainment","Real Estate","Retail Trade","Software, IT and Telecommunications","Transportation, Warehousing, Wholesale"]},"subIndustry":{"type":"string"}}},"attachments":{"type":"array","maxItems":10,"items":{"type":"object","required":["name","referenceId","type"],"additionalProperties":false,"properties":{"name":{"type":"string"},"referenceId":{"type":"string","description":"From POST /v1/fiat/attachments"},"type":{"type":"string","enum":["invoice","proof_of_payment"]}}}}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`), or the corridor's rules (`FIAT_PURPOSE_INVALID`, `FIAT_ATTACHMENT_REQUIRED`, `FIAT_CORRIDOR_UNAVAILABLE`, `FIAT_TRANSFER_CURRENCY`, `FIAT_QUOTE_REQUIRED`)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, `FIAT_AMOUNT_PRECISION`, `FIAT_CURRENCY_NOT_OFFERED`, `FIAT_QUOTE_MISMATCH`, `FIAT_INVALID_REQUEST`, `FIAT_AMOUNT_INVALID`, `IDEMPOTENCY_KEY_INVALID`), or the corridor's rules (`FIAT_PURPOSE_INVALID`, `FIAT_ATTACHMENT_REQUIRED`, `FIAT_CORRIDOR_UNAVAILABLE`, `FIAT_TRANSFER_CURRENCY`, `FIAT_QUOTE_REQUIRED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), the beneficiary's screening, or the policy refused it","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`); The profile is not verified (`FIAT_VERIFICATION_REQUIRED`), or the tenant or the user is frozen (`FIAT_VERIFICATION_REQUIRED`), the beneficiary's screening, or the policy refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`; or the beneficiary or the source is not ready (`FIAT_BENEFICIARY_NOT_READY`, `FIAT_SOURCE_NOT_ACTIVE`)","content":{"application/json":{"schema":{"type":"object","description":"The reference came with another request (`FIAT_REFERENCE_REUSED`), the quote was used or changed (`FIAT_QUOTE_USED`, `FIAT_QUOTE_CHANGED`), the balance is too low (`FIAT_BALANCE_INSUFFICIENT`), or `IDEMPOTENCY_KEY_REUSED`, `IDEMPOTENCY_IN_PROGRESS`, `IDEMPOTENCY_OUTCOME_UNKNOWN`; or the beneficiary or the source is not ready (`FIAT_BENEFICIARY_NOT_READY`, `FIAT_SOURCE_NOT_ACTIVE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","content":{"application/json":{"schema":{"type":"object","description":"Above the tenant's limit per operation or per day for this function and currency (`FIAT_LIMIT_EXCEEDED`, `FIAT_AMOUNT_ABOVE_LIMIT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or the user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or the user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"Transfers to beneficiaries","tags":["fiat-transfers"],"description":"Newest first; `profileId`, `beneficiaryId` and `status` filter.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"profileId","required":false,"description":"Only this profile's"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"beneficiaryId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","transfers","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"transfers":{"type":"array","items":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/transfers":{"get":{"summary":"Transfers to beneficiaries (the caller's own)","tags":["fiat-me"],"description":"Newest first; `profileId`, `beneficiaryId` and `status` filter. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"beneficiaryId","required":false},{"schema":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","transfers","limit","offset"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"transfers":{"type":"array","items":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/transfers/{transferId}":{"get":{"summary":"One transfer","tags":["fiat-transfers"],"description":"`refresh=true` reads it again now.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"boolean","default":false},"in":"query","name":"refresh","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"transferId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/me/transfers/{transferId}":{"get":{"summary":"One transfer (the caller's own)","tags":["fiat-me"],"description":"`refresh=true` reads it again now. The signed-in end user's own only.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"boolean","default":false},"in":"query","name":"refresh","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"transferId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/transfers/{transferId}/cancel":{"post":{"summary":"Cancel a transfer","tags":["fiat-transfers"],"description":"While the account still allows it (`cancelable`); the caller's own profile's, or another one's with the tenant's permission.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"The sandbox when true; production when false or omitted"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"transferId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","status","failureCode","reference","profileId","beneficiaryId","source","amount","currency","beneficiaryCurrency","beneficiaryCountry","quoteId","purposeOfPayment","attachments","cancelable","executed","createdAt","submittedAt","finishedAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The transfer's id: also the reference of its operation (`/v1/operations`)"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["prepared","submitted","awaiting_provider_approval","processing","completed","failed","cancelled","reversed","needs_review"]},"failureCode":{"type":["null","string"]},"reference":{"type":"string"},"profileId":{"type":"string","format":"uuid"},"beneficiaryId":{"type":"string","format":"uuid"},"source":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["balance","virtual_account","bank_account","other"]},"id":{"type":"string","format":"uuid"}}},"amount":{"type":"string","pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCurrency":{"type":"string","pattern":"^[A-Z]{3}$"},"beneficiaryCountry":{"type":"string","pattern":"^[A-Z]{2}$"},"quoteId":{"type":["null","string"],"format":"uuid"},"purposeOfPayment":{"type":["null","string"]},"attachments":{"type":"array","items":{"type":"string"}},"cancelable":{"type":["null","boolean"]},"executed":{"type":"object","required":["amount","currency","beneficiaryAmount","beneficiaryCurrency","rate","approvedAt"],"properties":{"amount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"currency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"beneficiaryAmount":{"type":["null","string"],"pattern":"^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$","description":"A decimal string with the currency's decimals"},"beneficiaryCurrency":{"type":["null","string"],"pattern":"^[A-Z]{3}$"},"rate":{"type":["null","string"]},"approvedAt":{"type":["null","string"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":["null","string"],"format":"date-time"},"finishedAt":{"type":["null","string"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","content":{"application/json":{"schema":{"type":"object","description":"The request is not valid (`FIAT_REQUEST_INVALID`, naming the fields)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such transfer, profile, beneficiary or source (`FIAT_TRANSFER_NOT_FOUND`, `FIAT_HOLDER_NOT_FOUND`, `FIAT_BENEFICIARY_NOT_FOUND`, `FIAT_SOURCE_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"It can no longer be cancelled (`FIAT_TRANSFER_NOT_CANCELABLE`)","content":{"application/json":{"schema":{"type":"object","description":"It can no longer be cancelled (`FIAT_TRANSFER_NOT_CANCELABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/fiat/attachments":{"post":{"summary":"Upload a transfer's document","tags":["fiat-transfers"],"description":"multipart/form-data: the fields `type` (invoice or proof_of_payment), `profileId` (another profile's, with the tenant's permission) and `isTestnet`, then the `file` (PDF or image, at most 10 MB). Only its reference and SHA-256 are kept; name it in the transfer's `attachments`.","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["name","referenceId","sha256","type"],"properties":{"name":{"type":"string"},"referenceId":{"type":"string"},"sha256":{"type":"string"},"type":{"type":"string","enum":["invoice","proof_of_payment"]}}}}}},"400":{"description":"Not a document a transfer takes (`FIAT_ATTACHMENT_INVALID`, `FIAT_REQUEST_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"Not a document a transfer takes (`FIAT_ATTACHMENT_INVALID`, `FIAT_REQUEST_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","content":{"application/json":{"schema":{"type":"object","description":"No tenant (`TENANT_REQUIRED`), or fiat accounts or this function are not switched on for the tenant in this environment (`FIAT_OFF`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such profile of the tenant, or not the caller's own (`FIAT_HOLDER_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"413":{"description":"The document is too large","content":{"application/json":{"schema":{"type":"object","description":"The document is too large","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","content":{"application/json":{"schema":{"type":"object","description":"The fiat accounts service answered unusably (`FIAT_UPSTREAM_ERROR`, `FIAT_UNEXPECTED_RESPONSE`, `FIAT_AUTHENTICATION_FAILED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"Fiat accounts are not available on this platform or environment now (`FIAT_NOT_CONFIGURED`, `FIAT_UNAVAILABLE`, `FIAT_UNREACHABLE`, `FIAT_TIMEOUT`, `FIAT_RATE_LIMITED`, `FIAT_ACCESS_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/admin/tenants/{id}/webhooks":{"get":{"summary":"A tenant's webhooks","tags":["admin","webhooks"],"description":"The tenant's webhook of each environment that has one, without its secret, and the event types there are: the bank ramp's four and the card onramp's session updates. An Aurea administrator, or the tenant's own administrator.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed"]},"description":"The types it receives; empty receives the ramp.* and earn.* types"},"status":{"type":"string","enum":["active","disabled"]},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed"]}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhooks/{environment}":{"put":{"summary":"Save a tenant's webhook of one environment","tags":["admin","webhooks"],"description":"Makes the webhook (201, with its secret shown once) or changes it (200, without the secret, which stays). `url` must be https on the default port and name a public DNS host; `eventTypes` lists the types it receives (empty: the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later only when named); `status` defaults to active when the webhook is made and is kept when a change does not name it. A refused value answers 400 with `details.code` NOAH_WEBHOOK_INVALID, `details.field` and, for the address, `details.reason`. Each delivery is a POST with the JSON body `{ id, type, environment, occurredAt, createdAt, data }` and the headers `x-webhook-id`, `x-webhook-timestamp`, `x-webhook-event` and `x-webhook-signature: v1=<base64 HMAC-SHA256>` of `<id>.<timestamp>.<body>`, keyed with the bytes of the base64 after `whsec_`. Answer 2xx within 10 seconds; anything else is retried for up to 10 attempts. No order is promised between deliveries.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["url","eventTypes"],"additionalProperties":false,"properties":{"url":{"type":"string","minLength":1,"maxLength":2048},"eventTypes":{"type":"array","maxItems":12,"items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"The environment whose events the webhook receives"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed"]},"description":"The types it receives; empty receives the ramp.* and earn.* types"},"status":{"type":"string","enum":["active","disabled"]},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed"]},"description":"The types it receives; empty receives the ramp.* and earn.* types"},"status":{"type":"string","enum":["active","disabled"]},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"secret":{"type":"string","description":"The whsec_ secret that signs every delivery. Shown only in this answer: store it now."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove a tenant's webhook of one environment","tags":["admin","webhooks"],"description":"204. Deliveries still queued for it finish without being sent. 404 with `details.code` NOAH_WEBHOOK_NOT_FOUND when the environment has no webhook.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"The environment whose events the webhook receives"}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhooks/{environment}/rotate-secret":{"post":{"summary":"Give a tenant's webhook a new secret","tags":["admin","webhooks"],"description":"Replaces the secret at once: deliveries from now on are signed with the new one, shown only in this answer. 404 with `details.code` NOAH_WEBHOOK_NOT_FOUND when the environment has no webhook.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"The environment whose events the webhook receives"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"webhook":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed"]},"description":"The types it receives; empty receives the ramp.* and earn.* types"},"status":{"type":"string","enum":["active","disabled"]},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"secret":{"type":"string","description":"The whsec_ secret that signs every delivery. Shown only in this answer: store it now."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhooks/{environment}/test":{"post":{"summary":"Send a signed test to a tenant's webhook","tags":["admin","webhooks"],"description":"Sends one `webhook.test` delivery now, signed like every other, whether the webhook is active or not, and answers what happened: `delivered` is true for a 2xx. Not retried, and at most 10 a minute. 404 with `details.code` NOAH_WEBHOOK_NOT_FOUND when the environment has no webhook. Each delivery is a POST with the JSON body `{ id, type, environment, occurredAt, createdAt, data }` and the headers `x-webhook-id`, `x-webhook-timestamp`, `x-webhook-event` and `x-webhook-signature: v1=<base64 HMAC-SHA256>` of `<id>.<timestamp>.<body>`, keyed with the bytes of the base64 after `whsec_`. Answer 2xx within 10 seconds; anything else is retried for up to 10 attempts. No order is promised between deliveries.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"The environment whose events the webhook receives"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"delivered":{"type":"boolean"},"statusCode":{"type":["integer","null"]},"error":{"type":["string","null"]},"durationMs":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-endpoints":{"get":{"summary":"A tenant's webhook endpoints","tags":["admin","webhooks"],"description":"The tenant's webhook endpoints (up to 10 per environment, beside the per-environment webhook of /v1/admin/tenants/{id}/webhooks), without their secrets, and every event type they may ask for. An Aurea administrator, or the tenant's own administrator.","parameters":[{"schema":{"type":"string","enum":["production","sandbox"]},"in":"query","name":"environment","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"endpoints":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"description":{"type":["string","null"]},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]},"description":"The types it receives. Empty receives the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later reach the endpoint only when named"},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Whether its deliveries present Aurea's client certificate (mutual TLS: GET /v1/webhooks/client-certificate). Present while Aurea offers mutual TLS"},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"eventTypes":{"type":"array","description":"Every type an endpoint may ask for, with the version of its published body (components WebhookEvent.<type>.v<version>)","items":{"type":"object","properties":{"type":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]},"version":{"type":"integer"},"summary":{"type":"string"},"schema":{"type":"string"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add a webhook endpoint","tags":["admin","webhooks"],"description":"201 with the endpoint and its secret, shown once. `url` must be https on the default port and name a public DNS host; `eventTypes` lists the types it receives (empty: the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later only when named); `description` is the tenant's own label; `status` defaults to active. A refused value answers 400 with `details.code` WEBHOOK_ENDPOINT_INVALID, `details.field` and, for the address, `details.reason`; an eleventh endpoint in one environment 409 WEBHOOK_ENDPOINT_LIMIT. Each delivery is a POST with the JSON body `{ id, type, environment, occurredAt, createdAt, data }` (published per type as the components `WebhookEvent.<type>.v<version>`) and the headers `x-webhook-id`, `x-webhook-timestamp`, `x-webhook-event` and `x-webhook-signature: v1=<base64 HMAC-SHA256>` of `<id>.<timestamp>.<body>`, keyed with the bytes of the base64 after `whsec_`. When Aurea signs its deliveries, `x-webhook-jws` adds a detached JWS (ES256) of the exact body: put the base64url of the raw body between its two dots and verify it with GET /v1/webhooks/jwks.json; its protected header names the key (`kid`), the tenant (`aud`), the attempt's time (`iat`) and the event (`jti`). Answer 2xx within 10 seconds; anything else is retried for up to 10 attempts. The same event reaches every address that asks for it with the same `id`. No order is promised between deliveries.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["environment","url","eventTypes"],"additionalProperties":false,"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string","minLength":1,"maxLength":2048},"eventTypes":{"type":"array","maxItems":89,"items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]}},"description":{"type":["string","null"],"maxLength":200},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Deliveries present Aurea's client certificate (mutual TLS); true answers 409 WEBHOOK_MTLS_UNAVAILABLE while Aurea does not offer it"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"description":{"type":["string","null"]},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]},"description":"The types it receives. Empty receives the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later reach the endpoint only when named"},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Whether its deliveries present Aurea's client certificate (mutual TLS: GET /v1/webhooks/client-certificate). Present while Aurea offers mutual TLS"},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"secret":{"type":"string","description":"The whsec_ secret that signs every delivery to this endpoint. Shown only in this answer: store it now."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-endpoints/{endpointId}":{"patch":{"summary":"Change a webhook endpoint","tags":["admin","webhooks"],"description":"Changes what the body names — the address, the event types, the label, the status — and keeps the rest and the secret. Deliveries already queued go to the endpoint as it is when they are sent. 400 WEBHOOK_ENDPOINT_INVALID with the field; 404 WEBHOOK_ENDPOINT_NOT_FOUND.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"url":{"type":"string","minLength":1,"maxLength":2048},"eventTypes":{"type":"array","maxItems":89,"items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]}},"description":{"type":["string","null"],"maxLength":200,"description":"null or empty clears it"},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Deliveries present Aurea's client certificate (mutual TLS); true answers 409 WEBHOOK_MTLS_UNAVAILABLE while Aurea does not offer it"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"endpointId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"description":{"type":["string","null"]},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]},"description":"The types it receives. Empty receives the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later reach the endpoint only when named"},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Whether its deliveries present Aurea's client certificate (mutual TLS: GET /v1/webhooks/client-certificate). Present while Aurea offers mutual TLS"},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove a webhook endpoint","tags":["admin","webhooks"],"description":"204. Deliveries still queued for it finish without being sent. 404 WEBHOOK_ENDPOINT_NOT_FOUND.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"endpointId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-endpoints/{endpointId}/rotate-secret":{"post":{"summary":"Give a webhook endpoint a new secret","tags":["admin","webhooks"],"description":"Replaces the secret at once: deliveries from now on are signed with the new one, shown only in this answer. 404 WEBHOOK_ENDPOINT_NOT_FOUND.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"endpointId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"url":{"type":"string"},"description":{"type":["string","null"]},"eventTypes":{"type":"array","items":{"type":"string","enum":["ramp.kyc.updated","ramp.deposit.updated","ramp.payout.updated","ramp.transaction.updated","ramp.card_session.updated","earn.operation.updated","earn.redemption.updated","operation.created","operation.state_changed","operation.completed","operation.failed","tokenized_asset.paused","tokenized_asset.resumed","tokenized_asset.corporate_action","tokenized_asset.operation.quoted","tokenized_asset.operation.submitted","tokenized_asset.operation.completed","tokenized_asset.operation.failed","tokenized_asset.operation.expired","server_credential.revoked","account.created","account.updated","account.wallet_added","transfer.inbound.recorded","transfer.inbound.removed","address_book.entry.requested","address_book.entry.approved","address_book.entry.activated","address_book.entry.rejected","address_book.entry.removed","address_book.entry.proven","address_book.destination.unlisted","transaction.created","transaction.status_changed","transaction.flagged","wallet.created","wallet.frozen","wallet.unfrozen","wallet.custody_changed","wallet.setup.aux_started","wallet.setup.ready_for_backup","wallet.setup.backup_confirmed","wallet.setup.completed","wallet.setup.retired","account.bound","policy.set_published","policy.set_archived","policy.decision_refused","approval.requested","approval.approved","approval.rejected","approval.expired","approval.withdrawn","aml_case.opened","aml_case.released","aml_case.confirmed","ramp.iban.updated","ramp.payout_order.updated","ramp.instruction.updated","ramp.offramp.updated","ramp.withdrawal.updated","ramp.desk_order.updated","ramp.collection.reversed","fiat.profile.updated","fiat.bank_account.updated","fiat.virtual_account.updated","fiat.balance.movement","fiat.transfer.updated","remittance.payout.requested","remittance.payout.approved","remittance.payout.rejected","remittance.payout.expired","remittance.payout.cancelled","remittance.payout.submitted","remittance.payout.completed","remittance.payout.failed","policy.hold","policy.hold_released","policy.hold_expired","policy.cosigner_version","recovery.requested","recovery.opened","recovery.cancelled","recovery.completed","recovery.safe_queued","recovery.safe_executed","recovery.safe_cancelled","identity.verification.updated","identity.handoff.updated"]},"description":"The types it receives. Empty receives the ramp.* and earn.* types only; operation.*, tokenized_asset.* and every type published later reach the endpoint only when named"},"status":{"type":"string","enum":["active","disabled"]},"mtls":{"type":"boolean","description":"Whether its deliveries present Aurea's client certificate (mutual TLS: GET /v1/webhooks/client-certificate). Present while Aurea offers mutual TLS"},"secretHint":{"type":"string","description":"The four characters before the secret's padding"},"secretRotatedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"secret":{"type":"string","description":"The whsec_ secret that signs every delivery to this endpoint. Shown only in this answer: store it now."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-endpoints/{endpointId}/test":{"post":{"summary":"Send a signed test to a webhook endpoint","tags":["admin","webhooks"],"description":"Sends one `webhook.test` delivery now, signed like every other, whether the endpoint is active or not, and answers what happened: `delivered` is true for a 2xx. Not queued, not retried, not in the log of attempts, and at most 10 a minute. 404 WEBHOOK_ENDPOINT_NOT_FOUND. Each delivery is a POST with the JSON body `{ id, type, environment, occurredAt, createdAt, data }` (published per type as the components `WebhookEvent.<type>.v<version>`) and the headers `x-webhook-id`, `x-webhook-timestamp`, `x-webhook-event` and `x-webhook-signature: v1=<base64 HMAC-SHA256>` of `<id>.<timestamp>.<body>`, keyed with the bytes of the base64 after `whsec_`. When Aurea signs its deliveries, `x-webhook-jws` adds a detached JWS (ES256) of the exact body: put the base64url of the raw body between its two dots and verify it with GET /v1/webhooks/jwks.json; its protected header names the key (`kid`), the tenant (`aud`), the attempt's time (`iat`) and the event (`jti`). Answer 2xx within 10 seconds; anything else is retried for up to 10 attempts. The same event reaches every address that asks for it with the same `id`. No order is promised between deliveries.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"endpointId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"delivered":{"type":"boolean"},"statusCode":{"type":["integer","null"]},"error":{"type":["string","null"]},"durationMs":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-deliveries":{"get":{"summary":"A tenant's webhook deliveries","tags":["admin","webhooks"],"description":"One row per event and address — the per-environment webhook or an endpoint — newest first, with its status, its attempts and the last one. `status` takes a comma-separated list; `from` and `to` bound when it was queued. An unknown status answers 400 WEBHOOK_QUERY_INVALID. The body sent is never shown.","parameters":[{"schema":{"type":"string","enum":["production","sandbox"]},"in":"query","name":"environment","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false,"description":"Comma-separated: pending, sending, delivered, skipped, retrying, failed, cancelled"},{"schema":{"type":"string","pattern":"^evt_[0-9a-f]{32}$"},"in":"query","name":"eventId","required":false},{"schema":{"type":"string","maxLength":100},"in":"query","name":"eventType","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"endpointId","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"deliveries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"eventType":{"type":"string"},"environment":{"type":"string","enum":["production","sandbox"]},"endpoint":{"type":"object","properties":{"kind":{"type":"string","enum":["environment","endpoint"],"description":"environment: the per-environment webhook (/v1/admin/tenants/{id}/webhooks); endpoint: one of the webhook endpoints"},"id":{"type":["string","null"],"format":"uuid","description":"The endpoint's id, or the per-environment webhook's; null once that webhook was removed"}}},"status":{"type":"string","enum":["pending","sending","delivered","skipped","retrying","failed","cancelled"],"description":"pending: waiting for its first attempt; sending: being posted; delivered: answered 2xx; skipped: finished without being posted, as its address was removed, disabled or no longer asks for the type; retrying: failed, waiting for its next attempt; failed: out of attempts; cancelled: dropped by the queue"},"attempts":{"type":"integer"},"maxAttempts":{"type":"integer"},"nextAttemptAt":{"type":["string","null"],"format":"date-time","description":"When it is posted next, while pending or retrying"},"lastAttempt":{"type":["object","null"],"properties":{"startedAt":{"type":"string","format":"date-time"},"outcome":{"type":"string","enum":["delivered","failed"]},"statusCode":{"type":["integer","null"]},"durationMs":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-attempts":{"get":{"summary":"The log of a tenant's webhook attempts","tags":["admin","webhooks"],"description":"Every attempt to post a delivery, newest first: when, how long, the status the tenant's server answered or why none came; its answer's body is never read. Kept 30 days. `from` and `to` bound when the attempt started.","parameters":[{"schema":{"type":"string","enum":["production","sandbox"]},"in":"query","name":"environment","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"deliveryId","required":false},{"schema":{"type":"string","pattern":"^evt_[0-9a-f]{32}$"},"in":"query","name":"eventId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"endpointId","required":false},{"schema":{"type":"string","enum":["delivered","failed"]},"in":"query","name":"outcome","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"attempts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deliveryId":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"eventType":{"type":"string"},"environment":{"type":"string","enum":["production","sandbox"]},"endpoint":{"type":"object","properties":{"kind":{"type":"string","enum":["environment","endpoint"],"description":"environment: the per-environment webhook (/v1/admin/tenants/{id}/webhooks); endpoint: one of the webhook endpoints"},"id":{"type":"string","format":"uuid"}}},"url":{"type":"string","description":"The address as it was when posted to"},"attempt":{"type":"integer","description":"The delivery's attempt number; a resend starts again from 1"},"startedAt":{"type":"string","format":"date-time"},"durationMs":{"type":"integer"},"outcome":{"type":"string","enum":["delivered","failed"]},"statusCode":{"type":["integer","null"],"description":"What the tenant's server answered; null when no answer came"},"error":{"type":["string","null"],"description":"Why no answer came (a timeout, an address that is not public, a network error); null when one did"},"jwsKid":{"type":["string","null"],"description":"The key of the x-webhook-jws header, when one was sent"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/webhook-deliveries/resend":{"post":{"summary":"Send webhook deliveries again","tags":["admin","webhooks"],"description":"Puts the tenant's deliveries back in the queue with a fresh budget of attempts: those of one event (`eventId`), those queued in a range (`from`, `to`, at most 31 days), or every one that failed (`failed: true`) — in one environment, of every address or of one (`endpointId`). A delivery still pending or being sent is left as it is. The same body goes again with the same event id, signed when it is sent, to the address as it is then. At most 500 a call, oldest first: `more` is true when others match. 400 WEBHOOK_RESEND_INVALID with the field; at most 10 calls a minute.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["environment"],"additionalProperties":false,"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"eventId":{"type":"string","pattern":"^evt_[0-9a-f]{32}$"},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"failed":{"type":"boolean","enum":[true]},"endpointId":{"type":"string","format":"uuid"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"resent":{"type":"integer"},"deliveryIds":{"type":"array","items":{"type":"string","format":"uuid"}},"more":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/wallet-embed/keys":{"get":{"summary":"List a tenant's embedded wallet keys","tags":["admin"],"description":"The tenant's public keys for embedding the wallet in its own pages, each with the origins allowed to frame it, revoked ones included.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object","required":["id","environment","publicKey","allowedOrigins","label","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"publicKey":{"type":"string","description":"Public: pk_live_ (production) or pk_test_ (sandbox), then 26 base32 characters"},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add an embedded wallet key","tags":["admin"],"description":"201 with the new key. Each origin is exact (scheme://host[:port], nothing after it), https (http only for localhost, *.localhost and *.test on a sandbox key), never a wildcard and never one of Aurea's own hosts; at least one, at most 10. A refused origin answers 400 with `details.code` WALLET_EMBED_ORIGIN_INVALID, `details.origin` and `details.reason`; more than 10 answers 400 WALLET_EMBED_ORIGINS_TOO_MANY. Any other refused field answers 400 WALLET_EMBED_KEY_INVALID with `details.field`. 403 WALLET_EMBED_NOT_ENABLED while the embedded wallet is not turned on for the tenant (its wallets are integrated through the API; Aurea turns it on, on request).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["environment","allowedOrigins"],"additionalProperties":false,"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"allowedOrigins":{"type":"array","maxItems":10,"items":{"type":"string"}},"label":{"type":["string","null"],"maxLength":120}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","publicKey","allowedOrigins","label","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"publicKey":{"type":"string","description":"Public: pk_live_ (production) or pk_test_ (sandbox), then 26 base32 characters"},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/wallet-embed/keys/{keyId}/origins":{"put":{"summary":"Replace an embedded wallet key's allowed origins","tags":["admin"],"description":"Each origin is exact (scheme://host[:port], nothing after it), https (http only for localhost, *.localhost and *.test on a sandbox key), never a wildcard and never one of Aurea's own hosts; at least one, at most 10. A refused origin answers 400 with `details.code` WALLET_EMBED_ORIGIN_INVALID, `details.origin` and `details.reason`; more than 10 answers 400 WALLET_EMBED_ORIGINS_TOO_MANY. 404 WALLET_EMBED_KEY_NOT_FOUND for a key the tenant does not have, 409 WALLET_EMBED_KEY_REVOKED for a revoked one, 403 WALLET_EMBED_NOT_ENABLED while the embedded wallet is not turned on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["allowedOrigins"],"additionalProperties":false,"properties":{"allowedOrigins":{"type":"array","maxItems":10,"items":{"type":"string"}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"keyId","required":true,"description":"The embedded wallet key's id"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","publicKey","allowedOrigins","label","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"publicKey":{"type":"string","description":"Public: pk_live_ (production) or pk_test_ (sandbox), then 26 base32 characters"},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/wallet-embed/keys/{keyId}/revoke":{"post":{"summary":"Revoke an embedded wallet key","tags":["admin"],"description":"The key frames nothing from the next release of the wallet on; a revoked key is never active again. 404 WALLET_EMBED_KEY_NOT_FOUND for a key the tenant does not have, 409 WALLET_EMBED_KEY_REVOKED for one already revoked.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["reason"],"additionalProperties":false,"properties":{"reason":{"type":"string","minLength":1,"maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true,"description":"Tenant id"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"keyId","required":true,"description":"The embedded wallet key's id"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","environment","publicKey","allowedOrigins","label","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"publicKey":{"type":"string","description":"Public: pk_live_ (production) or pk_test_ (sandbox), then 26 base32 characters"},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","enum":["active","revoked"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/institution-callback":{"get":{"summary":"A tenant's institution callback","tags":["admin"],"description":"Both environments' settings, null where none was written (the callback is then off). Before one of the tenant's keys signs (a custodial wallet, its MPC wallet's share, what is handed to its client to sign), Aurea POSTs to `url` a JWT signed ES256 (`content-type: application/jwt`; header `typ` `aurea-callback+jwt`, `kid` one of GET /v1/institution-callbacks/jwks.json) whose claims say what is about to be signed (`kind` operation, or approval for an approval request), and waits 30 seconds for a 200 whose body is a JWT signed ES256 by one of `publicKeys` (`typ` `aurea-callback-answer+jwt`, `kid` the key's thumbprint) with `requestId` and `requestJti` (the request's `jti`), `action` APPROVE, REJECT or RETRY (IGNORE too for an approval request), `iat` and `exp` (five minutes at most). RETRY asks again until `retry.maxSeconds` (48 hours at most). An answer that is not valid rejects; no answer decides by the fallback.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["tenantId","environments"],"properties":{"tenantId":{"type":"string","format":"uuid"},"environments":{"type":"object","required":["production","sandbox"],"properties":{"production":{"type":["object","null"],"required":["environment","mode","url","publicKeys","fallback","effectiveFallback","retry","approvals","version","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"mode":{"type":"string","enum":["off","on"]},"url":{"type":["string","null"]},"publicKeys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint: the `kid` of the answers it signs"}}}},"fallback":{"type":"string","enum":["reject","allow"]},"effectiveFallback":{"type":"string","enum":["reject","allow"],"description":"What decides when the endpoint gives no usable answer: an institutional tenant is always rejected"},"retry":{"type":"object","required":["maxSeconds","intervalSeconds"],"properties":{"maxSeconds":{"type":"integer"},"intervalSeconds":{"type":"integer"}}},"approvals":{"type":"object","required":["mode","approverUserId"],"properties":{"mode":{"type":"string","enum":["off","on"]},"approverUserId":{"type":["string","null"],"format":"uuid"}}},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"sandbox":{"type":["object","null"],"required":["environment","mode","url","publicKeys","fallback","effectiveFallback","retry","approvals","version","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"mode":{"type":"string","enum":["off","on"]},"url":{"type":["string","null"]},"publicKeys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint: the `kid` of the answers it signs"}}}},"fallback":{"type":"string","enum":["reject","allow"]},"effectiveFallback":{"type":"string","enum":["reject","allow"],"description":"What decides when the endpoint gives no usable answer: an institutional tenant is always rejected"},"retry":{"type":"object","required":["maxSeconds","intervalSeconds"],"properties":{"maxSeconds":{"type":"integer"},"intervalSeconds":{"type":"integer"}}},"approvals":{"type":"object","required":["mode","approverUserId"],"properties":{"mode":{"type":"string","enum":["off","on"]},"approverUserId":{"type":["string","null"],"format":"uuid"}}},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}}}}}},"/v1/admin/tenants/{id}/institution-callback/{environment}":{"put":{"summary":"Change a tenant's institution callback","tags":["admin"],"description":"Writes one environment's settings: what the body leaves out keeps its stored value (or the default: off, reject, 48 hours, 60 seconds, approvals off). `mode` on needs `url` (https, a public host) and one or two `publicKeys` (P-256 JWKs, public part only: two during a rotation), and Aurea's request key (409 INSTITUTION_CALLBACK_SIGNER_NOT_CONFIGURED otherwise). `approvals.mode` on sends the approval requests too, answered for `approvals.approverUserId` (an active approver of the tenant): APPROVE and REJECT then carry `approvalSignature`, that approver's approval key's JWS over the payload sent. 201 when the environment had no settings, 200 otherwise; 400 INSTITUTION_CALLBACK_INVALID with `details.field`. An Admin Quorum action. Before one of the tenant's keys signs (a custodial wallet, its MPC wallet's share, what is handed to its client to sign), Aurea POSTs to `url` a JWT signed ES256 (`content-type: application/jwt`; header `typ` `aurea-callback+jwt`, `kid` one of GET /v1/institution-callbacks/jwks.json) whose claims say what is about to be signed (`kind` operation, or approval for an approval request), and waits 30 seconds for a 200 whose body is a JWT signed ES256 by one of `publicKeys` (`typ` `aurea-callback-answer+jwt`, `kid` the key's thumbprint) with `requestId` and `requestJti` (the request's `jti`), `action` APPROVE, REJECT or RETRY (IGNORE too for an approval request), `iat` and `exp` (five minutes at most). RETRY asks again until `retry.maxSeconds` (48 hours at most). An answer that is not valid rejects; no answer decides by the fallback.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["mode"],"additionalProperties":false,"properties":{"mode":{"type":"string","enum":["off","on"]},"url":{"type":["string","null"],"minLength":1,"maxLength":2048},"publicKeys":{"type":"array","maxItems":2,"items":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"}}}},"fallback":{"type":"string","enum":["reject","allow"],"description":"When the endpoint gives no usable answer (timeout, unreachable, an error status): reject (default) or allow; an institutional tenant is always rejected"},"retry":{"type":"object","additionalProperties":false,"properties":{"maxSeconds":{"type":"integer","minimum":60,"maximum":172800},"intervalSeconds":{"type":"integer","minimum":10,"maximum":3600}}},"approvals":{"type":"object","required":["mode"],"additionalProperties":false,"properties":{"mode":{"type":"string","enum":["off","on"]},"approverUserId":{"type":["string","null"],"format":"uuid"}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"production: the signatures on main networks; sandbox: on test networks"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["settings","created"],"properties":{"settings":{"type":["object","null"],"required":["environment","mode","url","publicKeys","fallback","effectiveFallback","retry","approvals","version","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"mode":{"type":"string","enum":["off","on"]},"url":{"type":["string","null"]},"publicKeys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint: the `kid` of the answers it signs"}}}},"fallback":{"type":"string","enum":["reject","allow"]},"effectiveFallback":{"type":"string","enum":["reject","allow"],"description":"What decides when the endpoint gives no usable answer: an institutional tenant is always rejected"},"retry":{"type":"object","required":["maxSeconds","intervalSeconds"],"properties":{"maxSeconds":{"type":"integer"},"intervalSeconds":{"type":"integer"}}},"approvals":{"type":"object","required":["mode","approverUserId"],"properties":{"mode":{"type":"string","enum":["off","on"]},"approverUserId":{"type":["string","null"],"format":"uuid"}}},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"created":{"type":"boolean"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["settings","created"],"properties":{"settings":{"type":["object","null"],"required":["environment","mode","url","publicKeys","fallback","effectiveFallback","retry","approvals","version","updatedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"mode":{"type":"string","enum":["off","on"]},"url":{"type":["string","null"]},"publicKeys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint: the `kid` of the answers it signs"}}}},"fallback":{"type":"string","enum":["reject","allow"]},"effectiveFallback":{"type":"string","enum":["reject","allow"],"description":"What decides when the endpoint gives no usable answer: an institutional tenant is always rejected"},"retry":{"type":"object","required":["maxSeconds","intervalSeconds"],"properties":{"maxSeconds":{"type":"integer"},"intervalSeconds":{"type":"integer"}}},"approvals":{"type":"object","required":["mode","approverUserId"],"properties":{"mode":{"type":"string","enum":["off","on"]},"approverUserId":{"type":["string","null"],"format":"uuid"}}},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"created":{"type":"boolean"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}}}}},"/v1/admin/tenants/{id}/institution-callback/{environment}/test":{"post":{"summary":"Test a tenant's institution callback","tags":["admin"],"description":"Sends the endpoint one signed request of kind `test`, as the environment's settings stand (on or off), and reads its answer: `outcome` answered (with its `action`), invalid (with `reason`: malformed, unknown_kid, bad_signature, expired, wrong_request, wrong_attempt…) or unavailable (`reason`: timeout, unreachable, bad_status, blocked_url, signer_not_configured…). Nothing is stored, changed or signed for the tenant. 404 INSTITUTION_CALLBACK_NOT_FOUND without settings; at most 10 a minute.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["production","sandbox"]},"in":"path","name":"environment","required":true,"description":"production: the signatures on main networks; sandbox: on test networks"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["outcome","action","reason","status","durationMs"],"properties":{"outcome":{"type":"string","enum":["answered","invalid","unavailable"]},"action":{"type":["string","null"],"enum":["APPROVE","REJECT","RETRY","IGNORE",null]},"reason":{"type":["string","null"]},"status":{"type":["integer","null"]},"durationMs":{"type":"integer"}}}}}}}}},"/v1/admin/tenants/{id}/institution-callback/requests":{"get":{"summary":"A tenant's institution callback requests","tags":["admin"],"description":"What was asked of the tenant's callback, newest first: its kind, signing point, operation or approval request, status (pending, approved, rejected, ignored, expired, failed, cancelled), attempts, next attempt and deadline, the last attempt's outcome and the decisive answer's hash. Filters: `status`, `operationId`; pages of `limit` (50 by default, 200 at most), the next with `before` (the last id read).","parameters":[{"schema":{"type":"string","enum":["pending","approved","rejected","ignored","expired","failed","cancelled"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"operationId","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"before","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["requests"],"properties":{"requests":{"type":"array","items":{"type":"object","required":["id","environment","kind","point","operationId","approvalId","status","attempts","nextPollAt","deadlineAt","lastOutcome","reason","answerSha256","decidedAt","consumedAt","held","resultStatus","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"kind":{"type":"string","enum":["operation","approval"]},"point":{"type":["string","null"]},"operationId":{"type":["string","null"],"format":"uuid"},"approvalId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","ignored","expired","failed","cancelled"]},"attempts":{"type":"integer"},"nextPollAt":{"type":["string","null"],"format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"},"lastOutcome":{"type":["string","null"]},"reason":{"type":["string","null"]},"answerSha256":{"type":["string","null"],"description":"SHA-256 of the decisive signed answer, kept with the request"},"decidedAt":{"type":["string","null"],"format":"date-time"},"consumedAt":{"type":["string","null"],"format":"date-time"},"held":{"type":"boolean"},"resultStatus":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}}}}}}}},"/v1/admin/tenants/{id}/alarms":{"get":{"summary":"The tenant's alarms","tags":["tenants"],"description":"What Aurea's monitors raised about the tenant's own resources — operations, wallet balances, the Gas Station, the omnibus, the bank ramp, tokenized assets — open first and newest activity first. The platform's own alarms are never listed. A tenant's administrators and operations readers read their own tenant; Aurea's platform roles name any.","parameters":[{"schema":{"type":"string","enum":["production","sandbox"]},"in":"query","name":"environment","required":false},{"schema":{"type":"string"},"in":"query","name":"kind","required":false,"description":"One or more kinds, comma-separated; every kind by default. An unknown kind answers 400 ALARMS_INVALID"},{"schema":{"type":"string","enum":["open","acknowledged","resolved"]},"in":"query","name":"state","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"alarms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["balance_fall","events_dead","payout_stuck","virtual_account_orphan","balance_unwatched","operation_stuck","tokenized_catalogue","tokenized_chain_state","tokenized_yield_price","tokenized_secondary_quote","tokenized_settlement_overdue","tokenized_issuer_history","balance_mismatch","gas_funding_low","gas_topup_failed","gas_price_above_max","sweep_failed","omnibus_ledger_mismatch","bank_ramp_subscription_inactive","bank_ramp_order_stuck","bank_ramp_signature_expired","bank_ramp_order_unread","bank_ramp_paused","bank_ramp_access_refused","bank_ramp_webhook_failing","bank_ramp_event_dead","bank_ramp_balance_low","bank_ramp_reversal","bank_ramp_ledger_drift","bank_ramp_payin_unattributed","bank_ramp_conversion_unfinished","identity_webhook_failing","identity_event_dead","identity_access_refused","identity_consumer_conflict"],"description":"What Aurea's monitors found about one of the tenant's resources. operation_stuck: an operation not final after 24 hours. balance_mismatch: a wallet's balance on a chain differs from what the records give. gas_funding_low, gas_topup_failed, gas_price_above_max: the Gas Station could not top up a wallet (a funding wallet that cannot pay, a top-up that failed, the network above a policy's maximum price). sweep_failed, omnibus_ledger_mismatch: an omnibus sweep or withdrawal that failed, or the chain differing from the sub-ledger. payout_stuck, events_dead, virtual_account_orphan and the bank_ramp_* kinds: the bank ramp's payouts, deposits, deliveries to the tenant's endpoint, conversions and balances. tokenized_*: the tokenized assets' operations and their issuer's history. identity_*: identity verification's webhooks, events and access for the tenant's own organisation, and an automatic result that disagrees with a person's decision on the bank ramp's customer. Each alarm is resolved by the monitor that raised it once the condition is gone, or taken in hand by Aurea"},"state":{"type":"string","enum":["open","acknowledged","resolved"],"description":"open until Aurea takes it in hand (acknowledged) or the monitor that raised it finds the condition gone (resolved)"},"occurrences":{"type":"integer","description":"How many runs of the monitor found it still true"},"raisedAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"detail":{"type":"object","additionalProperties":true,"description":"What was true when it was last seen; the shape follows the kind. Never a secret or a person's data"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/alarms/{alarmId}":{"get":{"summary":"One of the tenant's alarms","tags":["tenants"],"description":"One alarm about the tenant's own resources, as the list answers it. 404 ALARM_NOT_FOUND when there is no such alarm, or it is not about this tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"alarmId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"alarm":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"kind":{"type":"string","enum":["balance_fall","events_dead","payout_stuck","virtual_account_orphan","balance_unwatched","operation_stuck","tokenized_catalogue","tokenized_chain_state","tokenized_yield_price","tokenized_secondary_quote","tokenized_settlement_overdue","tokenized_issuer_history","balance_mismatch","gas_funding_low","gas_topup_failed","gas_price_above_max","sweep_failed","omnibus_ledger_mismatch","bank_ramp_subscription_inactive","bank_ramp_order_stuck","bank_ramp_signature_expired","bank_ramp_order_unread","bank_ramp_paused","bank_ramp_access_refused","bank_ramp_webhook_failing","bank_ramp_event_dead","bank_ramp_balance_low","bank_ramp_reversal","bank_ramp_ledger_drift","bank_ramp_payin_unattributed","bank_ramp_conversion_unfinished","identity_webhook_failing","identity_event_dead","identity_access_refused","identity_consumer_conflict"],"description":"What Aurea's monitors found about one of the tenant's resources. operation_stuck: an operation not final after 24 hours. balance_mismatch: a wallet's balance on a chain differs from what the records give. gas_funding_low, gas_topup_failed, gas_price_above_max: the Gas Station could not top up a wallet (a funding wallet that cannot pay, a top-up that failed, the network above a policy's maximum price). sweep_failed, omnibus_ledger_mismatch: an omnibus sweep or withdrawal that failed, or the chain differing from the sub-ledger. payout_stuck, events_dead, virtual_account_orphan and the bank_ramp_* kinds: the bank ramp's payouts, deposits, deliveries to the tenant's endpoint, conversions and balances. tokenized_*: the tokenized assets' operations and their issuer's history. identity_*: identity verification's webhooks, events and access for the tenant's own organisation, and an automatic result that disagrees with a person's decision on the bank ramp's customer. Each alarm is resolved by the monitor that raised it once the condition is gone, or taken in hand by Aurea"},"state":{"type":"string","enum":["open","acknowledged","resolved"],"description":"open until Aurea takes it in hand (acknowledged) or the monitor that raised it finds the condition gone (resolved)"},"occurrences":{"type":"integer","description":"How many runs of the monitor found it still true"},"raisedAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"acknowledgedAt":{"type":["string","null"],"format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"detail":{"type":"object","additionalProperties":true,"description":"What was true when it was last seen; the shape follows the kind. Never a secret or a person's data"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/audit-events":{"get":{"summary":"The tenant's audit trail","tags":["audit"],"description":"What was done to the tenant's money, keys, governance, security, settings and access, newest first, from the tenant's append-only, hash-chained audit trail. Up to a year per request, in pages. A tenant administrator reads their own tenant; a platform administrator names the tenant.","parameters":[{"schema":{"type":"string","enum":["money","keys","governance","security","settings","access"]},"in":"query","name":"category","required":false},{"schema":{"type":"string","pattern":"^[a-z][a-z0-9_.]{0,119}$"},"in":"query","name":"action","required":false,"description":"Only actions starting with this, e.g. `wallet.`"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false,"description":"Oldest event time (default: 30 days before `to`)"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false,"description":"Newest event time, excluded (default: now). At most 366 days after `from`"},{"schema":{"type":"integer","minimum":1},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Platform administrators only: the tenant to read"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"seq":{"type":"integer","description":"The event's place in its chain, from 1"},"category":{"type":"string","enum":["money","keys","governance","security","settings","access"]},"action":{"type":"string","description":"What was done, e.g. wallet.deactivated"},"actor":{"type":"object","properties":{"kind":{"type":"string","enum":["user","service","system","tenant_api"]},"id":{"type":["string","null"]},"role":{"type":["string","null"]}}},"subject":{"type":"object","properties":{"type":{"type":["string","null"]},"id":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"Ids, amounts in the smallest unit, states and codes; never a key, a secret or a person's data"},"requestId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"prevHash":{"type":["string","null"],"description":"The hash of the event before it in the chain"},"hash":{"type":"string","description":"SHA-256 of the event's content and the link to the one before"}}}},"nextCursor":{"type":["integer","null"],"description":"Pass it as `cursor` for the next page; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/operations":{"get":{"summary":"List operations","tags":["operations"],"description":"The operations the money routes started (sends, approvals, swaps, Lumen, payouts, dApp broadcasts), newest first, with their public state. A user reads their own; a tenant administrator every operation of the tenant. Operations are recorded only while Aurea has the operations record switched on for the platform.","parameters":[{"schema":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"in":"query","name":"state","required":false},{"schema":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"]},"in":"query","name":"type","required":false},{"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"in":"query","name":"chain","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false,"description":"Only this user's operations (a user sees only their own whatever it says)"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false,"description":"Created at or after"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false,"description":"Created before"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"}}}},"nextCursor":{"type":["string","null"],"description":"Pass it as `cursor` for the next page; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/operations/count":{"get":{"summary":"Count operations","tags":["operations"],"description":"How many operations match the same filters as the list (state, type, chain, wallet, user, `from`, `to`), and how many of them were created in the last 24 hours. A user counts their own; a tenant administrator every operation of the tenant.","parameters":[{"schema":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"in":"query","name":"state","required":false},{"schema":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"]},"in":"query","name":"type","required":false},{"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"in":"query","name":"chain","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false,"description":"Only this user's operations (a user sees only their own whatever it says)"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false,"description":"Created at or after"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false,"description":"Created before"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["total","last24h"],"properties":{"total":{"type":"integer","minimum":0,"description":"The operations the filters match"},"last24h":{"type":"integer","minimum":0,"description":"Of them, those created in the last 24 hours (the server's clock)"}}}}}},"400":{"description":"`from` is not before `to` (`details.code` OPERATIONS_WINDOW_INVALID), or a filter is not valid","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"`from` is not before `to` (`details.code` OPERATIONS_WINDOW_INVALID), or a filter is not valid"}}}}}}},"/v1/operations/by-external-id/{externalTxId}":{"get":{"summary":"Get an operation by the tenant's own id","tags":["operations"],"description":"The operation the tenant named with its externalTxId, with every state it passed.","parameters":[{"schema":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,255}$"},"in":"path","name":"externalTxId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}},"simulations":{"type":"array","description":"What its signing points decoded and simulated, oldest first (plan W7.1): empty where none ran","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"point":{"type":"string","description":"The signing point it ran at (e.g. custodial_transfer)"},"mode":{"type":"string","enum":["log","enforce"],"description":"log: recorded beside the signing, never refusing; enforce: the signing waited for it"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"summary":{"type":["string","null"],"description":"What the transaction does, in words"},"decoded":{"type":["object","null"],"additionalProperties":true,"description":"The call decoded: its kind (native_transfer, erc20_transfer, erc20_approve, erc20_permit, swap, lending_supply, lending_withdraw, vault_deposit, forwarded_transfer, safe_transaction, unknown_contract_call…, or solana_transaction), its function, the asset, amount, recipient or spender it names"},"intent":{"type":"object","additionalProperties":true,"description":"What was asked (kind send, approve, swap, supply, withdraw, spend or none) and its asset, amount and counterparty"},"status":{"type":"string","enum":["simulated","reverted","unavailable","not_applicable"],"description":"simulated: it would run; reverted: it would fail; unavailable: it could not be simulated (never taken for a success); not_applicable: a message signature, no transaction"},"method":{"type":["string","null"],"description":"How it was simulated: eth_simulateV1 or debug_traceCall on the platform's node of the chain, simulateTransaction on the platform's Solana node, or provider"},"verdict":{"type":"string","enum":["matches","diverges","no_intent","not_simulated","not_a_transaction"],"description":"matches: the outcome keeps to what was asked; diverges: it does not (reasons); no_intent: simulated, with nothing precise asked of it (a dApp's own call); not_simulated: not decoded or not simulated"},"reasons":{"type":"array","items":{"type":"string"},"description":"Why it diverges or was not simulated: reverted, more_out_than_asked, unexpected_asset_out, unexpected_recipient, recipient_short, unexpected_approval, approval_differs, approval_not_set, nothing_received, less_in_than_asked, call_differs_from_request, simulation_unavailable, undecodable"},"findings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"asset":{"type":"string"},"address":{"type":"string"},"field":{"type":"string"},"expected":{"type":"string"},"actual":{"type":"string"},"detail":{"type":"string"}}},"description":"Each reason, with what it is about"},"refused":{"type":"boolean","description":"The signing was refused for it (enforce: TX_NOT_SIMULATED or TX_SIMULATION_DIVERGES)"},"outcome":{"type":"object","properties":{"reason":{"type":["string","null"],"description":"Why it could not be simulated"},"revertReason":{"type":["string","null"]},"gasUsed":{"type":["string","null"]},"balanceChanges":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"asset":{"type":"string","description":"native, or the token's address"},"delta":{"type":"string","description":"The net change in the asset's smallest unit (negative: it leaves)"}}}},"approvals":{"type":"array","items":{"type":"object","properties":{"owner":{"type":"string"},"token":{"type":"string"},"spender":{"type":"string"},"amount":{"type":"string","description":"The allowance set; all for an operator approval"},"kind":{"type":"string","enum":["erc20","operator","spl"],"description":"erc20: an ERC-20 allowance; operator: ApprovalForAll; spl: a Solana token account's delegate"}}}},"contractsTouched":{"type":"array","items":{"type":"string"}},"durationMs":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"}}}},"signingChecks":{"type":"array","description":"What the message rules, exact approvals and the server's build of a swap said at its signing points, oldest first (plans W7.2, W7.3, W6.6): empty where none ran","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"point":{"type":"string"},"control":{"type":"string","enum":["message_signing","exact_approvals","swap_server_build"],"description":"message_signing (the message rules), exact_approvals (exact approvals, the residue revoked), swap_server_build (the swap's route built on the server) — each where Aurea enables it for your tenant"},"mode":{"type":"string","enum":["log","enforce"]},"subject":{"type":"string","enum":["personal_sign","eip712","raw","transaction","approval","revoke","swap_route"]},"verdict":{"type":"string","enum":["allowed","would_refuse","refused","unchanged","would_change","changed","failed"],"description":"allowed: a rule allowed it; would_refuse / would_change: what enforce would refuse or change (log); refused / changed: what it did (enforce); failed: a revoke that could not be sent"},"code":{"type":["string","null"],"description":"The refusal's code: MESSAGE_DOMAIN_NOT_ALLOWED, PERSONAL_SIGN_NOT_ALLOWED, RAW_SIGN_NOT_ALLOWED, APPROVAL_SPENDER_NOT_ALLOWED, APPROVAL_AMOUNT_REQUIRED, APPROVAL_RESET_REQUIRED, SWAP_QUOTE_UNKNOWN, SWAP_ROUTER_NOT_ALLOWED"},"rule":{"type":["string","null"],"description":"The rule that allowed it: builtin:<name> (one of Aurea's own rules, by its name), tenant:<rule id>, dapp:<dApp id>"},"details":{"type":"object","additionalProperties":true,"description":"Numbers in the smallest unit, codes and public contract addresses: the token and spender, the amount, the allowance before, the residue after, the reasons"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}}}}},"/v1/operations/signing-checks/{checkId}":{"get":{"summary":"Get a signing check","tags":["operations"],"description":"What the message rules, exact approvals or the server's build of a swap said at a signing point (plans W7.2, W7.3, W6.6): the record a refusal names in `details.checkId`. `operationId` is the operation it belongs to — then it is also in that operation's `signingChecks` — or null when the call had none (most refusals come before an operation is recorded). A user reads the checks of its own wallets and operations; a tenant administrator any of the tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"checkId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"point":{"type":"string"},"control":{"type":"string","enum":["message_signing","exact_approvals","swap_server_build"],"description":"message_signing (the message rules), exact_approvals (exact approvals, the residue revoked), swap_server_build (the swap's route built on the server) — each where Aurea enables it for your tenant"},"mode":{"type":"string","enum":["log","enforce"]},"subject":{"type":"string","enum":["personal_sign","eip712","raw","transaction","approval","revoke","swap_route"]},"verdict":{"type":"string","enum":["allowed","would_refuse","refused","unchanged","would_change","changed","failed"],"description":"allowed: a rule allowed it; would_refuse / would_change: what enforce would refuse or change (log); refused / changed: what it did (enforce); failed: a revoke that could not be sent"},"code":{"type":["string","null"],"description":"The refusal's code: MESSAGE_DOMAIN_NOT_ALLOWED, PERSONAL_SIGN_NOT_ALLOWED, RAW_SIGN_NOT_ALLOWED, APPROVAL_SPENDER_NOT_ALLOWED, APPROVAL_AMOUNT_REQUIRED, APPROVAL_RESET_REQUIRED, SWAP_QUOTE_UNKNOWN, SWAP_ROUTER_NOT_ALLOWED"},"rule":{"type":["string","null"],"description":"The rule that allowed it: builtin:<name> (one of Aurea's own rules, by its name), tenant:<rule id>, dapp:<dApp id>"},"details":{"type":"object","additionalProperties":true,"description":"Numbers in the smallest unit, codes and public contract addresses: the token and spender, the amount, the allowance before, the residue after, the reasons"},"createdAt":{"type":"string","format":"date-time"},"operationId":{"type":["string","null"],"format":"uuid","description":"The operation the check belongs to; null when the call had none"}}}}}},"404":{"description":"No such signing check among those the caller may read (`details.code` SIGNING_CHECK_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such signing check among those the caller may read (`details.code` SIGNING_CHECK_NOT_FOUND)"}}}}}}},"/v1/operations/{id}":{"get":{"summary":"Get an operation","tags":["operations"],"description":"One operation with every state it passed, and what each of its signing points decoded and simulated (`simulations`: the call in words, the balance changes, approvals and contracts of its simulation, and whether the outcome keeps to what was asked). A user reads their own; a tenant administrator any of the tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}},"simulations":{"type":"array","description":"What its signing points decoded and simulated, oldest first (plan W7.1): empty where none ran","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"point":{"type":"string","description":"The signing point it ran at (e.g. custodial_transfer)"},"mode":{"type":"string","enum":["log","enforce"],"description":"log: recorded beside the signing, never refusing; enforce: the signing waited for it"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"summary":{"type":["string","null"],"description":"What the transaction does, in words"},"decoded":{"type":["object","null"],"additionalProperties":true,"description":"The call decoded: its kind (native_transfer, erc20_transfer, erc20_approve, erc20_permit, swap, lending_supply, lending_withdraw, vault_deposit, forwarded_transfer, safe_transaction, unknown_contract_call…, or solana_transaction), its function, the asset, amount, recipient or spender it names"},"intent":{"type":"object","additionalProperties":true,"description":"What was asked (kind send, approve, swap, supply, withdraw, spend or none) and its asset, amount and counterparty"},"status":{"type":"string","enum":["simulated","reverted","unavailable","not_applicable"],"description":"simulated: it would run; reverted: it would fail; unavailable: it could not be simulated (never taken for a success); not_applicable: a message signature, no transaction"},"method":{"type":["string","null"],"description":"How it was simulated: eth_simulateV1 or debug_traceCall on the platform's node of the chain, simulateTransaction on the platform's Solana node, or provider"},"verdict":{"type":"string","enum":["matches","diverges","no_intent","not_simulated","not_a_transaction"],"description":"matches: the outcome keeps to what was asked; diverges: it does not (reasons); no_intent: simulated, with nothing precise asked of it (a dApp's own call); not_simulated: not decoded or not simulated"},"reasons":{"type":"array","items":{"type":"string"},"description":"Why it diverges or was not simulated: reverted, more_out_than_asked, unexpected_asset_out, unexpected_recipient, recipient_short, unexpected_approval, approval_differs, approval_not_set, nothing_received, less_in_than_asked, call_differs_from_request, simulation_unavailable, undecodable"},"findings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"asset":{"type":"string"},"address":{"type":"string"},"field":{"type":"string"},"expected":{"type":"string"},"actual":{"type":"string"},"detail":{"type":"string"}}},"description":"Each reason, with what it is about"},"refused":{"type":"boolean","description":"The signing was refused for it (enforce: TX_NOT_SIMULATED or TX_SIMULATION_DIVERGES)"},"outcome":{"type":"object","properties":{"reason":{"type":["string","null"],"description":"Why it could not be simulated"},"revertReason":{"type":["string","null"]},"gasUsed":{"type":["string","null"]},"balanceChanges":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"asset":{"type":"string","description":"native, or the token's address"},"delta":{"type":"string","description":"The net change in the asset's smallest unit (negative: it leaves)"}}}},"approvals":{"type":"array","items":{"type":"object","properties":{"owner":{"type":"string"},"token":{"type":"string"},"spender":{"type":"string"},"amount":{"type":"string","description":"The allowance set; all for an operator approval"},"kind":{"type":"string","enum":["erc20","operator","spl"],"description":"erc20: an ERC-20 allowance; operator: ApprovalForAll; spl: a Solana token account's delegate"}}}},"contractsTouched":{"type":"array","items":{"type":"string"}},"durationMs":{"type":"integer"}}},"createdAt":{"type":"string","format":"date-time"}}}},"signingChecks":{"type":"array","description":"What the message rules, exact approvals and the server's build of a swap said at its signing points, oldest first (plans W7.2, W7.3, W6.6): empty where none ran","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"point":{"type":"string"},"control":{"type":"string","enum":["message_signing","exact_approvals","swap_server_build"],"description":"message_signing (the message rules), exact_approvals (exact approvals, the residue revoked), swap_server_build (the swap's route built on the server) — each where Aurea enables it for your tenant"},"mode":{"type":"string","enum":["log","enforce"]},"subject":{"type":"string","enum":["personal_sign","eip712","raw","transaction","approval","revoke","swap_route"]},"verdict":{"type":"string","enum":["allowed","would_refuse","refused","unchanged","would_change","changed","failed"],"description":"allowed: a rule allowed it; would_refuse / would_change: what enforce would refuse or change (log); refused / changed: what it did (enforce); failed: a revoke that could not be sent"},"code":{"type":["string","null"],"description":"The refusal's code: MESSAGE_DOMAIN_NOT_ALLOWED, PERSONAL_SIGN_NOT_ALLOWED, RAW_SIGN_NOT_ALLOWED, APPROVAL_SPENDER_NOT_ALLOWED, APPROVAL_AMOUNT_REQUIRED, APPROVAL_RESET_REQUIRED, SWAP_QUOTE_UNKNOWN, SWAP_ROUTER_NOT_ALLOWED"},"rule":{"type":["string","null"],"description":"The rule that allowed it: builtin:<name> (one of Aurea's own rules, by its name), tenant:<rule id>, dapp:<dApp id>"},"details":{"type":"object","additionalProperties":true,"description":"Numbers in the smallest unit, codes and public contract addresses: the token and spender, the amount, the allowance before, the residue after, the reasons"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}}}}},"/v1/operations/{id}/cancel":{"post":{"summary":"Cancel an operation before it is broadcast","tags":["operations"],"description":"Cancels one's own operation while nothing of it was sent: one held for its approvers (its approval request is withdrawn) or one waiting for the client's signature (what the client was handed to sign can no longer be broadcast: its broadcast answers 409 OPERATION_CANCELLED, or PREPARED_TX_CANCELLED for a prepared transaction, and its nonce reservation is released). The operation ends CANCELLED, and its transaction, still waiting for the client's signature, is cancelled too (GET /v1/transactions/{id}: status cancelled). Only the operation's initiator, with the permission that starts it, may cancel it. Cancelling a cancelled operation answers it again.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}}}}},"403":{"description":"Not the operation's initiator, or without the permission that starts it: details.code OPERATION_CANCEL_FORBIDDEN","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"Not the operation's initiator, or without the permission that starts it: details.code OPERATION_CANCEL_FORBIDDEN"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_ALREADY_BROADCAST (handed to its chain or provider, or being replaced), OPERATION_FINAL (ended another way) or OPERATION_IN_PROGRESS (being signed or sent by the call that started it); details.state its state","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_ALREADY_BROADCAST (handed to its chain or provider, or being replaced), OPERATION_FINAL (ended another way) or OPERATION_IN_PROGRESS (being signed or sent by the call that started it); details.state its state"}}}}}}},"/v1/operations/{id}/speed-up":{"post":{"summary":"Speed up an operation's transaction","tags":["operations"],"description":"Replaces one's own operation's broadcast but unmined transaction with the same transaction at the same nonce and a higher fee. The operation goes CONFIRMING `sped_up` and ends with whichever of its transactions is mined. Custodial EVM wallets only (a key the platform holds signs the replacement): a client-side wallet's key is on the user's device, so the server cannot sign its replacement (409 OPERATION_RBF_CLIENT_SIDE); an MPC wallet's is not available (409 OPERATION_RBF_MPC). The fee is at least 12.5% above the replaced transaction's on every field, or the network's current fee when higher, never above the platform's cap (422 GAS_CAP_EXCEEDED when the minimum is above it). Only the operation's initiator, with the permission that starts it. Once one of its transactions is mined, the transaction's own record (GET /v1/transactions/{id}) follows it: confirmed under the mined hash, or cancelled for a mined drop. Available when the platform has replacement by fee switched on (else 403 OPERATIONS_RBF_OFF).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}},"replacement":{"type":"object","properties":{"kind":{"type":"string","enum":["speed_up","drop"]},"txHash":{"type":"string","description":"The replacement's hash"},"replaces":{"type":"string","description":"The hash of the transaction it replaces"},"nonce":{"type":"integer"},"maxFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"maxPriorityFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"gasPrice":{"type":"string","description":"In wei (a legacy transaction)"}}}}}}}},"403":{"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CLIENT_SIDE, OPERATION_RBF_MPC, OPERATION_RBF_NOT_CUSTODIAL, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY or OPERATION_RBF_UNDERPRICED","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CLIENT_SIDE, OPERATION_RBF_MPC, OPERATION_RBF_NOT_CUSTODIAL, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY or OPERATION_RBF_UNDERPRICED"}}}}}}},"/v1/operations/{id}/drop":{"post":{"summary":"Drop an operation's transaction","tags":["operations"],"description":"Replaces one's own operation's broadcast but unmined transaction with a 0-value transaction to the wallet itself at the same nonce and a higher fee. The operation goes CANCELLING `drop_sent`: CANCELLED if the drop is mined, COMPLETED or FAILED if the original is. Custodial EVM wallets only (a key the platform holds signs the replacement): a client-side wallet's key is on the user's device, so the server cannot sign its replacement (409 OPERATION_RBF_CLIENT_SIDE); an MPC wallet's is not available (409 OPERATION_RBF_MPC). The fee is at least 12.5% above the replaced transaction's on every field, or the network's current fee when higher, never above the platform's cap (422 GAS_CAP_EXCEEDED when the minimum is above it). Only the operation's initiator, with the permission that starts it. Once one of its transactions is mined, the transaction's own record (GET /v1/transactions/{id}) follows it: confirmed under the mined hash, or cancelled for a mined drop. Available when the platform has replacement by fee switched on (else 403 OPERATIONS_RBF_OFF).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}},"replacement":{"type":"object","properties":{"kind":{"type":"string","enum":["speed_up","drop"]},"txHash":{"type":"string","description":"The replacement's hash"},"replaces":{"type":"string","description":"The hash of the transaction it replaces"},"nonce":{"type":"integer"},"maxFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"maxPriorityFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"gasPrice":{"type":"string","description":"In wei (a legacy transaction)"}}}}}}}},"403":{"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CLIENT_SIDE, OPERATION_RBF_MPC, OPERATION_RBF_NOT_CUSTODIAL, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY or OPERATION_RBF_UNDERPRICED","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CLIENT_SIDE, OPERATION_RBF_MPC, OPERATION_RBF_NOT_CUSTODIAL, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY or OPERATION_RBF_UNDERPRICED"}}}}}}},"/v1/operations/{id}/prepare-speed-up":{"post":{"summary":"Prepare a speed-up for a client-side or MPC wallet to sign","tags":["operations"],"description":"Prepares, for one's own operation's broadcast but unmined transaction, the same transaction at the same nonce with a higher fee. For a client-side wallet (its key on the device) or an MPC wallet (the MPC ceremony signs): the wallet signs txHashToSign and sends the signature to POST /v1/operations/{id}/broadcast-replacement before expiresAt; nothing is sent until then and the operation stays where it is. A custodial wallet's transaction is replaced with /speed-up or /drop (409 OPERATION_RBF_CUSTODIAL). The fee is at least 12.5% above the replaced transaction's on every field, or the network's current fee when higher, never above the platform's cap (422 GAS_CAP_EXCEEDED); always an EIP-1559 transaction. Only the operation's initiator, with the permission that starts it. Available when the platform has replacement by fee switched on for client-side and MPC wallets (else 403 OPERATIONS_RBF_OFF).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}},"replacement":{"type":"object","properties":{"kind":{"type":"string","enum":["speed_up","drop"]},"replaces":{"type":"string","description":"The hash of the transaction it replaces"},"nonce":{"type":"integer","description":"The replaced transaction's"},"preparedTxId":{"type":"string","format":"uuid","description":"Send the signature with it to /broadcast-replacement"},"txHashToSign":{"type":"string","description":"The digest the wallet signs: its key on the device, or the MPC ceremony"},"to":{"type":"string"},"value":{"type":"string","description":"In wei"},"data":{"type":"string"},"gasLimit":{"type":"string"},"chainId":{"type":"integer"},"maxFeePerGas":{"type":"string","description":"In wei"},"maxPriorityFeePerGas":{"type":"string","description":"In wei"},"expiresAt":{"type":"string","format":"date-time","description":"Sign and send it before then"}}}}}}}},"403":{"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CUSTODIAL, OPERATION_RBF_KEY_IN_TRANSIT, OPERATION_RBF_DEPLOYMENT, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED or OPERATION_RBF_BUSY","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CUSTODIAL, OPERATION_RBF_KEY_IN_TRANSIT, OPERATION_RBF_DEPLOYMENT, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED or OPERATION_RBF_BUSY"}}}}}}},"/v1/operations/{id}/prepare-drop":{"post":{"summary":"Prepare a drop for a client-side or MPC wallet to sign","tags":["operations"],"description":"Prepares, for one's own operation's broadcast but unmined transaction, a 0-value transaction to the wallet itself at the same nonce with a higher fee. For a client-side wallet (its key on the device) or an MPC wallet (the MPC ceremony signs): the wallet signs txHashToSign and sends the signature to POST /v1/operations/{id}/broadcast-replacement before expiresAt; nothing is sent until then and the operation stays where it is. A custodial wallet's transaction is replaced with /speed-up or /drop (409 OPERATION_RBF_CUSTODIAL). The fee is at least 12.5% above the replaced transaction's on every field, or the network's current fee when higher, never above the platform's cap (422 GAS_CAP_EXCEEDED); always an EIP-1559 transaction. Only the operation's initiator, with the permission that starts it. Available when the platform has replacement by fee switched on for client-side and MPC wallets (else 403 OPERATIONS_RBF_OFF).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}},"replacement":{"type":"object","properties":{"kind":{"type":"string","enum":["speed_up","drop"]},"replaces":{"type":"string","description":"The hash of the transaction it replaces"},"nonce":{"type":"integer","description":"The replaced transaction's"},"preparedTxId":{"type":"string","format":"uuid","description":"Send the signature with it to /broadcast-replacement"},"txHashToSign":{"type":"string","description":"The digest the wallet signs: its key on the device, or the MPC ceremony"},"to":{"type":"string"},"value":{"type":"string","description":"In wei"},"data":{"type":"string"},"gasLimit":{"type":"string"},"chainId":{"type":"integer"},"maxFeePerGas":{"type":"string","description":"In wei"},"maxPriorityFeePerGas":{"type":"string","description":"In wei"},"expiresAt":{"type":"string","format":"date-time","description":"Sign and send it before then"}}}}}}}},"403":{"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CUSTODIAL, OPERATION_RBF_KEY_IN_TRANSIT, OPERATION_RBF_DEPLOYMENT, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED or OPERATION_RBF_BUSY","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_NOT_BROADCAST, OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_RBF_NOT_EVM, OPERATION_RBF_CUSTODIAL, OPERATION_RBF_KEY_IN_TRANSIT, OPERATION_RBF_DEPLOYMENT, OPERATION_RBF_NOT_SIGNED_BY_WALLET, OPERATION_TX_UNKNOWN, OPERATION_ALREADY_MINED or OPERATION_RBF_BUSY"}}}}}}},"/v1/operations/{id}/broadcast-replacement":{"post":{"summary":"Send a replacement its wallet signed","tags":["operations"],"description":"Sends the replacement prepared by /prepare-speed-up or /prepare-drop, with the wallet's signature over its txHashToSign (v 0 or 1). The operation goes CONFIRMING `sped_up` or CANCELLING `drop_sent`, and ends with whichever of its transactions is mined, as a custodial replacement. A signature of another key answers 422 WRONG_SIGNER and the preparation can still be used; one already sent 409 PREPARED_TX_ALREADY_USED; past its expiry 410 PREPARED_TX_EXPIRED; a preparation of another operation 404 REPLACEMENT_NOT_FOUND; a transaction of the operation mined meanwhile 409 OPERATION_ALREADY_MINED (nothing sent). Only the operation's initiator, with the permission that starts it.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["preparedTxId","v","r","s"],"properties":{"preparedTxId":{"type":"string","format":"uuid"},"v":{"type":"integer","enum":[0,1,27,28]},"r":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"s":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","SWAP","EARN","PAYOUT","GAS_TOPUP","SWEEP","FX_CONVERSION","FUNDING"],"description":"What the operation does: TRANSFER, CONTRACT_CALL, APPROVE, TYPED_MESSAGE, RAW, DEPLOY, SWAP, EARN (a Lumen supply or withdrawal), PAYOUT (a bank payout order), GAS_TOPUP (the Gas Station's top-up of one of the tenant's wallets, from a funding wallet), FX_CONVERSION (a conversion between two currency balances of a fiat account), FUNDING (a fiat balance topped up from its holder's own bank or card)"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"],"description":"SUBMITTED → PENDING_SCREENING → PENDING_ENRICHMENT → PENDING_POLICY → PENDING_AUTHORIZATION → QUEUED → PENDING_SIGNATURE → SIGNED → BROADCASTING → CONFIRMING → COMPLETED; or CANCELLING, CANCELLED, BLOCKED, REJECTED, FAILED. COMPLETED, CANCELLED, BLOCKED, REJECTED and FAILED are final. A state only moves forward."},"subState":{"type":["string","null"],"description":"Where within its state the operation is. PENDING_SCREENING/not_gated: Passed without a screening that can stop it: none is enforced for its tenant. PENDING_SCREENING/screened: Screened before anything was signed (the screening enforced for its tenant): it went on because nothing matched, or a match was released by the tenant's review. PENDING_SCREENING/under_review: Held for the tenant's compliance review before anything is signed or sent: it goes on if released, and ends REJECTED if not. PENDING_SCREENING/bypassed: Released by the tenant's compliance review: it goes on as the call that started it would have. PENDING_ENRICHMENT/not_gated: Passed without a decoding or a simulation that can stop it: none is enforced for its tenant (where the simulation runs in log, its outcome is recorded with the operation, `simulations`). PENDING_ENRICHMENT/simulated: Decoded and simulated before anything was signed (the simulation enforced for its tenant): it went on because the outcome kept to what was asked. An outcome that diverged, or a transaction that could not be simulated, ended it FAILED (not_sent) with TX_SIMULATION_DIVERGES or TX_NOT_SIMULATED. PENDING_POLICY/not_gated: Passed without a policy that can stop it: no policy is enforced yet. PENDING_POLICY/evaluated: Evaluated by the tenant's policy, which is enforced (an institutional tenant): the verdict decides what follows. PENDING_AUTHORIZATION/not_gated: Passed without an approval: none is asked for yet. PENDING_AUTHORIZATION/not_required: Passed without an approval: the tenant's policy allowed it as it is. PENDING_AUTHORIZATION/awaiting_approval: Held for approval by the tenant's policy (an institutional tenant): nothing is signed or sent until the rule's approvers approve it (GET /v1/operations/{id}/approval). PENDING_AUTHORIZATION/approved: Approved by the rule's threshold of approvers: it goes on as the call that started it would have. PENDING_AUTHORIZATION/awaiting_callback: Held by the tenant's own callback, which answered RETRY (an institutional tenant, where the institution's callback is on): nothing is signed or sent; Aurea asks the callback again until its deadline (48 hours at most) and the operation goes on as the call that started it would have once it approves. QUEUED/not_gated: Passed without a queue of its own: the wallet's nonce is taken as before. PENDING_SIGNATURE/awaiting_client_signature: Handed to the user's device (or MPC) to sign: what it signs comes back with the broadcast. PENDING_SIGNATURE/signing: Signed by Aurea for the wallet it holds the key of. SIGNED/signed_by_client: Signed on the user's side. SIGNED/signed_by_hub: Signed by Aurea. BROADCASTING/sending: Being handed to the chain's node, or to the provider. BROADCASTING/outcome_unknown: Handed over without an answer: it may still go through, and is never sent again by itself. CONFIRMING/awaiting_confirmation: On its way on chain, waiting for its receipt. CONFIRMING/awaiting_provider: Accepted by the provider, which has not settled it yet. CONFIRMING/awaiting_delivery: A swap mined on its source chain, which the router has not delivered yet (a cross-chain or intent swap; followed only where delivery tracking is switched on). CONFIRMING/awaiting_finalization: A Solana transaction the cluster confirmed, waiting to be finalized (followed only where the operations reconciliation runs); its answer and its transaction already say confirmed. CONFIRMING/confirming: Mined, and waiting until its chain has built the platform's confirmations for that chain on it (followed only where the confirmations are switched on). CONFIRMING/reorged: Its block left the chain in a reorganisation: the same signed transaction was handed to the node again, and it waits to be mined again. CONFIRMING/sped_up: Its transaction was replaced by the same one at the same nonce with a higher fee (POST /v1/operations/{id}/speed-up): whichever of them is mined ends it. COMPLETED/confirmed: Mined and successful. COMPLETED/processed: Settled by the provider. COMPLETED/signed: A signature, not a transaction: the message or digest is signed, and nothing is sent on chain. COMPLETED/delivered: A swap the router delivered as quoted. COMPLETED/delivered_other_token: A swap the router delivered in another token than the one quoted (a partial route). CANCELLING/drop_sent: A 0-value transaction to the wallet itself was sent at its transaction's nonce with a higher fee (POST /v1/operations/{id}/drop): CANCELLED if it is mined, COMPLETED or FAILED if the original is. FAILED/not_sent: Refused or failed before anything was signed or sent. FAILED/submission_failed: Sending it failed: the node or the provider refused it, or did not take it. FAILED/reverted: Mined, and reverted. FAILED/never_broadcast: Never signed and sent back within an hour: it can no longer be broadcast. FAILED/provider_rejected: Refused by the provider after it took the order. FAILED/delivery_failed: A swap mined on its source chain that the router reports failed on the way. FAILED/refunded: A swap the router could not deliver and refunded on the source chain. FAILED/approval_expired: Held for approval, and not approved within the approval window: nothing was signed or sent. FAILED/callback_expired: Held for the tenant's callback, which did not approve it before its deadline: nothing was signed or sent. FAILED/dropped: Its block left the chain in a reorganisation, and another transaction of the wallet took its nonce: it can never be mined."},"failureReason":{"type":["string","null"],"description":"With a failing end: the code of the answer that ended it (e.g. RPC_ERROR)"},"legacyStatus":{"type":"string","enum":["pending","confirmed","failed","cancelled"],"description":"The state as the transactions' status says it: pending until the end, then confirmed, failed or cancelled"},"origin":{"type":"string","description":"The call that started it, e.g. transactions.create"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"isTestnet":{"type":["boolean","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"destination":{"type":["string","null"]},"externalTxId":{"type":["string","null"],"description":"The tenant's own id for it, unique for ever"},"idempotencyKey":{"type":["string","null"],"description":"The Idempotency-Key of the call that started it"},"transactionId":{"type":["string","null"],"format":"uuid","description":"The transaction (GET /v1/transactions/{id}) the same calls wrote, if any"},"preparedTxId":{"type":["string","null"],"format":"uuid","description":"What the client was handed to sign, if anything"},"providerRef":{"type":["string","null"],"description":"The provider's own id for it (a payout order)"},"tokenizedOperationId":{"type":["string","null"],"format":"uuid","description":"The tokenized assets operation it carries out (GET /v1/tokenized-assets/operations/{operationId}), if any"},"txHashes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"sourceAccountId":{"type":["string","null"],"format":"uuid","description":"The account of the source wallet (GET /v1/accounts/{id}); null without a wallet"},"events":{"type":"array","description":"Every state it passed, in order","items":{"type":"object","properties":{"seq":{"type":"integer","description":"Its place in the history, from 1"},"state":{"type":"string","enum":["SUBMITTED","PENDING_SCREENING","PENDING_ENRICHMENT","PENDING_POLICY","PENDING_AUTHORIZATION","QUEUED","PENDING_SIGNATURE","SIGNED","BROADCASTING","CONFIRMING","COMPLETED","CANCELLING","CANCELLED","BLOCKED","REJECTED","FAILED"]},"subState":{"type":["string","null"]},"failureReason":{"type":["string","null"]},"txHash":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}}}},"replacement":{"type":"object","properties":{"kind":{"type":"string","enum":["speed_up","drop"]},"txHash":{"type":"string","description":"The replacement's hash"},"replaces":{"type":"string","description":"The hash of the transaction it replaces"},"nonce":{"type":"integer"},"maxFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"maxPriorityFeePerGas":{"type":"string","description":"In wei (an EIP-1559 transaction)"},"gasPrice":{"type":"string","description":"In wei (a legacy transaction)"}}}}}}}},"403":{"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATIONS_RBF_OFF (not available on this platform) or OPERATION_RBF_FORBIDDEN (not the operation's initiator, or without the permission that starts it)"}}}},"404":{"description":"No such operation among those the caller may read","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"No such operation among those the caller may read"}}}},"409":{"description":"details.code OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY, PREPARED_TX_ALREADY_USED or PREPARED_TX_CANCELLED","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}},"description":"details.code OPERATION_FINAL, OPERATION_NOT_REPLACEABLE, OPERATION_DROPPING, OPERATION_ALREADY_MINED, OPERATION_RBF_BUSY, PREPARED_TX_ALREADY_USED or PREPARED_TX_CANCELLED"}}}}}}},"/v1/admin/tenants/{id}/wallets":{"get":{"summary":"Every wallet of a tenant","tags":["wallets"],"description":"The tenant's wallets, newest first, a page at a time: address, network, owner, who holds the key and the balances last read. Never key material. Filters: `kind`, `scheme`, `chain`, `status` (default: every wallet, active and deactivated), `network`, `userId`. `totals` counts every wallet of the tenant whatever the filters; `pagination.total` those the filters match. A tenant's operators read their own tenant; Aurea's operators any tenant.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["custodial","non_custodial","mpc","watch_only"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string","enum":["aes_single","sss_2of2_akv","client_side","client_side_pending","mpc_tss","hsm","frost_ed25519"]},"in":"query","name":"scheme","required":false},{"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,49}$"},"in":"query","name":"chain","required":false},{"schema":{"type":"string","enum":["active","deactivated"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"query","name":"network","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["data","pagination","totals"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","userId","username","displayName","address","chain","isTestnet","label","isPrimary","walletType","scheme","kind","status","deactivatedAt","createdAt","balances"],"properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"username":{"type":["string","null"]},"displayName":{"type":["string","null"]},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean"},"walletType":{"type":["string","null"]},"scheme":{"type":"string","description":"How the wallet's key is kept: `aes_single` and `sss_2of2_akv` by the platform (encrypted, or split with the key vault), `hsm` in a hardware security module, `frost_ed25519` split between the platform's two signing nodes, `mpc_tss` the 2-of-3 MPC, `client_side` on the user's device (`client_side_pending` while it is registered)"},"kind":{"type":"string","enum":["custodial","non_custodial","mpc","watch_only"],"description":"Who holds the key: `custodial` the platform, `non_custodial` the user's device, `mpc` the 2-of-3 MPC, `watch_only` nobody (an address followed without a key)"},"status":{"type":"string","enum":["active","deactivated"]},"deactivatedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"balances":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["tokenSymbol","tokenAddress","balance","formattedBalance","decimals","updatedAt"],"properties":{"tokenSymbol":{"type":["string","null"]},"tokenAddress":{"type":["string","null"],"description":"The token's contract address; null for the chain's native coin"},"balance":{"type":"string","description":"The balance in the token's smallest unit, as last read"},"formattedBalance":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"updatedAt":{"type":"string","format":"date-time","description":"When the balance was last read from the chain"}}},"description":"The balances last read from the chain for this wallet's address (the balance cache); empty when none was read yet. Nothing is read from the chain to answer."}}}},"pagination":{"type":"object","additionalProperties":false,"required":["total","limit","offset","hasMore"],"properties":{"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":0},"offset":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"}}},"totals":{"type":"object","additionalProperties":false,"required":["total","active","deactivated","byKind","mainnet","testnet"],"description":"Every wallet of the tenant counted, whatever the filters","properties":{"total":{"type":"integer","minimum":0},"active":{"type":"integer","minimum":0},"deactivated":{"type":"integer","minimum":0},"byKind":{"type":"object","additionalProperties":false,"required":["custodial","non_custodial","mpc","watch_only"],"properties":{"custodial":{"type":"integer","minimum":0},"non_custodial":{"type":"integer","minimum":0},"mpc":{"type":"integer","minimum":0},"watch_only":{"type":"integer","minimum":0}}},"mainnet":{"type":"integer","minimum":0},"testnet":{"type":"integer","minimum":0}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/members":{"get":{"summary":"A tenant's team","tags":["users"],"description":"The people who work in the tenant's console — every role but the End User — oldest account first, a page at a time, with their two-factor sign-in and passkeys as a state and a count (never a secret). Roles: `tenantadmin` Admin, `owner` Owner, `non_signing_admin` Non-signing Admin, `signer` Signer, `approver` Approver, `editor` Editor, `viewer` Viewer, `auditor` Auditor, `security_admin` Security Admin, `security_auditor` Security Auditor. Filters: `role`, `status` (`active` or `suspended`; deleted accounts are never listed). `invitationsPending`: the invitations waiting to be accepted. A tenant's administrators, auditors and security roles read their own tenant; Aurea's operators any tenant.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"in":"query","name":"role","required":false},{"schema":{"type":"string","enum":["active","suspended"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["data","pagination","invitationsPending"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","username","email","displayName","role","roleTitle","status","createdAt","lastActiveAt","twoFactor","passkeys"],"properties":{"id":{"type":"string","format":"uuid"},"username":{"type":"string"},"email":{"type":["string","null"]},"displayName":{"type":["string","null"]},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"status":{"type":"string","enum":["active","suspended"]},"createdAt":{"type":"string","format":"date-time"},"lastActiveAt":{"type":["string","null"],"format":"date-time","description":"When the member last signed in or refreshed a session; null when never seen since sessions are kept"},"twoFactor":{"type":"object","additionalProperties":false,"required":["enrolled"],"properties":{"enrolled":{"type":"boolean","description":"Whether the member's two-factor sign-in (TOTP) is set up"}}},"passkeys":{"type":"object","additionalProperties":false,"required":["active"],"properties":{"active":{"type":"integer","minimum":0,"description":"The member's passkeys not revoked"}}}}}},"pagination":{"type":"object","additionalProperties":false,"required":["total","limit","offset","hasMore"],"properties":{"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":0},"offset":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"}}},"invitationsPending":{"type":"integer","minimum":0}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/members/security":{"get":{"summary":"A tenant's team: second factor and passkeys, counted","tags":["users"],"description":"The tenant's active members counted per role: how many, how many with two-factor sign-in set up, how many with an active passkey, and the totals. Counts only. A tenant's administrators, auditors and security roles read their own tenant; Aurea's operators any tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["tenantId","generatedAt","members","withTwoFactor","withPasskey","byRole"],"properties":{"tenantId":{"type":"string","format":"uuid"},"generatedAt":{"type":"string","format":"date-time"},"members":{"type":"integer","minimum":0},"withTwoFactor":{"type":"integer","minimum":0},"withPasskey":{"type":"integer","minimum":0},"byRole":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["role","roleTitle","members","withTwoFactor","withPasskey"],"properties":{"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"members":{"type":"integer","minimum":0},"withTwoFactor":{"type":"integer","minimum":0},"withPasskey":{"type":"integer","minimum":0}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/invitations":{"get":{"summary":"A tenant's team invitations","tags":["users"],"description":"The tenant's invitations, newest first, a page at a time; `status` filters (default `pending`; `all` for every one). A tenant's administrators, auditors and security roles read their own tenant; Aurea's operators any tenant. Answers 404 while team invitations are off on the platform.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":1000000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["pending","expired","accepted","revoked","all"],"default":"pending"},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","tenantId","email","role","roleTitle","status","invitedBy","createdAt","expiresAt","sentAt","sendCount","acceptedAt","acceptedUserId","revokedAt"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"email":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"status":{"type":"string","enum":["pending","expired","accepted","revoked"],"description":"`pending` waits for the person, `expired` its link no longer works (send a new one), `accepted` the account was made, `revoked` withdrawn"},"invitedBy":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time","description":"When the email was last handed to the email service"},"sendCount":{"type":"integer","minimum":0},"acceptedAt":{"type":["string","null"],"format":"date-time"},"acceptedUserId":{"type":["string","null"],"format":"uuid"},"revokedAt":{"type":["string","null"],"format":"date-time"}}}},"pagination":{"type":"object","additionalProperties":false,"required":["total","limit","offset","hasMore"],"properties":{"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":0},"offset":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Invite a person to a tenant's team","tags":["users"],"description":"Emails a link with which the person makes their account in the tenant with `role` (one of the tenant's operator roles): once, within the invitation's lifetime. The role must be within the inviter's own, as when creating a user (the Owner only by Aurea's administrators). 409 `INVITATION_EMAIL_IN_USE` (an account has this address), `INVITATION_ALREADY_PENDING` (an invitation waits for it), `INVITATION_TENANT_NOT_ACTIVE`. Where the tenant's quorum holds user creations, the invitation waits for another administrator (202). Answers 404 while team invitations are off on the platform.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["email","role"],"properties":{"email":{"type":"string","format":"email","minLength":3,"maxLength":254},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"locale":{"type":"string","enum":["en","it"],"description":"The email's language (default `en`)"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["invitation","emailSent"],"properties":{"invitation":{"type":"object","additionalProperties":false,"required":["id","tenantId","email","role","roleTitle","status","invitedBy","createdAt","expiresAt","sentAt","sendCount","acceptedAt","acceptedUserId","revokedAt"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"email":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"status":{"type":"string","enum":["pending","expired","accepted","revoked"],"description":"`pending` waits for the person, `expired` its link no longer works (send a new one), `accepted` the account was made, `revoked` withdrawn"},"invitedBy":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time","description":"When the email was last handed to the email service"},"sendCount":{"type":"integer","minimum":0},"acceptedAt":{"type":["string","null"],"format":"date-time"},"acceptedUserId":{"type":["string","null"],"format":"uuid"},"revokedAt":{"type":["string","null"],"format":"date-time"}}},"emailSent":{"type":"boolean","description":"Whether the email service took the email with the link; the link itself is never answered"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/invitations/{invitationId}/resend":{"post":{"summary":"Send a team invitation's link again","tags":["users"],"description":"A new link for an invitation still waiting or expired (the old link stops working), with a new lifetime, emailed again; five emails per invitation at most (409 `INVITATION_RESEND_LIMIT`). 409 `INVITATION_NOT_OPEN` once accepted or withdrawn. Answers 404 while team invitations are off on the platform.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"locale":{"type":"string","enum":["en","it"]}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"invitationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["invitation","emailSent"],"properties":{"invitation":{"type":"object","additionalProperties":false,"required":["id","tenantId","email","role","roleTitle","status","invitedBy","createdAt","expiresAt","sentAt","sendCount","acceptedAt","acceptedUserId","revokedAt"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"email":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"status":{"type":"string","enum":["pending","expired","accepted","revoked"],"description":"`pending` waits for the person, `expired` its link no longer works (send a new one), `accepted` the account was made, `revoked` withdrawn"},"invitedBy":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time","description":"When the email was last handed to the email service"},"sendCount":{"type":"integer","minimum":0},"acceptedAt":{"type":["string","null"],"format":"date-time"},"acceptedUserId":{"type":["string","null"],"format":"uuid"},"revokedAt":{"type":["string","null"],"format":"date-time"}}},"emailSent":{"type":"boolean","description":"Whether the email service took the email with the link; the link itself is never answered"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/invitations/{invitationId}":{"delete":{"summary":"Withdraw a team invitation","tags":["users"],"description":"Its link stops working at once. 409 `INVITATION_NOT_OPEN` once accepted or withdrawn. Answers 404 while team invitations are off on the platform.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"invitationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","tenantId","email","role","roleTitle","status","invitedBy","createdAt","expiresAt","sentAt","sendCount","acceptedAt","acceptedUserId","revokedAt"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"email":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"status":{"type":"string","enum":["pending","expired","accepted","revoked"],"description":"`pending` waits for the person, `expired` its link no longer works (send a new one), `accepted` the account was made, `revoked` withdrawn"},"invitedBy":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time","description":"When the email was last handed to the email service"},"sendCount":{"type":"integer","minimum":0},"acceptedAt":{"type":["string","null"],"format":"date-time"},"acceptedUserId":{"type":["string","null"],"format":"uuid"},"revokedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/invitations/validate":{"post":{"summary":"Read a team invitation from its link","tags":["auth"],"description":"What the link's invitation is — the address, the role, the organisation, until when it works and whether the account's sign-in will ask for a second factor — while it works. 404 `INVITATION_INVALID` (no such link), 410 `INVITATION_EXPIRED`, `INVITATION_REVOKED` or `INVITATION_ACCEPTED`, 403 `INVITATION_TENANT_NOT_ACTIVE`. Answers 404 while team invitations are off on the platform.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["token"],"properties":{"token":{"type":"string","minLength":43,"maxLength":43,"pattern":"^[A-Za-z0-9_-]{43}$","description":"The token of the invitation's link"}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["email","role","roleTitle","tenant","expiresAt","secondFactor"],"properties":{"email":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"roleTitle":{"type":"string"},"tenant":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"expiresAt":{"type":"string","format":"date-time"},"secondFactor":{"type":"object","additionalProperties":false,"required":["mode","required"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"Whether the account's sign-in asks for a second factor: `off` never, `log` once set up, `enforce` always (an account without one cannot sign in)"},"required":{"type":"boolean"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/invitations/accept":{"post":{"summary":"Accept a team invitation","tags":["auth"],"description":"Makes the account — the invited address and role, in the invitation's organisation — with the username and password chosen; the link is used. Then sign in. Where the account's sign-in asks for a second factor, `secondFactor.setup` carries the authenticator's secret (and its otpauth URI) and a `setupToken`: send the authenticator's first code with it to POST /v1/auth/invitations/second-factor within fifteen minutes. 404 `INVITATION_INVALID` (no such link), 410 `INVITATION_EXPIRED`, `INVITATION_REVOKED` or `INVITATION_ACCEPTED`, 403 `INVITATION_TENANT_NOT_ACTIVE`. 409 `USERNAME_ALREADY_EXISTS`, `INVITATION_EMAIL_IN_USE`; 403 `INVITATION_ROLE_NO_LONGER_ALLOWED`. Answers 404 while team invitations are off on the platform.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["token","username","password"],"properties":{"token":{"type":"string","minLength":43,"maxLength":43,"pattern":"^[A-Za-z0-9_-]{43}$","description":"The token of the invitation's link"},"username":{"type":"string","minLength":3,"maxLength":100,"pattern":"^[a-zA-Z0-9_-]+$"},"password":{"type":"string","minLength":8,"maxLength":100}}}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["userId","tenantId","username","role","secondFactor"],"properties":{"userId":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"username":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","owner","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"secondFactor":{"type":"object","additionalProperties":false,"required":["mode","required","setup"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"Whether the account's sign-in asks for a second factor: `off` never, `log` once set up, `enforce` always (an account without one cannot sign in)"},"required":{"type":"boolean"},"setup":{"type":["object","null"],"additionalProperties":false,"required":["setupToken","secret","otpauthUri","expiresAt"],"properties":{"setupToken":{"type":"string"},"secret":{"type":"string","description":"The authenticator's secret (base32), shown once"},"otpauthUri":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/invitations/second-factor":{"post":{"summary":"Set up the second factor of an invited account","tags":["auth"],"description":"The authenticator's first code, with the setup token the acceptance gave: two-factor sign-in is set up and ten recovery codes are answered, once. The setup token works once, within fifteen minutes (401 `INVITATION_SETUP_INVALID`); a wrong code (400 `MFA_CODE_INVALID`) leaves it usable. Answers 404 while team invitations are off on the platform.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["setupToken","code"],"properties":{"setupToken":{"type":"string","minLength":16,"maxLength":2048},"code":{"type":"string","pattern":"^[0-9]{6}$"}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["enrolled","recoveryCodes"],"properties":{"enrolled":{"type":"boolean"},"recoveryCodes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/sessions":{"get":{"summary":"Where you are signed in","tags":["auth"],"description":"Your own active sessions, the most recently active first (at most 100): when each was signed in and last renewed, the device and address that last renewed it, and which one this request belongs to (`current`). A session ends when you sign out, when it is ended here, or when its refresh token expires. `tracked` is false when the platform keeps no server-side sessions: the list is then empty.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["tracked","sessions"],"properties":{"tracked":{"type":"boolean"},"sessions":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","current","startedAt","lastActiveAt","expiresAt","device","ipAddress"],"properties":{"id":{"type":"string","format":"uuid","description":"The session's id (the one to end it with)"},"current":{"type":"boolean","description":"The session this request's access token belongs to"},"startedAt":{"type":"string","format":"date-time","description":"When the session was signed in"},"lastActiveAt":{"type":"string","format":"date-time","description":"When the session last signed in or renewed its tokens"},"expiresAt":{"type":"string","format":"date-time","description":"When the session ends unless it renews its tokens before"},"device":{"type":"object","additionalProperties":false,"required":["userAgent","browser","os","label"],"description":"The device that last renewed the session, as its User-Agent says; null fields when it did not say or the family is not a known one (sessions signed in before this was recorded have none)","properties":{"userAgent":{"type":["string","null"]},"browser":{"type":["string","null"]},"os":{"type":["string","null"]},"label":{"type":["string","null"],"description":"For example \"Safari on iPhone\""}}},"ipAddress":{"type":["string","null"],"description":"The address that last renewed the session"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/sessions/{sessionId}":{"delete":{"summary":"End one of your sessions","tags":["auth"],"description":"Ends one of your own active sessions: its refresh token is refused from now on, and its access token where the platform checks sessions at each request. Ending the current one signs you out. 404 `SESSION_NOT_FOUND`: no active session of yours has this id.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"sessionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"The session is ended"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/auth/sessions/revoke-others":{"post":{"summary":"Sign out everywhere else","tags":["auth"],"description":"Ends every active session of yours but the one this request belongs to, and says how many. 409 `SESSION_NOT_IDENTIFIED`: this request's access token names no session (the platform keeps no server-side sessions), so the others cannot be told apart from it.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["revoked"],"properties":{"revoked":{"type":"integer","minimum":0,"description":"How many sessions were ended"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/insights":{"get":{"summary":"A tenant's counts and volume","tags":["tenants"],"description":"The tenant's users, wallets, operations and volume, each for the last 24 hours, 7 days and 30 days with the period before, for the console's home and the tenant's overview. Read from what is recorded; nothing is read from a chain. The volume: COMPLETED operations of type TRANSFER, PAYOUT or SWAP with an amount above zero, created in the period, on the network asked for; summed per chain and asset in the asset's smallest unit (exact), and valued in EUR at the token registry's CURRENT price (the tenant's token, else the platform catalogue's price for the same symbol) — not the price at the operation's time. An asset the registry cannot price is never valued silently: it is listed with its amount in `unpricedAmount` and `unpricedAssets`, and the period says `partial`. A tenant's operators read their own tenant; Aurea's operators any tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"],"default":"mainnet"},"in":"query","name":"network","required":false,"description":"The network of the operations and the volume"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["tenantId","network","generatedAt","users","wallets","operations","volume"],"properties":{"tenantId":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"generatedAt":{"type":"string","format":"date-time"},"users":{"type":"object","additionalProperties":false,"required":["total","endUsers","members","created"],"description":"The accounts (soft-deleted ones left out; Aurea's own operators are never a tenant's): end users and members (every other role)","properties":{"total":{"type":"integer","minimum":0},"endUsers":{"type":"integer","minimum":0},"members":{"type":"integer","minimum":0},"created":{"type":"object","additionalProperties":false,"required":["last7d","last30d"],"properties":{"last7d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}},"last30d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}}}}}},"wallets":{"type":"object","additionalProperties":false,"required":["active","activeSevenDaysAgo","changePercent7d","created"],"properties":{"active":{"type":"integer","minimum":0,"description":"Not deactivated, now"},"activeSevenDaysAgo":{"type":"integer","minimum":0,"description":"Active seven days ago: created before then and not deactivated by then"},"changePercent7d":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"},"created":{"type":"object","additionalProperties":false,"required":["last7d","last30d"],"properties":{"last7d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}},"last30d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}}}}}},"operations":{"type":"object","additionalProperties":false,"required":["last24h","last7d","last30d"],"description":"The operations created in each period on the network (every type and state; an operation with no network counts as mainnet)","properties":{"last24h":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}},"description":"The last 24 hours, and the 24 hours before"},"last7d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}},"description":"The last 7 days, and the 7 days before"},"last30d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"integer","minimum":0},"previous":{"type":"integer","minimum":0},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}},"description":"The last 30 days, and the 30 days before"}}},"volume":{"type":"object","additionalProperties":false,"required":["currency","valuation","last24h","last7d","last30d","unpricedAssets"],"description":"The volume: COMPLETED operations of type TRANSFER, PAYOUT or SWAP with an amount above zero, created in the period, on the network asked for; summed per chain and asset in the asset's smallest unit (exact), and valued in EUR at the token registry's CURRENT price (the tenant's token, else the platform catalogue's price for the same symbol) — not the price at the operation's time. An asset the registry cannot price is never valued silently: it is listed with its amount in `unpricedAmount` and `unpricedAssets`, and the period says `partial`.","properties":{"currency":{"type":"string","enum":["EUR"]},"valuation":{"type":"string","enum":["current_price"],"description":"The registry's price now, not at each operation's time"},"last24h":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"previous":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}},"last7d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"previous":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}},"last30d":{"type":"object","additionalProperties":false,"required":["current","previous","changePercent"],"properties":{"current":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"previous":{"type":"object","additionalProperties":false,"required":["eur","partial","byAsset"],"properties":{"eur":{"type":"string","description":"Every priced asset's amount in EUR, two decimals"},"partial":{"type":"boolean","description":"True when an asset moved in the period could not be priced: `eur` then leaves it out (see `byAsset[].unpricedAmount`)"},"byAsset":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol","decimals","amount","eur","unpricedAmount"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string","description":"`native`, or the token's address"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"The sum in the asset's smallest unit (exact)"},"eur":{"type":["string","null"],"description":"The priced part in EUR, two decimals; null when none of it could be priced"},"unpricedAmount":{"type":"string","description":"The part (smallest unit) that could not be priced: no token or no price in the registry; \"0\" when all of it was"}}}}}},"changePercent":{"type":["number","null"],"description":"The change from the previous period in percent, one decimal; null when the previous period had none"}}},"unpricedAssets":{"type":"array","description":"The assets with an amount in any period that could not be priced","items":{"type":"object","additionalProperties":false,"required":["chain","chainId","asset","symbol"],"properties":{"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":"string"},"symbol":{"type":["string","null"]}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/search":{"get":{"summary":"Search the tenant","tags":["tenants"],"description":"The tenant's own users, wallets and operations matching a text: an id (any of the three), a wallet address, a transaction hash, an email, or the start of an email or username (case-insensitive). Each kind is searched only for a role that reads it; the others are listed in `omitted`, and asking only for those answers 403 `SEARCH_KIND_FORBIDDEN`. At most `limit` results of each kind, 30 searches a minute; every search is on the audit trail (never its text). A tenant's operators search their own tenant; Aurea's operators any tenant.","parameters":[{"schema":{"type":"string","minLength":3,"maxLength":200},"in":"query","name":"q","required":true,"description":"An id, a wallet address, a transaction hash, an email or the start of an email or username"},{"schema":{"type":"string","pattern":"^(users|wallets|operations)(,(users|wallets|operations))*$"},"in":"query","name":"kinds","required":false,"description":"The kinds of record to search, comma separated (default every kind): users, wallets, operations"},{"schema":{"type":"integer","minimum":1,"maximum":25,"default":10},"in":"query","name":"limit","required":false,"description":"At most this many results of each kind"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["query","searched","omitted","users","wallets","operations"],"properties":{"query":{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"kind":{"type":"string","enum":["id","evm_address","evm_hash","solana_signature","solana_address","email","text"],"description":"What the text was read as: `id`, `evm_address`, `evm_hash`, `solana_signature`, `solana_address`, `email` or `text` (a name)"}}},"searched":{"type":"array","items":{"type":"string","enum":["users","wallets","operations"]},"description":"The kinds searched: those asked for, that the text can find and that your role reads"},"omitted":{"type":"array","items":{"type":"string","enum":["users","wallets","operations"]},"description":"The kinds asked for that your role does not read (users: the tenant's users; wallets: its wallets; operations: its operations): not searched, never an error unless every kind asked for is one"},"users":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","tenantId","tenantName","username","email","role","status"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":["string","null"],"format":"uuid"},"tenantName":{"type":["string","null"],"description":"The tenant's name (null for an account of Aurea's own)"},"username":{"type":"string"},"email":{"type":["string","null"]},"role":{"type":"string"},"status":{"type":"string"}}}},"wallets":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","tenantId","tenantName","userId","username","address","chain","isTestnet","status"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"tenantName":{"type":["string","null"],"description":"The tenant's name (null for an account of Aurea's own)"},"userId":{"type":"string","format":"uuid"},"username":{"type":["string","null"]},"address":{"type":"string"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"status":{"type":"string","enum":["active","deactivated"]}}}},"operations":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","tenantId","tenantName","type","state","chain","txHash","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"tenantName":{"type":["string","null"],"description":"The tenant's name (null for an account of Aurea's own)"},"type":{"type":"string"},"state":{"type":"string"},"chain":{"type":["string","null"]},"txHash":{"type":["string","null"],"description":"The transaction hash that matched (searching by hash), else the operation's first"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/operations/{id}/delivery":{"get":{"summary":"Get a swap's destination leg","tags":["operations"],"description":"What the swap router last said of a swap the platform follows until delivered: its status (PENDING, DONE, FAILED, NOT_FOUND…) and sub-status (COMPLETED, PARTIAL, REFUNDED…), and the receiving side — chain id, transaction, token, amount in the token's smallest unit — once it gives them. Kept only while Aurea has the delivery tracking switched on. A user reads their own operations'; a tenant administrator any of the tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string","format":"uuid"},"sourceChain":{"type":["string","null"]},"sourceTxHash":{"type":"string"},"status":{"type":"string"},"substatus":{"type":["string","null"]},"receiving":{"type":"object","properties":{"chainId":{"type":["integer","null"]},"txHash":{"type":["string","null"]},"token":{"type":"object","properties":{"address":{"type":["string","null"]},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]}}},"amount":{"type":["string","null"]}}},"reads":{"type":"integer"},"firstReadAt":{"type":"string","format":"date-time"},"readAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts":{"get":{"summary":"List accounts","tags":["accounts"],"description":"The tenant's accounts, newest first: those made through these routes, and each user's default account while it holds a wallet (or once written to). The tenant's administrators, on their own tenant.","parameters":[{"schema":{"type":"string"},"in":"query","name":"tag","required":false,"description":"Only accounts with this tag"},{"schema":{"type":"string"},"in":"query","name":"customerRefId","required":false},{"schema":{"type":"boolean"},"in":"query","name":"hidden","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false,"description":"Only the accounts this user owns or may see"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["accounts","nextCursor"],"properties":{"accounts":{"type":"array","items":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Create an account","tags":["accounts"],"description":"An account of the tenant, with its customerRefId (409 ACCOUNT_REF_TAKEN when another account holds it; details.accountId names that one), a name, tags and users (400 ACCOUNT_USER_UNKNOWN for one that is not the tenant's). It holds no wallet yet. The tenant's administrators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"],"minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean","default":false},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts/lookup":{"get":{"summary":"Find the account of an address","tags":["accounts"],"description":"The reverse lookup: the account (and its customerRefId) of each of the tenant's wallets at an address. 400 ACCOUNT_ADDRESS_INVALID for something that is no EVM or Solana address, 404 ACCOUNT_ADDRESS_UNKNOWN when no wallet of the tenant is there. The tenant's administrators, on their own tenant.","parameters":[{"schema":{"type":"string"},"in":"query","name":"address","required":true},{"schema":{"type":"string"},"in":"query","name":"chain","required":false,"description":"Only the wallets serving this chain (a slug, or a testnet's id): for an EVM chain, every wallet of the address on any EVM chain"},{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["address","matches"],"properties":{"address":{"type":"string","description":"As asked"},"matches":{"type":"array","description":"Every wallet of the tenant at the address — one per chain and network it is registered on — with its account. An EVM address is compared case blind, a Solana address exactly; an EVM address is its account's on every EVM chain.","items":{"type":"object","required":["accountId","customerRefId","isDefault","walletId","chain","isTestnet","address"],"properties":{"accountId":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"]},"isDefault":{"type":"boolean"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string","description":"As the wallet stores it"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts/bulk":{"post":{"summary":"Create accounts in bulk","tags":["accounts"],"description":"Up to 10000 accounts, each with its customerRefId, and optionally a wallet on each chain listed for each — every EVM chain listed is the one EVM key, made on chain `evm` — (every account then needs an owner: 400 ACCOUNT_OWNER_REQUIRED). Answered 202 with the job: the accounts are made in batches, one at a time, and an account whose customerRefId already exists is skipped; GET …/accounts/bulk/{jobId} reports each. 503 ACCOUNTS_BULK_OFF while Aurea has the bulk creation switched off. The tenant's administrators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accounts"],"properties":{"accounts":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["customerRefId"],"properties":{"customerRefId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":"string","minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean","default":false},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}},"wallets":{"type":"array","maxItems":20,"items":{"type":"object","required":["chain"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false}}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["jobId","status","total"],"properties":{"jobId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued"]},"total":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List bulk creations","tags":["accounts"],"description":"The tenant's bulk creations, newest first, with their counts. The tenant's administrators, on their own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["jobs","nextCursor"],"properties":{"jobs":{"type":"array","items":{"type":"object","required":["id","status","total","counts","wallets","requestedBy","createdAt","startedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","completed"],"description":"queued: nothing done yet; running: under way; completed: every account created, skipped or failed"},"total":{"type":"integer"},"counts":{"type":"object","required":["pending","created","skipped","failed"],"properties":{"pending":{"type":"integer"},"created":{"type":"integer"},"skipped":{"type":"integer"},"failed":{"type":"integer"}}},"wallets":{"type":"array","items":{"type":"object","required":["chain","isTestnet"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean"}}}},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts/bulk/{jobId}":{"get":{"summary":"Get a bulk creation's report","tags":["accounts"],"description":"The job, its counts, and its accounts in the request's order: created, skipped (its customerRefId already existed) or failed, with the reason. The tenant's administrators, on their own tenant.","parameters":[{"schema":{"type":"string","enum":["pending","created","skipped","failed"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":-1},"in":"query","name":"after","required":false,"description":"The `nextAfter` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"jobId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status","total","counts","wallets","requestedBy","createdAt","startedAt","finishedAt","items","nextAfter"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","completed"],"description":"queued: nothing done yet; running: under way; completed: every account created, skipped or failed"},"total":{"type":"integer"},"counts":{"type":"object","required":["pending","created","skipped","failed"],"properties":{"pending":{"type":"integer"},"created":{"type":"integer"},"skipped":{"type":"integer"},"failed":{"type":"integer"}}},"wallets":{"type":"array","items":{"type":"object","required":["chain","isTestnet"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean"}}}},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"items":{"type":"array","items":{"type":"object","required":["index","customerRefId","status","accountId","reason"],"properties":{"index":{"type":"integer","description":"Its place in the request, from 0"},"customerRefId":{"type":"string"},"status":{"type":"string","enum":["pending","created","skipped","failed"]},"accountId":{"type":["string","null"],"format":"uuid","description":"The account made; skipped: the one that already held the customerRefId"},"reason":{"type":["string","null"],"description":"skipped: ACCOUNT_REF_EXISTS; failed: the code of what refused it (ACCOUNT_USER_UNKNOWN, a wallet path's code such as WALLET_KEY_STORE_UNAVAILABLE, ACCOUNT_WALLET_AMBIGUOUS…)"}}}},"nextAfter":{"type":["integer","null"],"description":"Pass it as `after` for the next items; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts/{accountId}":{"get":{"summary":"Get an account","tags":["accounts"],"description":"An account with its users and wallets. A user's id reads that user's default account. The tenant's administrators, on their own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an account","tags":["accounts"],"description":"Its name, tags, visibility and users (the whole list), and its customerRefId once (409 ACCOUNT_REF_IMMUTABLE to change one that is set). The owner does not change while the account holds wallets (409 ACCOUNT_OWNER_HOLDS_WALLETS); a default account's owner is its user (400 ACCOUNT_DEFAULT_OWNER). Writing to a default account stores it. The tenant's administrators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"customerRefId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"],"minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean"},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/accounts/{accountId}/wallets":{"post":{"summary":"Add a wallet to an account","tags":["accounts"],"description":"An account holds ONE EVM key per network, valid on every EVM chain (the same address on each), and one wallet per network for Solana or any other chain; what it holds already answers 409 ACCOUNT_CHAIN_TAKEN (details.walletId and address). `{ chain, isTestnet, name }` makes it for the account's owner (409 ACCOUNT_OWNER_REQUIRED without one) exactly as POST /v1/wallets makes it for the tenant's wallet mode — any EVM chain asked makes the one EVM key, on chain `evm` — in the custodial mode only: a key on the device or 2-of-3 is made by the user's device (409 ACCOUNT_WALLET_BY_CLIENT), which then puts it in with `{ walletId }`. `{ walletId }` puts one of the owner's wallets that is in no account in it — an EVM wallet with every row of its address on the network (409 ACCOUNT_WALLET_NOT_OWNERS, ACCOUNT_WALLET_IN_ACCOUNT, ACCOUNT_CHAIN_TAKEN for another EVM address). A wallet path's own refusal is answered as that path answers it. The tenant's administrators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["chain"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false},"name":{"type":"string","minLength":1,"maxLength":100}}},{"type":"object","additionalProperties":false,"required":["walletId"],"properties":{"walletId":{"type":"string","format":"uuid"}}}]}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts":{"get":{"summary":"List accounts","tags":["tenants"],"description":"The tenant's accounts, newest first: those made through these routes, and each user's default account while it holds a wallet (or once written to). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string"},"in":"query","name":"tag","required":false,"description":"Only accounts with this tag"},{"schema":{"type":"string"},"in":"query","name":"customerRefId","required":false},{"schema":{"type":"boolean"},"in":"query","name":"hidden","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false,"description":"Only the accounts this user owns or may see"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["accounts","nextCursor"],"properties":{"accounts":{"type":"array","items":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Create an account","tags":["tenants"],"description":"An account of the tenant, with its customerRefId (409 ACCOUNT_REF_TAKEN when another account holds it; details.accountId names that one), a name, tags and users (400 ACCOUNT_USER_UNKNOWN for one that is not the tenant's). It holds no wallet yet. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"],"minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean","default":false},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts/lookup":{"get":{"summary":"Find the account of an address","tags":["tenants"],"description":"The reverse lookup: the account (and its customerRefId) of each of the tenant's wallets at an address. 400 ACCOUNT_ADDRESS_INVALID for something that is no EVM or Solana address, 404 ACCOUNT_ADDRESS_UNKNOWN when no wallet of the tenant is there. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string"},"in":"query","name":"address","required":true},{"schema":{"type":"string"},"in":"query","name":"chain","required":false,"description":"Only the wallets serving this chain (a slug, or a testnet's id): for an EVM chain, every wallet of the address on any EVM chain"},{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["address","matches"],"properties":{"address":{"type":"string","description":"As asked"},"matches":{"type":"array","description":"Every wallet of the tenant at the address — one per chain and network it is registered on — with its account. An EVM address is compared case blind, a Solana address exactly; an EVM address is its account's on every EVM chain.","items":{"type":"object","required":["accountId","customerRefId","isDefault","walletId","chain","isTestnet","address"],"properties":{"accountId":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"]},"isDefault":{"type":"boolean"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"address":{"type":"string","description":"As the wallet stores it"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts/bulk":{"post":{"summary":"Create accounts in bulk","tags":["tenants"],"description":"Up to 10000 accounts, each with its customerRefId, and optionally a wallet on each chain listed for each — every EVM chain listed is the one EVM key, made on chain `evm` — (every account then needs an owner: 400 ACCOUNT_OWNER_REQUIRED). Answered 202 with the job: the accounts are made in batches, one at a time, and an account whose customerRefId already exists is skipped; GET …/accounts/bulk/{jobId} reports each. 503 ACCOUNTS_BULK_OFF while Aurea has the bulk creation switched off. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accounts"],"properties":{"accounts":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["customerRefId"],"properties":{"customerRefId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":"string","minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean","default":false},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}},"wallets":{"type":"array","maxItems":20,"items":{"type":"object","required":["chain"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false}}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["jobId","status","total"],"properties":{"jobId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued"]},"total":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List bulk creations","tags":["tenants"],"description":"The tenant's bulk creations, newest first, with their counts. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["jobs","nextCursor"],"properties":{"jobs":{"type":"array","items":{"type":"object","required":["id","status","total","counts","wallets","requestedBy","createdAt","startedAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","completed"],"description":"queued: nothing done yet; running: under way; completed: every account created, skipped or failed"},"total":{"type":"integer"},"counts":{"type":"object","required":["pending","created","skipped","failed"],"properties":{"pending":{"type":"integer"},"created":{"type":"integer"},"skipped":{"type":"integer"},"failed":{"type":"integer"}}},"wallets":{"type":"array","items":{"type":"object","required":["chain","isTestnet"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean"}}}},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts/bulk/{jobId}":{"get":{"summary":"Get a bulk creation's report","tags":["tenants"],"description":"The job, its counts, and its accounts in the request's order: created, skipped (its customerRefId already existed) or failed, with the reason. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","enum":["pending","created","skipped","failed"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":-1},"in":"query","name":"after","required":false,"description":"The `nextAfter` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"jobId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status","total","counts","wallets","requestedBy","createdAt","startedAt","finishedAt","items","nextAfter"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","completed"],"description":"queued: nothing done yet; running: under way; completed: every account created, skipped or failed"},"total":{"type":"integer"},"counts":{"type":"object","required":["pending","created","skipped","failed"],"properties":{"pending":{"type":"integer"},"created":{"type":"integer"},"skipped":{"type":"integer"},"failed":{"type":"integer"}}},"wallets":{"type":"array","items":{"type":"object","required":["chain","isTestnet"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean"}}}},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"items":{"type":"array","items":{"type":"object","required":["index","customerRefId","status","accountId","reason"],"properties":{"index":{"type":"integer","description":"Its place in the request, from 0"},"customerRefId":{"type":"string"},"status":{"type":"string","enum":["pending","created","skipped","failed"]},"accountId":{"type":["string","null"],"format":"uuid","description":"The account made; skipped: the one that already held the customerRefId"},"reason":{"type":["string","null"],"description":"skipped: ACCOUNT_REF_EXISTS; failed: the code of what refused it (ACCOUNT_USER_UNKNOWN, a wallet path's code such as WALLET_KEY_STORE_UNAVAILABLE, ACCOUNT_WALLET_AMBIGUOUS…)"}}}},"nextAfter":{"type":["integer","null"],"description":"Pass it as `after` for the next items; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts/{accountId}":{"get":{"summary":"Get an account","tags":["tenants"],"description":"An account with its users and wallets. A user's id reads that user's default account. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an account","tags":["tenants"],"description":"Its name, tags, visibility and users (the whole list), and its customerRefId once (409 ACCOUNT_REF_IMMUTABLE to change one that is set). The owner does not change while the account holds wallets (409 ACCOUNT_OWNER_HOLDS_WALLETS); a default account's owner is its user (400 ACCOUNT_DEFAULT_OWNER). Writing to a default account stores it. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"customerRefId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"],"minLength":1,"maxLength":100},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"hidden":{"type":"boolean"},"users":{"type":"array","maxItems":50,"items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}},"description":"The tenant's users the account belongs to or who may see it; each named once, at most one owner."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/accounts/{accountId}/wallets":{"post":{"summary":"Add a wallet to an account","tags":["tenants"],"description":"An account holds ONE EVM key per network, valid on every EVM chain (the same address on each), and one wallet per network for Solana or any other chain; what it holds already answers 409 ACCOUNT_CHAIN_TAKEN (details.walletId and address). `{ chain, isTestnet, name }` makes it for the account's owner (409 ACCOUNT_OWNER_REQUIRED without one) exactly as POST /v1/wallets makes it for the tenant's wallet mode — any EVM chain asked makes the one EVM key, on chain `evm` — in the custodial mode only: a key on the device or 2-of-3 is made by the user's device (409 ACCOUNT_WALLET_BY_CLIENT), which then puts it in with `{ walletId }`. `{ walletId }` puts one of the owner's wallets that is in no account in it — an EVM wallet with every row of its address on the network (409 ACCOUNT_WALLET_NOT_OWNERS, ACCOUNT_WALLET_IN_ACCOUNT, ACCOUNT_CHAIN_TAKEN for another EVM address). A wallet path's own refusal is answered as that path answers it. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["chain"],"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false},"name":{"type":"string","minLength":1,"maxLength":100}}},{"type":"object","additionalProperties":false,"required":["walletId"],"properties":{"walletId":{"type":"string","format":"uuid"}}}]}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","customerRefId","name","tags","hidden","isDefault","frozen","users","wallets","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the customer (1 to 128 characters). Unique in the tenant; once set it never changes."},"name":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"hidden":{"type":"boolean","description":"Hidden from the console's default list; nothing else changes"},"isDefault":{"type":"boolean","description":"A user's default account: its id is the user's, and it holds the user's wallets that are in no other account"},"frozen":{"type":"boolean","description":"Frozen (POST /v1/admin/tenants/{id}/freezes with target `account`): its wallets refuse to sign"},"users":{"type":"array","items":{"type":"object","required":["userId","access"],"properties":{"userId":{"type":"string","format":"uuid"},"access":{"type":"string","enum":["owner","viewer"],"description":"owner: the user whose wallets the account holds (at most one); viewer: a user who may see it."}}}},"wallets":{"type":"array","items":{"type":"object","required":["walletId","chain","family","isTestnet","address","keyManagementScheme","label","isPrimary"],"properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string","description":"The chain the wallet is registered on (gnosis, base, solana…); `evm`: every EVM chain — the key the Hub makes for an account"},"family":{"type":"string","description":"`evm` for an EVM chain: the account's one EVM address, valid on every EVM chain; else the chain itself"},"isTestnet":{"type":"boolean"},"address":{"type":"string"},"keyManagementScheme":{"type":"string","description":"Where its key is: as GET /v1/wallets/{id} answers (a key the Hub holds, the device's, or 2-of-3)"},"label":{"type":["string","null"]},"isPrimary":{"type":"boolean","description":"Its owner's primary wallet on its chain and network"}}},"description":"One per chain family and network. A deactivated wallet is not shown."},"createdBy":{"type":["string","null"],"format":"uuid","description":"Who made it (null: a default account never written to)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/assets":{"get":{"summary":"List assets","tags":["assets"],"description":"The tenant's assets on every chain and network — its own, and the catalogue's on a chain where it lists none (the list its balances read) — with each asset's key, its metadata and the last reading of its contract. The tenant's operators, on their own tenant.","parameters":[{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false,"description":"Only this chain id (which names the network)"},{"schema":{"type":"string"},"in":"query","name":"family","required":false,"description":"evm, solana…"},{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","enum":["tenant","catalogue"]},"in":"query","name":"source","required":false},{"schema":{"type":"string","enum":["native","token"]},"in":"query","name":"type","required":false},{"schema":{"type":"boolean"},"in":"query","name":"active","required":false},{"schema":{"type":"string"},"in":"query","name":"symbol","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assets","total","offset","limit"],"properties":{"assets":{"type":"array","items":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"},"offset":{"type":"integer"},"limit":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Register a custom asset","tags":["assets"],"description":"An EVM token contract added to the tenant's assets by its address: the Hub reads the contract on its chain (code, decimals(), symbol(), name()) through its own node and stores the asset with the contract's decimals — and its symbol and name unless the request names its own. Refused: no contract at the address (422 TOKEN_ADDRESS_NOT_A_CONTRACT), no ERC-20 decimals() (422 ASSET_NOT_ERC20), other decimals than the request names (422 ASSET_DECIMALS_MISMATCH, details.onChain), a wrong EIP-55 checksum (400 TOKEN_ADDRESS_CHECKSUM_INVALID), a chain the Hub does not support (400 ASSET_CHAIN_UNKNOWN) or one that is not EVM (400 ASSET_CHAIN_UNSUPPORTED), the node not answering (503 ASSET_CONTRACT_UNREAD, retryable), an asset the tenant lists already (409 ASSET_EXISTS, details.assetId) or a symbol another asset of the chain holds (409 ASSET_SYMBOL_TAKEN). The asset is then the tenant's as any token: its balances, sends and swaps read it — and, as with any token the tenant adds, on a chain where it listed none of its own the tenant's lists of that chain are its own from then on (the catalogue's are no longer used there: `source` says which). The tenant's operators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["chainId","address"],"properties":{"chainId":{"type":"integer","description":"The EVM chain id (mainnet or testnet)"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"symbol":{"type":"string","minLength":1,"maxLength":20,"description":"The asset's symbol in the tenant's lists; default the contract's"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"Default the contract's"},"decimals":{"type":"integer","minimum":0,"maximum":36,"description":"What the tenant expects: refused when the contract answers other decimals"},"logoUri":{"type":"string","format":"uri"},"coingeckoId":{"type":"string"},"metadata":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"active":{"type":"boolean","default":true}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/assets/chains":{"get":{"summary":"List chains","tags":["assets"],"description":"The chain registry: every chain the Hub knows, with its family, id and network, its native coin, whether Aurea has its own node for it, whether the tenant enabled it, and how many assets the tenant lists on it. The tenant's operators, on their own tenant.","parameters":[{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chains"],"properties":{"chains":{"type":"array","items":{"type":"object","required":["chain","registryId","name","family","chainId","isTestnet","nativeToken","platformNode","enabled","assets"],"properties":{"chain":{"type":"string","description":"The chain as wallets, tokens and balances name it (an EVM testnet: its family's slug)"},"registryId":{"type":"string","description":"The chain registry's own id (celo-sepolia, polygon-amoy…)"},"name":{"type":"string"},"family":{"type":"string"},"chainId":{"type":["integer","null"]},"isTestnet":{"type":"boolean"},"nativeToken":{"type":["object","null"],"required":["symbol","name","decimals"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"platformNode":{"type":"boolean","description":"Whether Aurea has its own node for the chain (what reads a contract, an asset's registration among them)"},"enabled":{"type":"boolean","description":"Whether the tenant enabled the chain"},"assets":{"type":"object","required":["total","active"],"properties":{"total":{"type":"integer"},"active":{"type":"integer"}},"description":"The tenant's own assets on the chain"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/assets/{assetId}":{"get":{"summary":"Read an asset","tags":["assets"],"description":"One of the tenant's assets, or one of the catalogue's. 404 ASSET_NOT_FOUND otherwise (another tenant's too). The tenant's operators, on their own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an asset's metadata","tags":["assets"],"description":"Replaces the tenant's metadata of one of its assets (null clears it). Everything else of an asset is the token routes'. 404 ASSET_NOT_FOUND for an asset that is not the tenant's own (a catalogue one included). The tenant's operators, on their own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["metadata"],"properties":{"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/assets/{assetId}/check":{"post":{"summary":"Check an asset against its contract","tags":["assets"],"description":"Reads the contract of one of the tenant's EVM token assets on its chain again, through Aurea's own node, and keeps what it found on the asset (`contractCheck`): matched, or what differs from the asset — its decimals, its symbol — or no contract at all. The asset is not changed otherwise. 400 ASSET_NATIVE for a native coin, 400 ASSET_CHAIN_UNSUPPORTED off EVM, 503 ASSET_CONTRACT_UNREAD when the node does not answer. The tenant's operators, on their own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["asset","result","contract"],"properties":{"asset":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"contract":{"type":"object","required":["address","hasCode","decimals","symbol","name"],"properties":{"address":{"type":"string"},"hasCode":{"type":"boolean"},"decimals":{"type":["integer","null"]},"symbol":{"type":["string","null"]},"name":{"type":["string","null"]}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/assets":{"get":{"summary":"List assets","tags":["tenants"],"description":"The tenant's assets on every chain and network — its own, and the catalogue's on a chain where it lists none (the list its balances read) — with each asset's key, its metadata and the last reading of its contract. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false,"description":"Only this chain id (which names the network)"},{"schema":{"type":"string"},"in":"query","name":"family","required":false,"description":"evm, solana…"},{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","enum":["tenant","catalogue"]},"in":"query","name":"source","required":false},{"schema":{"type":"string","enum":["native","token"]},"in":"query","name":"type","required":false},{"schema":{"type":"boolean"},"in":"query","name":"active","required":false},{"schema":{"type":"string"},"in":"query","name":"symbol","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assets","total","offset","limit"],"properties":{"assets":{"type":"array","items":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"},"offset":{"type":"integer"},"limit":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Register a custom asset","tags":["tenants"],"description":"An EVM token contract added to the tenant's assets by its address: the Hub reads the contract on its chain (code, decimals(), symbol(), name()) through its own node and stores the asset with the contract's decimals — and its symbol and name unless the request names its own. Refused: no contract at the address (422 TOKEN_ADDRESS_NOT_A_CONTRACT), no ERC-20 decimals() (422 ASSET_NOT_ERC20), other decimals than the request names (422 ASSET_DECIMALS_MISMATCH, details.onChain), a wrong EIP-55 checksum (400 TOKEN_ADDRESS_CHECKSUM_INVALID), a chain the Hub does not support (400 ASSET_CHAIN_UNKNOWN) or one that is not EVM (400 ASSET_CHAIN_UNSUPPORTED), the node not answering (503 ASSET_CONTRACT_UNREAD, retryable), an asset the tenant lists already (409 ASSET_EXISTS, details.assetId) or a symbol another asset of the chain holds (409 ASSET_SYMBOL_TAKEN). The asset is then the tenant's as any token: its balances, sends and swaps read it — and, as with any token the tenant adds, on a chain where it listed none of its own the tenant's lists of that chain are its own from then on (the catalogue's are no longer used there: `source` says which). The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["chainId","address"],"properties":{"chainId":{"type":"integer","description":"The EVM chain id (mainnet or testnet)"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"symbol":{"type":"string","minLength":1,"maxLength":20,"description":"The asset's symbol in the tenant's lists; default the contract's"},"name":{"type":"string","minLength":1,"maxLength":255,"description":"Default the contract's"},"decimals":{"type":"integer","minimum":0,"maximum":36,"description":"What the tenant expects: refused when the contract answers other decimals"},"logoUri":{"type":"string","format":"uri"},"coingeckoId":{"type":"string"},"metadata":{"type":"object","maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"active":{"type":"boolean","default":true}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/assets/chains":{"get":{"summary":"List chains","tags":["tenants"],"description":"The chain registry: every chain the Hub knows, with its family, id and network, its native coin, whether Aurea has its own node for it, whether the tenant enabled it, and how many assets the tenant lists on it. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chains"],"properties":{"chains":{"type":"array","items":{"type":"object","required":["chain","registryId","name","family","chainId","isTestnet","nativeToken","platformNode","enabled","assets"],"properties":{"chain":{"type":"string","description":"The chain as wallets, tokens and balances name it (an EVM testnet: its family's slug)"},"registryId":{"type":"string","description":"The chain registry's own id (celo-sepolia, polygon-amoy…)"},"name":{"type":"string"},"family":{"type":"string"},"chainId":{"type":["integer","null"]},"isTestnet":{"type":"boolean"},"nativeToken":{"type":["object","null"],"required":["symbol","name","decimals"],"properties":{"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"}}},"platformNode":{"type":"boolean","description":"Whether Aurea has its own node for the chain (what reads a contract, an asset's registration among them)"},"enabled":{"type":"boolean","description":"Whether the tenant enabled the chain"},"assets":{"type":"object","required":["total","active"],"properties":{"total":{"type":"integer"},"active":{"type":"integer"}},"description":"The tenant's own assets on the chain"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/assets/{assetId}":{"get":{"summary":"Read an asset","tags":["tenants"],"description":"One of the tenant's assets, or one of the catalogue's. 404 ASSET_NOT_FOUND otherwise (another tenant's too). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an asset's metadata","tags":["tenants"],"description":"Replaces the tenant's metadata of one of its assets (null clears it). Everything else of an asset is the token routes'. 404 ASSET_NOT_FOUND for an asset that is not the tenant's own (a catalogue one included). The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["metadata"],"properties":{"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/assets/{assetId}/check":{"post":{"summary":"Check an asset against its contract","tags":["tenants"],"description":"Reads the contract of one of the tenant's EVM token assets on its chain again, through Aurea's own node, and keeps what it found on the asset (`contractCheck`): matched, or what differs from the asset — its decimals, its symbol — or no contract at all. The asset is not changed otherwise. 400 ASSET_NATIVE for a native coin, 400 ASSET_CHAIN_UNSUPPORTED off EVM, 503 ASSET_CONTRACT_UNREAD when the node does not answer. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"assetId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["asset","result","contract"],"properties":{"asset":{"type":"object","required":["assetId","assetKey","policyAsset","family","chain","chainId","isTestnet","type","address","symbol","name","decimals","logoUri","coingeckoId","isActive","source","registeredVia","metadata","contractCheck","createdAt","updatedAt"],"properties":{"assetId":{"type":"string","format":"uuid"},"assetKey":{"type":["string","null"],"description":"`<family>:<chainId>:<asset>` — `evm` for every EVM chain (else the chain), the chain id (which names the network), and `native` or the token's address in lower case (a Solana mint as it is). One string per asset, whichever route names it: what per-asset settings key on"},"policyAsset":{"type":["string","null"],"description":"The asset as a policy rule's `assets` names it: `<chain>:<address|native>`"},"family":{"type":"string"},"chain":{"type":"string","description":"gnosis, base, solana…"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"type":{"type":"string","enum":["native","token"]},"address":{"type":["string","null"],"description":"The contract or mint; null for a native coin"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"logoUri":{"type":["string","null"]},"coingeckoId":{"type":["string","null"]},"isActive":{"type":"boolean"},"source":{"type":"string","enum":["tenant","catalogue"],"description":"tenant: one of the tenant's own assets; catalogue: the platform catalogue's, which the tenant uses on a chain where it lists none of its own"},"registeredVia":{"type":["string","null"],"description":"registry: registered here by its contract; null: added another way (the token routes, the catalogue)"},"metadata":{"type":["object","null"],"maxProperties":20,"additionalProperties":{"type":"string","minLength":1,"maxLength":200},"description":"The tenant's own metadata of the asset (an ISIN, a desk, an internal code): at most 20 keys of 1 to 40 of a–z 0–9 _ (starting with a letter), each a text of 1 to 200 characters; in all at most 8192 bytes as stored — 8, plus 8 per key, plus every key's and value's UTF-8 bytes (a character outside ASCII counts 2 to 4) — else 400 ASSET_REQUEST_INVALID."},"contractCheck":{"type":["object","null"],"required":["result","checkedAt"],"properties":{"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"checkedAt":{"type":"string","format":"date-time"}},"description":"The last reading of the contract on its chain: matched (code, decimals and symbol as the asset holds them) or what differed; null when never read"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"result":{"type":"string","enum":["matched","decimals_differ","symbol_differs","not_a_contract","not_erc20"]},"contract":{"type":"object","required":["address","hasCode","decimals","symbol","name"],"properties":{"address":{"type":"string"},"hasCode":{"type":"boolean"},"decimals":{"type":["integer","null"]},"symbol":{"type":["string","null"]},"name":{"type":["string","null"]}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures":{"get":{"summary":"List the account structures","tags":["structures"],"description":"The tenant's structure on each network (mainnet, testnet): segregated unless it declared omnibus. On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["structures"],"properties":{"structures":{"type":"array","items":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}":{"get":{"summary":"Read an account structure","tags":["structures"],"description":"The tenant's structure on one network, with its treasury, pool, number of collection accounts and sweep policies. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"put":{"summary":"Declare an account structure","tags":["structures"],"description":"segregated, or omnibus with its treasury account (`treasuryAccountId`, required the first time), its pool (`poolAccountIds`, in order: the whole list; the treasury may be in it), the pool's rule and the tenant's funding addresses. Members are the tenant's own accounts (400 STRUCTURE_ACCOUNT_UNKNOWN), one role each (409 STRUCTURE_ACCOUNT_ROLE). A replaced treasury stays as a pool account; a pool account already in the sub-ledger stays in the pool (409 STRUCTURE_ACCOUNT_OPENED). Back to segregated only with no customer's claim and nothing on its way (409 STRUCTURE_LEDGER_NOT_EMPTY): the omnibus's members and policies of the network are then removed. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["structure"],"properties":{"structure":{"type":"string","enum":["segregated","omnibus"]},"treasuryAccountId":{"type":"string","format":"uuid"},"poolAccountIds":{"type":"array","maxItems":50,"items":{"type":"string","format":"uuid"}},"poolRule":{"type":"string","enum":["priority","largest_balance"]},"fundingAddresses":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}}}}}},"required":true},"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/collection-accounts":{"get":{"summary":"List the collection accounts","tags":["structures"],"description":"The omnibus's collection accounts (one per customer), by account id. On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"after","required":false,"description":"The `nextAfter` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["accounts","nextAfter"],"properties":{"accounts":{"type":"array","items":{"type":"object","required":["accountId","role","poolPosition","addedAt"],"properties":{"accountId":{"type":"string","format":"uuid"},"role":{"type":"string","enum":["collection","treasury","pool"]},"poolPosition":{"type":["integer","null"]},"addedAt":{"type":"string","format":"date-time"}}}},"nextAfter":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add collection accounts","tags":["structures"],"description":"Up to 1000 of the tenant's accounts made collection accounts of the omnibus (409 STRUCTURE_NOT_OMNIBUS on a segregated network); one already in is counted, a treasury or pool account refused (409 STRUCTURE_ACCOUNT_ROLE). Deposits to its wallet are its customer's from the block at which Aurea next opens its sub-ledger. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accountIds"],"properties":{"accountIds":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"string","format":"uuid"}}}}}},"required":true},"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["added","already"],"properties":{"added":{"type":"integer"},"already":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/collection-accounts/{accountId}":{"delete":{"summary":"Remove a collection account","tags":["structures"],"description":"Only with no claim of its customer (409 STRUCTURE_ACCOUNT_HOLDS_CLAIMS) and nothing of it on its way (409 STRUCTURE_ACCOUNT_BUSY). On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/sweep-policies":{"get":{"summary":"List the sweep policies","tags":["structures"],"description":"Per chain and asset: what a sweep moves, leaves behind, how often and when. An asset with a policy is an omnibus asset: its sub-ledger is kept. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["policies"],"properties":{"policies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/sweep-policies/{chainId}/{asset}":{"put":{"summary":"Set a sweep policy","tags":["structures"],"description":"The policy of one asset on one EVM chain of the network (400 STRUCTURE_CHAIN_UNSUPPORTED): the asset must be in the tenant's list of the chain (400 STRUCTURE_ASSET_UNKNOWN) — the list its inbound transfers and balances read. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["minAmount","intervalSeconds"],"properties":{"minAmount":{"type":"string","pattern":"^[0-9]{1,78}$"},"leaveBehind":{"type":"string","pattern":"^[0-9]{1,78}$","default":"0"},"intervalSeconds":{"type":"integer","minimum":60,"maximum":2592000},"window":{"type":["object","null"],"additionalProperties":false,"required":["fromMinute","toMinute"],"properties":{"fromMinute":{"type":"integer","minimum":0,"maximum":1439},"toMinute":{"type":"integer","minimum":0,"maximum":1439}}},"enabled":{"type":"boolean","default":true}}}}},"required":true},"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"integer"},"in":"path","name":"chainId","required":true},{"schema":{"type":"string"},"in":"path","name":"asset","required":true,"description":"`native`, or the token's address in lower case (the asset registry's key form)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove a sweep policy","tags":["structures"],"description":"Only with no customer's claim on the asset and nothing of it on its way (409 STRUCTURE_LEDGER_NOT_EMPTY). On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"integer"},"in":"path","name":"chainId","required":true},{"schema":{"type":"string"},"in":"path","name":"asset","required":true,"description":"`native`, or the token's address in lower case (the asset registry's key form)"}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/ledger":{"get":{"summary":"Read the sub-ledger","tags":["structures"],"description":"Each customer's claim on the omnibus per chain and asset (never negative), and the house's (the tenant's own position: what it put in, less the fees its sweeps and withdrawals paid). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false},{"schema":{"type":"string"},"in":"query","name":"asset","required":false,"description":"`native`, or the token's address in lower case (the asset registry's key form)"},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["claims","house"],"properties":{"claims":{"type":"array","items":{"type":"object","required":["chainId","asset","accountId","balance"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"accountId":{"type":"string","format":"uuid"},"balance":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"}}}},"house":{"type":"array","items":{"type":"object","required":["chainId","asset","balance"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"balance":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/ledger/entries":{"get":{"summary":"List the sub-ledger's entries","tags":["structures"],"description":"Newest first: openings, deposits and their reversals, withdrawals and theirs, the house's deposits and the fees, and the adjustments Aurea's administrators record on the house side to close a shortfall (kind `adjustment`). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false},{"schema":{"type":"string"},"in":"query","name":"asset","required":false,"description":"`native`, or the token's address in lower case (the asset registry's key form)"},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["entries","nextCursor"],"properties":{"entries":{"type":"array","items":{"type":"object","required":["id","chainId","asset","accountId","kind","delta","sourceKind","sourceId","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"accountId":{"type":["string","null"],"format":"uuid","description":"The customer; null: the house"},"kind":{"type":"string","enum":["opening","deposit","deposit_reversal","withdrawal","withdrawal_reversal","house_opening","house_deposit","house_deposit_reversal","fee","adjustment"]},"delta":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"Signed: a credit is positive, a debit negative"},"sourceKind":{"type":"string","enum":["opening","inbound_transfer","omnibus_transfer","adjustment"]},"sourceId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/reconciliation":{"get":{"summary":"Read the reconciliation","tags":["structures"],"description":"Per omnibus asset, the last comparison of every member wallet's balance on chain (at the last block Aurea has read) with the customers' claims and the house: matched, mismatch (DIFFERENCE, HOUSE_NEGATIVE), pending (a transfer on its way), unread (INBOUND_OFF, NOT_OPENED, NO_PLATFORM_NODE, CHAIN_UNREAD). On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assets"],"properties":{"assets":{"type":"array","items":{"type":"object","required":["chainId","asset","status","statusCode","blockNumber","onChain","customers","house","difference","mismatchSince","checkedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"status":{"type":"string","enum":["matched","mismatch","pending","unread"]},"statusCode":{"type":["string","null"]},"blockNumber":{"type":["integer","null"]},"onChain":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"customers":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"house":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"difference":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"mismatchSince":{"type":["string","null"],"format":"date-time"},"checkedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/transfers":{"get":{"summary":"List the omnibus transfers","tags":["structures"],"description":"The sweeps and pool withdrawals, newest first; `accountId` names a customer's or a source account. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["sweep","withdrawal"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transfers","nextCursor"],"properties":{"transfers":{"type":"array","items":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/transfers/{transferId}":{"get":{"summary":"Read an omnibus transfer","tags":["structures"],"description":"One sweep or pool withdrawal (404 STRUCTURE_NOT_FOUND for another tenant's). On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"transferId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/structures/{network}/withdrawals":{"post":{"summary":"Request a pool withdrawal","tags":["structures"],"description":"Debits the customer's claim at once (409 OMNIBUS_INSUFFICIENT_CLAIM, `details.claim`) and queues the payout: Aurea sends it from the pool account the rule picks, through its signing point (the freeze, the address book, the policy), and follows it to its receipt — a payout that fails gives the amount back to the claim. `externalId` is the tenant's own id: the same request again answers the same withdrawal (200), another request under it 409 OMNIBUS_EXTERNAL_ID_TAKEN. 503 OMNIBUS_JOB_OFF while Aurea does not run the omnibus's payouts on this platform. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accountId","chainId","asset","amount","destination","externalId"],"properties":{"accountId":{"type":"string","format":"uuid","description":"The customer's collection account"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^[0-9]{1,78}$"},"destination":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"externalId":{"type":"string","pattern":"^[A-Za-z0-9_.:-]{1,128}$"}}}}},"required":true},"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures":{"get":{"summary":"List the account structures","tags":["tenants"],"description":"The tenant's structure on each network (mainnet, testnet): segregated unless it declared omnibus. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["structures"],"properties":{"structures":{"type":"array","items":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}":{"get":{"summary":"Read an account structure","tags":["tenants"],"description":"The tenant's structure on one network, with its treasury, pool, number of collection accounts and sweep policies. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"put":{"summary":"Declare an account structure","tags":["tenants"],"description":"segregated, or omnibus with its treasury account (`treasuryAccountId`, required the first time), its pool (`poolAccountIds`, in order: the whole list; the treasury may be in it), the pool's rule and the tenant's funding addresses. Members are the tenant's own accounts (400 STRUCTURE_ACCOUNT_UNKNOWN), one role each (409 STRUCTURE_ACCOUNT_ROLE). A replaced treasury stays as a pool account; a pool account already in the sub-ledger stays in the pool (409 STRUCTURE_ACCOUNT_OPENED). Back to segregated only with no customer's claim and nothing on its way (409 STRUCTURE_LEDGER_NOT_EMPTY): the omnibus's members and policies of the network are then removed. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["structure"],"properties":{"structure":{"type":"string","enum":["segregated","omnibus"]},"treasuryAccountId":{"type":"string","format":"uuid"},"poolAccountIds":{"type":"array","maxItems":50,"items":{"type":"string","format":"uuid"}},"poolRule":{"type":"string","enum":["priority","largest_balance"]},"fundingAddresses":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["network","structure","poolRule","fundingAddresses","treasuryAccountId","pool","collectionAccounts","sweepPolicies","jobOn","updatedBy","updatedAt"],"properties":{"network":{"type":"string","enum":["mainnet","testnet"]},"structure":{"type":"string","enum":["segregated","omnibus"],"description":"segregated: one account per customer, nothing moves by itself (every tenant's until it declares otherwise); omnibus: collection accounts per customer, a treasury, a withdrawal pool, sweeps, a sub-ledger"},"poolRule":{"type":"string","enum":["priority","largest_balance"],"description":"Which pool account pays a withdrawal: priority, the first in pool order that can; largest_balance, the one holding most of the asset"},"fundingAddresses":{"type":"array","items":{"type":"string"},"description":"The tenant's own addresses (gas, top-ups): what they send to a collection account is the house's, never the customer's — as is what the Gas Station sends it (a top-up of its gas)"},"treasuryAccountId":{"type":["string","null"],"format":"uuid"},"pool":{"type":"array","items":{"type":"object","required":["accountId","position","isTreasury"],"properties":{"accountId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"isTreasury":{"type":"boolean"}}}},"collectionAccounts":{"type":"integer"},"sweepPolicies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}},"jobOn":{"type":"boolean","description":"Whether Aurea runs the omnibus's sweeps and payouts on this platform: off, nothing is swept and a withdrawal is refused (503 OMNIBUS_JOB_OFF)"},"updatedBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/collection-accounts":{"get":{"summary":"List the collection accounts","tags":["tenants"],"description":"The omnibus's collection accounts (one per customer), by account id. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"after","required":false,"description":"The `nextAfter` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["accounts","nextAfter"],"properties":{"accounts":{"type":"array","items":{"type":"object","required":["accountId","role","poolPosition","addedAt"],"properties":{"accountId":{"type":"string","format":"uuid"},"role":{"type":"string","enum":["collection","treasury","pool"]},"poolPosition":{"type":["integer","null"]},"addedAt":{"type":"string","format":"date-time"}}}},"nextAfter":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add collection accounts","tags":["tenants"],"description":"Up to 1000 of the tenant's accounts made collection accounts of the omnibus (409 STRUCTURE_NOT_OMNIBUS on a segregated network); one already in is counted, a treasury or pool account refused (409 STRUCTURE_ACCOUNT_ROLE). Deposits to its wallet are its customer's from the block at which Aurea next opens its sub-ledger. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accountIds"],"properties":{"accountIds":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"string","format":"uuid"}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["added","already"],"properties":{"added":{"type":"integer"},"already":{"type":"integer"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/collection-accounts/{accountId}":{"delete":{"summary":"Remove a collection account","tags":["tenants"],"description":"Only with no claim of its customer (409 STRUCTURE_ACCOUNT_HOLDS_CLAIMS) and nothing of it on its way (409 STRUCTURE_ACCOUNT_BUSY). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"accountId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/sweep-policies":{"get":{"summary":"List the sweep policies","tags":["tenants"],"description":"Per chain and asset: what a sweep moves, leaves behind, how often and when. An asset with a policy is an omnibus asset: its sub-ledger is kept. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["policies"],"properties":{"policies":{"type":"array","items":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/sweep-policies/{chainId}/{asset}":{"put":{"summary":"Set a sweep policy","tags":["tenants"],"description":"The policy of one asset on one EVM chain of the network (400 STRUCTURE_CHAIN_UNSUPPORTED): the asset must be in the tenant's list of the chain (400 STRUCTURE_ASSET_UNKNOWN) — the list its inbound transfers and balances read. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["minAmount","intervalSeconds"],"properties":{"minAmount":{"type":"string","pattern":"^[0-9]{1,78}$"},"leaveBehind":{"type":"string","pattern":"^[0-9]{1,78}$","default":"0"},"intervalSeconds":{"type":"integer","minimum":60,"maximum":2592000},"window":{"type":["object","null"],"additionalProperties":false,"required":["fromMinute","toMinute"],"properties":{"fromMinute":{"type":"integer","minimum":0,"maximum":1439},"toMinute":{"type":"integer","minimum":0,"maximum":1439}}},"enabled":{"type":"boolean","default":true}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"integer"},"in":"path","name":"chainId","required":true},{"schema":{"type":"string"},"in":"path","name":"asset","required":true,"description":"`native`, or the token's address in lower case (the asset registry's key form)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chainId","asset","symbol","decimals","minAmount","leaveBehind","intervalSeconds","windowFromMinute","windowToMinute","enabled","updatedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"minAmount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"The least a sweep moves (smallest unit)"},"leaveBehind":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"What a sweep leaves in the collection wallet (smallest unit): for the native coin, the gas of the wallet's next token sweeps"},"intervalSeconds":{"type":"integer","description":"The least time between two sweeps of one wallet and asset"},"windowFromMinute":{"type":["integer","null"]},"windowToMinute":{"type":["integer","null"],"description":"The UTC window sweeps run in, minutes of the day [from, to) (from > to wraps past midnight); null: any time"},"enabled":{"type":"boolean","description":"Swept automatically; disabled, the asset's sub-ledger is still kept"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove a sweep policy","tags":["tenants"],"description":"Only with no customer's claim on the asset and nothing of it on its way (409 STRUCTURE_LEDGER_NOT_EMPTY). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"integer"},"in":"path","name":"chainId","required":true},{"schema":{"type":"string"},"in":"path","name":"asset","required":true,"description":"`native`, or the token's address in lower case (the asset registry's key form)"}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/ledger":{"get":{"summary":"Read the sub-ledger","tags":["tenants"],"description":"Each customer's claim on the omnibus per chain and asset (never negative), and the house's (the tenant's own position: what it put in, less the fees its sweeps and withdrawals paid). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false},{"schema":{"type":"string"},"in":"query","name":"asset","required":false,"description":"`native`, or the token's address in lower case (the asset registry's key form)"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["claims","house"],"properties":{"claims":{"type":"array","items":{"type":"object","required":["chainId","asset","accountId","balance"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"accountId":{"type":"string","format":"uuid"},"balance":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"}}}},"house":{"type":"array","items":{"type":"object","required":["chainId","asset","balance"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"balance":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/ledger/entries":{"get":{"summary":"List the sub-ledger's entries","tags":["tenants"],"description":"Newest first: openings, deposits and their reversals, withdrawals and theirs, the house's deposits and the fees, and the adjustments Aurea's administrators record on the house side to close a shortfall (kind `adjustment`). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false},{"schema":{"type":"string"},"in":"query","name":"asset","required":false,"description":"`native`, or the token's address in lower case (the asset registry's key form)"},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["entries","nextCursor"],"properties":{"entries":{"type":"array","items":{"type":"object","required":["id","chainId","asset","accountId","kind","delta","sourceKind","sourceId","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"accountId":{"type":["string","null"],"format":"uuid","description":"The customer; null: the house"},"kind":{"type":"string","enum":["opening","deposit","deposit_reversal","withdrawal","withdrawal_reversal","house_opening","house_deposit","house_deposit_reversal","fee","adjustment"]},"delta":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"Signed: a credit is positive, a debit negative"},"sourceKind":{"type":"string","enum":["opening","inbound_transfer","omnibus_transfer","adjustment"]},"sourceId":{"type":"string","format":"uuid"},"createdAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/reconciliation":{"get":{"summary":"Read the reconciliation","tags":["tenants"],"description":"Per omnibus asset, the last comparison of every member wallet's balance on chain (at the last block Aurea has read) with the customers' claims and the house: matched, mismatch (DIFFERENCE, HOUSE_NEGATIVE), pending (a transfer on its way), unread (INBOUND_OFF, NOT_OPENED, NO_PLATFORM_NODE, CHAIN_UNREAD). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["assets"],"properties":{"assets":{"type":"array","items":{"type":"object","required":["chainId","asset","status","statusCode","blockNumber","onChain","customers","house","difference","mismatchSince","checkedAt"],"properties":{"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"status":{"type":"string","enum":["matched","mismatch","pending","unread"]},"statusCode":{"type":["string","null"]},"blockNumber":{"type":["integer","null"]},"onChain":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"customers":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"house":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"difference":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"mismatchSince":{"type":["string","null"],"format":"date-time"},"checkedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/transfers":{"get":{"summary":"List the omnibus transfers","tags":["tenants"],"description":"The sweeps and pool withdrawals, newest first; `accountId` names a customer's or a source account. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","enum":["sweep","withdrawal"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["transfers","nextCursor"],"properties":{"transfers":{"type":"array","items":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/structures/{network}/transfers/{transferId}":{"get":{"summary":"Read an omnibus transfer","tags":["tenants"],"description":"One sweep or pool withdrawal (404 STRUCTURE_NOT_FOUND for another tenant's). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"path","name":"network","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"transferId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","network","kind","status","reason","chainId","asset","amount","accountId","sourceAccountId","walletId","fromAddress","toAddress","toAccountId","txHash","nonce","blockNumber","fee","operationId","externalId","createdAt","updatedAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"network":{"type":"string","enum":["mainnet","testnet"]},"kind":{"type":"string","enum":["sweep","withdrawal"],"description":"sweep: a collection account to the treasury; withdrawal: a pool account to a destination, debited from a customer"},"status":{"type":"string","enum":["queued","planned","signed","sent","confirmed","failed","skipped"],"description":"queued (a withdrawal waiting for a pool account), planned, signed (kept before the broadcast), sent, confirmed, failed, skipped"},"reason":{"type":["string","null"],"description":"Why it was skipped, failed or waits (SWEEP_NO_GAS, WALLET_NOT_CUSTODIAL, NO_POOL_WALLET, REVERTED, DROPPED, SUPERSEDED, INTERRUPTED, a signing point's refusal code…)"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"`native`, or the token's address in lower case (the asset registry's key form)"},"amount":{"type":"string","pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"accountId":{"type":"string","format":"uuid"},"sourceAccountId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"fromAddress":{"type":["string","null"]},"toAddress":{"type":"string"},"toAccountId":{"type":["string","null"],"format":"uuid"},"txHash":{"type":["string","null"]},"nonce":{"type":["integer","null"]},"blockNumber":{"type":["integer","null"]},"fee":{"type":["string","null"],"pattern":"^-?[0-9]{1,78}$","description":"An amount in the asset's smallest unit, as text"},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}): a sweep is a SWEEP, a withdrawal a TRANSFER"},"externalId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries":{"get":{"summary":"List address book entries","tags":["address-book"],"description":"The tenant's address book, newest first, filtered. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","enum":["internal","external","contract"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string","enum":["evm","solana"]},"in":"query","name":"family","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"query","name":"network","required":false},{"schema":{"type":"string"},"in":"query","name":"chain","required":false},{"schema":{"type":"string"},"in":"query","name":"tag","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string"},"in":"query","name":"address","required":false},{"schema":{"type":"boolean"},"in":"query","name":"proven","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["entries","nextCursor"],"properties":{"entries":{"type":"array","items":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add an address book entry","tags":["address-book"],"description":"A new entry, cooling from its request until `activeAt` (the tenant's cooling period, an institutional tenant's at least 24 hours; active at once with none): there is no approval step, and `approval.approvedBy` is null. An external address the tenant requires to be proven waits in pending_approval for its proof, which starts its cooling. Internal (`walletId`: one of the tenant's wallets, its address resolved), external (`family`, `network`, `address`, an optional `chain`) or contract (`network`, `chain`, `address`: EVM, and the address must hold code on that chain — 422 ADDRESS_BOOK_ADDRESS_NOT_A_CONTRACT, 503 ADDRESS_BOOK_CONTRACT_UNVERIFIED when the platform's node cannot tell). A mixed-case EVM address with a wrong checksum is refused (400 ADDRESS_BOOK_ADDRESS_CHECKSUM_INVALID). 409 ADDRESS_BOOK_ENTRY_EXISTS when a live entry already holds the address. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["kind","label"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["internal","external","contract"]},"label":{"type":"string","minLength":1,"maxLength":100,"description":"What the tenant calls the entry (no leading or trailing space)."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the counterparty."},"accountId":{"type":["string","null"],"format":"uuid","description":"An account of the tenant (plan W2 part A): the entry then serves that account's wallets only."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"],"description":"An EVM chain's slug (ethereum, gnosis, base…): the entry serves that chain only, and a contract's code is checked there. Null (or `evm`): every chain of the family and network. Solana is one chain."},"address":{"type":"string","maxLength":100},"walletId":{"type":"string","format":"uuid"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries/{entryId}":{"get":{"summary":"Read an address book entry","tags":["address-book"],"description":"The entry and its history. On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt","history"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"history":{"type":"array","items":{"type":"object","required":["version","event","fromStatus","toStatus","address","network","chain","actorKind","actorId","actorRole","scope","at"],"properties":{"version":{"type":"integer"},"event":{"type":"string","enum":["requested","address_changed","approved","activated","rejected","removed","proven","changed"]},"fromStatus":{"type":["string","null"],"enum":["pending_approval","cooling","active","rejected","removed",null]},"toStatus":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"]},"address":{"type":"string"},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"actorKind":{"type":"string","enum":["user","system"]},"actorId":{"type":["string","null"],"format":"uuid"},"actorRole":{"type":["string","null"]},"scope":{"type":"string","enum":["tenant","platform","job"]},"at":{"type":"string","format":"date-time"}}},"description":"What happened to the entry, oldest first, with each version's address."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an address book entry","tags":["address-book"],"description":"Its label, tags and customerRefId change at once. A new address (`address`, `network`, `chain`; an internal entry's `walletId`) is the entry's next version, unproven: it cools again from this request (an external address the tenant requires to be proven waits in pending_approval for its proof). A rejected or removed entry never changes (409 ADDRESS_BOOK_ENTRY_FINAL). On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":100,"description":"What the tenant calls the entry (no leading or trailing space)."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the counterparty."},"address":{"type":"string","maxLength":100},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"],"description":"An EVM chain's slug (ethereum, gnosis, base…): the entry serves that chain only, and a contract's code is checked there. Null (or `evm`): every chain of the family and network. Solana is one chain."},"walletId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove an address book entry","tags":["address-book"],"description":"Removed at once, whatever its state (pending, cooling or active): an operation can no longer send to it. Soft: the entry and its history stay; a removed entry never comes back (add a new one). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries/{entryId}/approve":{"post":{"summary":"Approve an address book entry","tags":["address-book"],"description":"There is no approval step: an entry cools from its request. An entry still in pending_approval (asked for while approvals were required, or an external address waiting for the proof its tenant requires) starts its cooling until `activeAt`, by any of the tenant's administrators; where the tenant requires a proof, an external address is proven first (409 ADDRESS_BOOK_PROOF_REQUIRED). A cooling or active entry has nothing to approve: 409 ADDRESS_BOOK_ENTRY_NOT_PENDING (`details.approvalStep`: none). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries/{entryId}/reject":{"post":{"summary":"Reject an address book entry","tags":["address-book"],"description":"pending_approval → rejected (final); cooling → removed (final): the entry is withdrawn before it is active, as DELETE removes it. An active entry is removed with DELETE (409 ADDRESS_BOOK_ENTRY_NOT_PENDING). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries/{entryId}/proof/challenge":{"post":{"summary":"Ask for an ownership challenge","tags":["address-book"],"description":"The message the external address's owner signs to prove they hold it: EIP-191 on EVM, ed25519 on Solana. Valid ten minutes, used once, burnt after five wrong signatures; at most five open per entry (409 ADDRESS_BOOK_CHALLENGE_LIMIT). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["challengeId","entryId","entryVersion","family","network","address","message","issuedAt","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"entryId":{"type":"string","format":"uuid"},"entryVersion":{"type":"integer"},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"address":{"type":"string"},"message":{"type":"string","description":"The exact text the address's key signs: EIP-191 personal_sign on EVM, ed25519 (base58) on Solana."},"issuedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/entries/{entryId}/proof/verify":{"post":{"summary":"Prove an address book entry's owner","tags":["address-book"],"description":"A signature over one of the entry's challenges. Valid: the entry is proven (its proof's method and time), and an entry waiting in pending_approval starts its cooling from its proof. Wrong or unreadable: 400 ADDRESS_BOOK_SIGNATURE_WRONG_SIGNER / ADDRESS_BOOK_SIGNATURE_MALFORMED with `attemptsLeft`, the fifth 409 ADDRESS_BOOK_CHALLENGE_BURNT; expired 410, used 409, issued for an earlier address 409 ADDRESS_BOOK_CHALLENGE_STALE. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["challengeId","signature"],"additionalProperties":false,"properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","maxLength":200}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/settings":{"get":{"summary":"Read the address book's settings","tags":["address-book"],"description":"The cooling period, whether an external address must be proven before its approval, whether one-time addresses are allowed, the change waiting for its approval, and what the tenant's signing points do with the book (`mode`). On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"put":{"summary":"Change the address book's settings","tags":["address-book"],"description":"A change that only raises or keeps the protections applies at once (200). One that lowers one — a shorter cooling period, the proof no longer required, one-time addresses switched on — waits for its approval (202): by someone other than who asked where the tenant's quorum applies. One change waits at a time (409 ADDRESS_BOOK_SETTINGS_PENDING). An institutional tenant's cooling period is at least 24 hours (400 ADDRESS_BOOK_COOLING_TOO_SHORT). On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"coolingPeriodSeconds":{"type":"integer","minimum":0,"maximum":2592000},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/settings/changes":{"get":{"summary":"List the settings' changes","tags":["address-book"],"description":"Every change asked for, newest first. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["changes"],"properties":{"changes":{"type":"array","items":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/settings/changes/{changeId}/approve":{"post":{"summary":"Approve a settings change","tags":["address-book"],"description":"The waiting change applied, by whom the tenant's quorum allows (403 ADDRESS_BOOK_QUORUM_REQUESTER). On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"changeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/address-book/settings/changes/{changeId}/reject":{"post":{"summary":"Reject a settings change","tags":["address-book"],"description":"The waiting change refused; withdrawn when who asked rejects it. On the caller's own tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"changeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries":{"get":{"summary":"List address book entries","tags":["tenants"],"description":"The tenant's address book, newest first, filtered. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","enum":["internal","external","contract"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string","enum":["evm","solana"]},"in":"query","name":"family","required":false},{"schema":{"type":"string","enum":["mainnet","testnet"]},"in":"query","name":"network","required":false},{"schema":{"type":"string"},"in":"query","name":"chain","required":false},{"schema":{"type":"string"},"in":"query","name":"tag","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string"},"in":"query","name":"address","required":false},{"schema":{"type":"boolean"},"in":"query","name":"proven","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["entries","nextCursor"],"properties":{"entries":{"type":"array","items":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add an address book entry","tags":["tenants"],"description":"A new entry, cooling from its request until `activeAt` (the tenant's cooling period, an institutional tenant's at least 24 hours; active at once with none): there is no approval step, and `approval.approvedBy` is null. An external address the tenant requires to be proven waits in pending_approval for its proof, which starts its cooling. Internal (`walletId`: one of the tenant's wallets, its address resolved), external (`family`, `network`, `address`, an optional `chain`) or contract (`network`, `chain`, `address`: EVM, and the address must hold code on that chain — 422 ADDRESS_BOOK_ADDRESS_NOT_A_CONTRACT, 503 ADDRESS_BOOK_CONTRACT_UNVERIFIED when the platform's node cannot tell). A mixed-case EVM address with a wrong checksum is refused (400 ADDRESS_BOOK_ADDRESS_CHECKSUM_INVALID). 409 ADDRESS_BOOK_ENTRY_EXISTS when a live entry already holds the address. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["kind","label"],"additionalProperties":false,"properties":{"kind":{"type":"string","enum":["internal","external","contract"]},"label":{"type":"string","minLength":1,"maxLength":100,"description":"What the tenant calls the entry (no leading or trailing space)."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the counterparty."},"accountId":{"type":["string","null"],"format":"uuid","description":"An account of the tenant (plan W2 part A): the entry then serves that account's wallets only."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"],"description":"An EVM chain's slug (ethereum, gnosis, base…): the entry serves that chain only, and a contract's code is checked there. Null (or `evm`): every chain of the family and network. Solana is one chain."},"address":{"type":"string","maxLength":100},"walletId":{"type":"string","format":"uuid"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries/{entryId}":{"get":{"summary":"Read an address book entry","tags":["tenants"],"description":"The entry and its history. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt","history"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"history":{"type":"array","items":{"type":"object","required":["version","event","fromStatus","toStatus","address","network","chain","actorKind","actorId","actorRole","scope","at"],"properties":{"version":{"type":"integer"},"event":{"type":"string","enum":["requested","address_changed","approved","activated","rejected","removed","proven","changed"]},"fromStatus":{"type":["string","null"],"enum":["pending_approval","cooling","active","rejected","removed",null]},"toStatus":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"]},"address":{"type":"string"},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"actorKind":{"type":"string","enum":["user","system"]},"actorId":{"type":["string","null"],"format":"uuid"},"actorRole":{"type":["string","null"]},"scope":{"type":"string","enum":["tenant","platform","job"]},"at":{"type":"string","format":"date-time"}}},"description":"What happened to the entry, oldest first, with each version's address."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Change an address book entry","tags":["tenants"],"description":"Its label, tags and customerRefId change at once. A new address (`address`, `network`, `chain`; an internal entry's `walletId`) is the entry's next version, unproven: it cools again from this request (an external address the tenant requires to be proven waits in pending_approval for its proof). A rejected or removed entry never changes (409 ADDRESS_BOOK_ENTRY_FINAL). The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":100,"description":"What the tenant calls the entry (no leading or trailing space)."},"tags":{"type":"array","maxItems":20,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]{0,49}$"},"description":"At most 20, each named once."},"customerRefId":{"type":["string","null"],"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:@/+-]{0,127}$","description":"The tenant's own reference for the counterparty."},"address":{"type":"string","maxLength":100},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"],"description":"An EVM chain's slug (ethereum, gnosis, base…): the entry serves that chain only, and a contract's code is checked there. Null (or `evm`): every chain of the family and network. Solana is one chain."},"walletId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Remove an address book entry","tags":["tenants"],"description":"Removed at once, whatever its state (pending, cooling or active): an operation can no longer send to it. Soft: the entry and its history stay; a removed entry never comes back (add a new one). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries/{entryId}/approve":{"post":{"summary":"Approve an address book entry","tags":["tenants"],"description":"There is no approval step: an entry cools from its request. An entry still in pending_approval (asked for while approvals were required, or an external address waiting for the proof its tenant requires) starts its cooling until `activeAt`, by any of the tenant's administrators; where the tenant requires a proof, an external address is proven first (409 ADDRESS_BOOK_PROOF_REQUIRED). A cooling or active entry has nothing to approve: 409 ADDRESS_BOOK_ENTRY_NOT_PENDING (`details.approvalStep`: none). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries/{entryId}/reject":{"post":{"summary":"Reject an address book entry","tags":["tenants"],"description":"pending_approval → rejected (final); cooling → removed (final): the entry is withdrawn before it is active, as DELETE removes it. An active entry is removed with DELETE (409 ADDRESS_BOOK_ENTRY_NOT_PENDING). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries/{entryId}/proof/challenge":{"post":{"summary":"Ask for an ownership challenge","tags":["tenants"],"description":"The message the external address's owner signs to prove they hold it: EIP-191 on EVM, ed25519 on Solana. Valid ten minutes, used once, burnt after five wrong signatures; at most five open per entry (409 ADDRESS_BOOK_CHALLENGE_LIMIT). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["challengeId","entryId","entryVersion","family","network","address","message","issuedAt","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"entryId":{"type":"string","format":"uuid"},"entryVersion":{"type":"integer"},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"address":{"type":"string"},"message":{"type":"string","description":"The exact text the address's key signs: EIP-191 personal_sign on EVM, ed25519 (base58) on Solana."},"issuedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/entries/{entryId}/proof/verify":{"post":{"summary":"Prove an address book entry's owner","tags":["tenants"],"description":"A signature over one of the entry's challenges. Valid: the entry is proven (its proof's method and time), and an entry waiting in pending_approval starts its cooling from its proof. Wrong or unreadable: 400 ADDRESS_BOOK_SIGNATURE_WRONG_SIGNER / ADDRESS_BOOK_SIGNATURE_MALFORMED with `attemptsLeft`, the fifth 409 ADDRESS_BOOK_CHALLENGE_BURNT; expired 410, used 409, issued for an earlier address 409 ADDRESS_BOOK_CHALLENGE_STALE. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["challengeId","signature"],"additionalProperties":false,"properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","maxLength":200}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"entryId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","accountId","kind","family","network","chain","chainId","address","walletId","label","tags","customerRefId","status","version","requestedBy","requestedScope","requestedAt","approval","coolingPeriodSeconds","activeAt","coolingSecondsLeft","proof","rejectedBy","rejectedAt","removedBy","removedAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account whose wallets the entry serves (plan W2 part A); null: the tenant's every wallet."},"kind":{"type":"string","enum":["internal","external","contract"],"description":"internal: one of the tenant's own wallets (resolved from it); external: someone else's address; contract: a contract the tenant calls."},"family":{"type":"string","enum":["evm","solana"]},"network":{"type":"string","enum":["mainnet","testnet"]},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"],"description":"A contract's chain id (where its code was checked)."},"address":{"type":"string","description":"EIP-55 on EVM; Solana base58 exactly."},"walletId":{"type":["string","null"],"format":"uuid","description":"An internal entry's wallet."},"label":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customerRefId":{"type":["string","null"]},"status":{"type":"string","enum":["pending_approval","cooling","active","rejected","removed"],"description":"pending_approval → (approved) cooling → (its cooling period ended) active; rejected and removed are final. An operation may send to an entry only once it is active."},"version":{"type":"integer","description":"Moves when the address changes (the entry then waits for a new approval)."},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"requestedAt":{"type":"string","format":"date-time"},"approval":{"type":["object","null"],"required":["approvedBy","approvedScope","approvedAt","requiredApprovals"],"properties":{"approvedBy":{"type":["string","null"],"format":"uuid"},"approvedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"approvedAt":{"type":"string","format":"date-time"},"requiredApprovals":{"type":"integer","description":"1: the quorum asked for someone other than who asked (an institutional tenant, or two administrators or more)."}}},"coolingPeriodSeconds":{"type":["integer","null"]},"activeAt":{"type":["string","null"],"format":"date-time","description":"When the cooling period ends: the entry is active from then."},"coolingSecondsLeft":{"type":["integer","null"],"description":"While it cools, the seconds left; null otherwise."},"proof":{"type":"object","required":["proven","method","provenAt"],"properties":{"proven":{"type":"boolean"},"method":{"type":["string","null"],"enum":["eip191","solana_ed25519",null]},"provenAt":{"type":["string","null"],"format":"date-time"}}},"rejectedBy":{"type":["string","null"],"format":"uuid"},"rejectedAt":{"type":["string","null"],"format":"date-time"},"removedBy":{"type":["string","null"],"format":"uuid"},"removedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/settings":{"get":{"summary":"Read the address book's settings","tags":["tenants"],"description":"The cooling period, whether an external address must be proven before its approval, whether one-time addresses are allowed, the change waiting for its approval, and what the tenant's signing points do with the book (`mode`). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"put":{"summary":"Change the address book's settings","tags":["tenants"],"description":"A change that only raises or keeps the protections applies at once (200). One that lowers one — a shorter cooling period, the proof no longer required, one-time addresses switched on — waits for its approval (202): by someone other than who asked where the tenant's quorum applies. One change waits at a time (409 ADDRESS_BOOK_SETTINGS_PENDING). An institutional tenant's cooling period is at least 24 hours (400 ADDRESS_BOOK_COOLING_TOO_SHORT). The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"coolingPeriodSeconds":{"type":"integer","minimum":0,"maximum":2592000},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/settings/changes":{"get":{"summary":"List the settings' changes","tags":["tenants"],"description":"Every change asked for, newest first. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["changes"],"properties":{"changes":{"type":"array","items":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/settings/changes/{changeId}/approve":{"post":{"summary":"Approve a settings change","tags":["tenants"],"description":"The waiting change applied, by whom the tenant's quorum allows (403 ADDRESS_BOOK_QUORUM_REQUESTER). The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"changeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/address-book/settings/changes/{changeId}/reject":{"post":{"summary":"Reject a settings change","tags":["tenants"],"description":"The waiting change refused; withdrawn when who asked rejects it. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"changeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["state","settings","change"],"properties":{"state":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"settings":{"type":"object","required":["mode","enforced","settings","effectiveCoolingPeriodSeconds","pendingChange"],"properties":{"mode":{"type":"string","enum":["off","log","enforce"],"description":"What the tenant's signing points do: off (nothing), log (every destination outside the book recorded, nothing refused), enforce (refused: 403 ADDRESS_BOOK_DESTINATION_NOT_ALLOWED). Set by Aurea, tenant by tenant: log first, enforce after clean log days."},"enforced":{"type":"boolean","description":"Aurea switched the tenant to refuse a destination outside its book (effective once it is in log)."},"settings":{"type":"object","required":["coolingPeriodSeconds","proofRequired","oneTimeAddresses"],"properties":{"coolingPeriodSeconds":{"type":"integer"},"proofRequired":{"type":"boolean"},"oneTimeAddresses":{"type":"boolean"}}},"effectiveCoolingPeriodSeconds":{"type":"integer","description":"The cooling period an approval starts now (an institutional tenant's is at least 24 hours)."},"pendingChange":{"type":["object","null"],"required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}},"change":{"type":"object","required":["id","coolingPeriodSeconds","proofRequired","oneTimeAddresses","lowers","status","requiredApprovals","requestedBy","requestedScope","createdAt","decidedBy","decidedScope","decidedAt"],"properties":{"id":{"type":"string","format":"uuid"},"coolingPeriodSeconds":{"type":["integer","null"]},"proofRequired":{"type":["boolean","null"]},"oneTimeAddresses":{"type":["boolean","null"]},"lowers":{"type":"boolean","description":"It lowers a protection (a shorter cooling period, no proof, one-time addresses on): it waits for an approval."},"status":{"type":"string","enum":["pending","applied","rejected","withdrawn"]},"requiredApprovals":{"type":"integer"},"requestedBy":{"type":["string","null"],"format":"uuid"},"requestedScope":{"type":"string","enum":["tenant","platform"]},"createdAt":{"type":"string","format":"date-time"},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/identity/verifications":{"post":{"summary":"Start or continue a user's identity verification","tags":["identity"],"description":"Verifies one of the tenant's users: a person (`kind: person`, KYC) or a company (`kind: company`, KYB), for a purpose (`bank_ramp`). 201 with a new verification, 200 with the live one (started, in review or verified: never a second one); a rejected or expired verification is replaced by a new one. While it is `started` the answer carries a fresh `verificationUrl`. `returnUrl` (https or the app's own scheme) is accepted and checked, but the hosted page does not use it: when the person is done the page shows the verification flow's own completion page, and the result reaches the tenant as `identity.verification.updated`. Every change is sent as `identity.verification.updated`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId","kind","purpose"],"additionalProperties":false,"properties":{"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","enum":["bank_ramp"]},"returnUrl":{"type":["string","null"],"maxLength":2048,"description":"https or the app's own scheme. Accepted and checked; not passed to the hosted page, which ends on the flow's own completion page."},"isTestnet":{"type":"boolean","default":false}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","userId","kind","purpose","state","nextStep","reason","aml","createdAt","updatedAt","verificationUrl"],"properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","enum":["bank_ramp"]},"state":{"type":"string","enum":["started","in_review","verified","rejected","expired"],"description":"started: the person or company has the verification page to complete; in_review: the provider (or Aurea's compliance) reviews it; verified; rejected; expired (a re-verification is due)."},"nextStep":{"type":"string","enum":["start_verification","continue_verification","wait_for_review","approved","rejected","expired"],"description":"continue_verification (started), wait_for_review (in_review), approved (verified), rejected, expired; start_verification when there is nothing to continue."},"reason":{"type":["string","null"],"description":"Why the state is what it is, as a code (manual_review, aml_review, kyb_review, reopened, risk_reevaluated, kyc_expired, failed, rejected, cancelled, kyb_rejected, kyb_cancelled, or the decision's reason code); null when none."},"aml":{"type":["object","null"],"required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","ESCALATED"]}},"description":"The screening's status; null until a screening has a result."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"verificationUrl":{"type":["string","null"],"description":"The verification page, while the verification is started: open it in a browser or a WebView (camera and microphone allowed). A fresh one each call; never stored. null when there is nothing to complete."}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","userId","kind","purpose","state","nextStep","reason","aml","createdAt","updatedAt","verificationUrl"],"properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","enum":["bank_ramp"]},"state":{"type":"string","enum":["started","in_review","verified","rejected","expired"],"description":"started: the person or company has the verification page to complete; in_review: the provider (or Aurea's compliance) reviews it; verified; rejected; expired (a re-verification is due)."},"nextStep":{"type":"string","enum":["start_verification","continue_verification","wait_for_review","approved","rejected","expired"],"description":"continue_verification (started), wait_for_review (in_review), approved (verified), rejected, expired; start_verification when there is nothing to continue."},"reason":{"type":["string","null"],"description":"Why the state is what it is, as a code (manual_review, aml_review, kyb_review, reopened, risk_reevaluated, kyc_expired, failed, rejected, cancelled, kyb_rejected, kyb_cancelled, or the decision's reason code); null when none."},"aml":{"type":["object","null"],"required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","ESCALATED"]}},"description":"The screening's status; null until a screening has a result."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"verificationUrl":{"type":["string","null"],"description":"The verification page, while the verification is started: open it in a browser or a WebView (camera and microphone allowed). A fresh one each call; never stored. null when there is nothing to complete."}}}}}},"400":{"description":"The body is not valid (`IDENTITY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid (`IDENTITY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"A missing, wrong, expired or replayed signature","content":{"application/json":{"schema":{"type":"object","description":"A missing, wrong, expired or replayed signature","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Identity verification is not on for the tenant's environment (`IDENTITY_DISABLED`), or the module is off (`MODULE_NOT_ENABLED`)","content":{"application/json":{"schema":{"type":"object","description":"Identity verification is not on for the tenant's environment (`IDENTITY_DISABLED`), or the module is off (`MODULE_NOT_ENABLED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such user in the tenant (`IDENTITY_SUBJECT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such user in the tenant (`IDENTITY_SUBJECT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The verification page could not be opened for this run (`IDENTITY_SESSION_CONFLICT`)","content":{"application/json":{"schema":{"type":"object","description":"The verification page could not be opened for this run (`IDENTITY_SESSION_CONFLICT`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"502":{"description":"The verification provider refused the request (`IDENTITY_PROVIDER_REFUSED`)","content":{"application/json":{"schema":{"type":"object","description":"The verification provider refused the request (`IDENTITY_PROVIDER_REFUSED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Identity verification is not configured or not available (`IDENTITY_NOT_CONFIGURED`, `IDENTITY_PROVIDER_UNAVAILABLE`)","content":{"application/json":{"schema":{"type":"object","description":"Identity verification is not configured or not available (`IDENTITY_NOT_CONFIGURED`, `IDENTITY_PROVIDER_UNAVAILABLE`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/identity/verifications/{id}":{"get":{"summary":"A user's identity verification","tags":["identity"],"description":"The verification's state and what the user does next. Its environment is the one it was started in.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","userId","kind","purpose","state","nextStep","reason","aml","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","enum":["bank_ramp"]},"state":{"type":"string","enum":["started","in_review","verified","rejected","expired"],"description":"started: the person or company has the verification page to complete; in_review: the provider (or Aurea's compliance) reviews it; verified; rejected; expired (a re-verification is due)."},"nextStep":{"type":"string","enum":["start_verification","continue_verification","wait_for_review","approved","rejected","expired"],"description":"continue_verification (started), wait_for_review (in_review), approved (verified), rejected, expired; start_verification when there is nothing to continue."},"reason":{"type":["string","null"],"description":"Why the state is what it is, as a code (manual_review, aml_review, kyb_review, reopened, risk_reevaluated, kyc_expired, failed, rejected, cancelled, kyb_rejected, kyb_cancelled, or the decision's reason code); null when none."},"aml":{"type":["object","null"],"required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","ESCALATED"]}},"description":"The screening's status; null until a screening has a result."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The id is not valid (`IDENTITY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The id is not valid (`IDENTITY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"A missing, wrong, expired or replayed signature","content":{"application/json":{"schema":{"type":"object","description":"A missing, wrong, expired or replayed signature","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The module is off (`MODULE_NOT_ENABLED`)","content":{"application/json":{"schema":{"type":"object","description":"The module is off (`MODULE_NOT_ENABLED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such verification in the tenant (`IDENTITY_VERIFICATION_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such verification in the tenant (`IDENTITY_VERIFICATION_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/identity/subjects/{userId}/verifications":{"get":{"summary":"A user's identity verifications","tags":["identity"],"description":"Every verification of the user in the environment, newest first; a replaced one stays listed after the one that replaced it.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["verifications"],"properties":{"verifications":{"type":"array","items":{"type":"object","required":["id","userId","kind","purpose","state","nextStep","reason","aml","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["person","company"]},"purpose":{"type":"string","enum":["bank_ramp"]},"state":{"type":"string","enum":["started","in_review","verified","rejected","expired"],"description":"started: the person or company has the verification page to complete; in_review: the provider (or Aurea's compliance) reviews it; verified; rejected; expired (a re-verification is due)."},"nextStep":{"type":"string","enum":["start_verification","continue_verification","wait_for_review","approved","rejected","expired"],"description":"continue_verification (started), wait_for_review (in_review), approved (verified), rejected, expired; start_verification when there is nothing to continue."},"reason":{"type":["string","null"],"description":"Why the state is what it is, as a code (manual_review, aml_review, kyb_review, reopened, risk_reevaluated, kyc_expired, failed, rejected, cancelled, kyb_rejected, kyb_cancelled, or the decision's reason code); null when none."},"aml":{"type":["object","null"],"required":["status"],"properties":{"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","ESCALATED"]}},"description":"The screening's status; null until a screening has a result."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"The query is not valid (`IDENTITY_INVALID`)","content":{"application/json":{"schema":{"type":"object","description":"The query is not valid (`IDENTITY_INVALID`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"A missing, wrong, expired or replayed signature","content":{"application/json":{"schema":{"type":"object","description":"A missing, wrong, expired or replayed signature","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The module is off (`MODULE_NOT_ENABLED`)","content":{"application/json":{"schema":{"type":"object","description":"The module is off (`MODULE_NOT_ENABLED`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No such user in the tenant (`IDENTITY_SUBJECT_NOT_FOUND`)","content":{"application/json":{"schema":{"type":"object","description":"No such user in the tenant (`IDENTITY_SUBJECT_NOT_FOUND`)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/aml-cases":{"get":{"summary":"List AML cases","tags":["aml-cases"],"description":"The cases, newest first. On the caller's own tenant. A case opened at onboarding (direction onboarding) is read here and decided by Aurea: a write on it answers 403 AML_CASE_AUREA_DECIDES.","parameters":[{"schema":{"type":"string","enum":["open","released","confirmed"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"assigneeId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/aml-cases/{caseId}":{"get":{"summary":"Read an AML case","tags":["aml-cases"],"description":"The case, its screening and its comments. On the caller's own tenant. A case opened at onboarding (direction onboarding) is read here and decided by Aurea: a write on it answers 403 AML_CASE_AUREA_DECIDES.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt","comments"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"comments":{"type":"array","items":{"type":"object","required":["id","authorId","authorRole","authorScope","body","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"authorId":{"type":["string","null"],"format":"uuid"},"authorRole":{"type":"string"},"authorScope":{"type":"string","enum":["tenant","platform"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/aml-cases/{caseId}/assign":{"post":{"summary":"Assign an AML case","tags":["aml-cases"],"description":"Who works the case (null: nobody); an open case only (409 AML_CASE_DECIDED). On the caller's own tenant. A case opened at onboarding (direction onboarding) is read here and decided by Aurea: a write on it answers 403 AML_CASE_AUREA_DECIDES.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["assigneeId"],"additionalProperties":false,"properties":{"assigneeId":{"type":["string","null"],"format":"uuid","description":"One who decides these cases (an active user holding the decision's permission), or null for nobody."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/aml-cases/{caseId}/comments":{"post":{"summary":"Comment an AML case","tags":["aml-cases"],"description":"A comment kept with the case (the audit trail records that one was written, never its text). On the caller's own tenant. A case opened at onboarding (direction onboarding) is read here and decided by Aurea: a write on it answers 403 AML_CASE_AUREA_DECIDES.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["body"],"additionalProperties":false,"properties":{"body":{"type":"string","minLength":1,"maxLength":2000}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","authorId","authorRole","authorScope","body","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"authorId":{"type":["string","null"],"format":"uuid"},"authorRole":{"type":"string"},"authorScope":{"type":"string","enum":["tenant","platform"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/aml-cases/{caseId}/decision":{"post":{"summary":"Decide an AML case","tags":["aml-cases"],"description":"Once (409 AML_CASE_DECIDED): release or confirm, with a written reason. Audited, and told to the tenant's endpoints that name aml_case.released or aml_case.confirmed. On the caller's own tenant. A case opened at onboarding (direction onboarding) is read here and decided by Aurea: a write on it answers 403 AML_CASE_AUREA_DECIDES.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["decision","reason"],"additionalProperties":false,"properties":{"decision":{"type":"string","enum":["release","confirm"],"description":"release: the match is bypassed (BYPASSED) — a held operation goes on, a refused one's counterparty passes for a day; confirm: it stays frozen — a held operation is rejected, a received transfer's wallet stays quarantined."},"reason":{"type":"string","minLength":1,"maxLength":1000,"description":"Why: kept with the case (never in an event or the audit trail)."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/aml-cases":{"get":{"summary":"List AML cases","tags":["tenants"],"description":"The cases, newest first. The tenant's own compliance on its tenant; Aurea's administrators read a tenant's cases here and never act on them (403 AML_CASE_READ_ONLY; Aurea decides a tenant's onboarding cases under /v1/admin/platform/aml-cases). A case opened at onboarding is decided by Aurea (403 AML_CASE_AUREA_DECIDES).","parameters":[{"schema":{"type":"string","enum":["open","released","confirmed"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"assigneeId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/aml-cases/{caseId}":{"get":{"summary":"Read an AML case","tags":["tenants"],"description":"The case, its screening and its comments. The tenant's own compliance on its tenant; Aurea's administrators read a tenant's cases here and never act on them (403 AML_CASE_READ_ONLY; Aurea decides a tenant's onboarding cases under /v1/admin/platform/aml-cases). A case opened at onboarding is decided by Aurea (403 AML_CASE_AUREA_DECIDES).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt","comments"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"comments":{"type":"array","items":{"type":"object","required":["id","authorId","authorRole","authorScope","body","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"authorId":{"type":["string","null"],"format":"uuid"},"authorRole":{"type":"string"},"authorScope":{"type":"string","enum":["tenant","platform"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/aml-cases/{caseId}/assign":{"post":{"summary":"Assign an AML case","tags":["tenants"],"description":"Who works the case (null: nobody); an open case only (409 AML_CASE_DECIDED). The tenant's own compliance on its tenant; Aurea's administrators read a tenant's cases here and never act on them (403 AML_CASE_READ_ONLY; Aurea decides a tenant's onboarding cases under /v1/admin/platform/aml-cases). A case opened at onboarding is decided by Aurea (403 AML_CASE_AUREA_DECIDES).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["assigneeId"],"additionalProperties":false,"properties":{"assigneeId":{"type":["string","null"],"format":"uuid","description":"One who decides these cases (an active user holding the decision's permission), or null for nobody."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/aml-cases/{caseId}/comments":{"post":{"summary":"Comment an AML case","tags":["tenants"],"description":"A comment kept with the case (the audit trail records that one was written, never its text). The tenant's own compliance on its tenant; Aurea's administrators read a tenant's cases here and never act on them (403 AML_CASE_READ_ONLY; Aurea decides a tenant's onboarding cases under /v1/admin/platform/aml-cases). A case opened at onboarding is decided by Aurea (403 AML_CASE_AUREA_DECIDES).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["body"],"additionalProperties":false,"properties":{"body":{"type":"string","minLength":1,"maxLength":2000}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","authorId","authorRole","authorScope","body","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"authorId":{"type":["string","null"],"format":"uuid"},"authorRole":{"type":"string"},"authorScope":{"type":"string","enum":["tenant","platform"]},"body":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/aml-cases/{caseId}/decision":{"post":{"summary":"Decide an AML case","tags":["tenants"],"description":"Once (409 AML_CASE_DECIDED): release or confirm, with a written reason. Audited, and told to the tenant's endpoints that name aml_case.released or aml_case.confirmed. The tenant's own compliance on its tenant; Aurea's administrators read a tenant's cases here and never act on them (403 AML_CASE_READ_ONLY; Aurea decides a tenant's onboarding cases under /v1/admin/platform/aml-cases). A case opened at onboarding is decided by Aurea (403 AML_CASE_AUREA_DECIDES).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["decision","reason"],"additionalProperties":false,"properties":{"decision":{"type":"string","enum":["release","confirm"],"description":"release: the match is bypassed (BYPASSED) — a held operation goes on, a refused one's counterparty passes for a day; confirm: it stays frozen — a held operation is rejected, a received transfer's wallet stays quarantined."},"reason":{"type":"string","minLength":1,"maxLength":1000,"description":"Why: kept with the case (never in an event or the audit trail)."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"caseId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","tenantId","status","direction","operationId","inboundTransferId","walletId","held","quarantineId","assigneeId","assignedAt","decision","continuation","screening","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"platform: an operation with no tenant (Aurea's to decide)."},"tenantId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","enum":["open","released","confirmed"]},"direction":{"type":"string","enum":["outbound","inbound","onboarding"]},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"held":{"type":"boolean","description":"An operation is held for it (PENDING_SCREENING under_review): a release lets it go on, a confirmation rejects it."},"quarantineId":{"type":["string","null"],"format":"uuid","description":"The quarantine (W4.6) that holds the operation, or the received transfer's wallet."},"assigneeId":{"type":["string","null"],"format":"uuid"},"assignedAt":{"type":["string","null"],"format":"date-time"},"decision":{"type":["object","null"],"required":["outcome","decidedBy","decidedRole","decidedScope","decidedAt","exemptionUntil"],"properties":{"outcome":{"type":"string","enum":["released","confirmed"]},"reason":{"type":"string","description":"The decision's written reason (never in an event)."},"decidedBy":{"type":["string","null"],"format":"uuid"},"decidedRole":{"type":["string","null"]},"decidedScope":{"type":["string","null"],"enum":["tenant","platform",null]},"decidedAt":{"type":["string","null"],"format":"date-time"},"exemptionUntil":{"type":["string","null"],"format":"date-time","description":"A released match no operation was held for: the same counterparty, for the same list entries, passes (BYPASSED) on the way out until then."}},"description":"Null while the case is open."},"continuation":{"type":["object","null"],"required":["continuedAt","resultStatus","finishedAt"],"properties":{"continuedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"]},"finishedAt":{"type":["string","null"],"format":"date-time"}},"description":"A released held operation that went on: when, and the status its call answered."},"screening":{"type":["object","null"],"required":["id","direction","point","mode","provider","state","result","reason","operationId","inboundTransferId","walletId","chain","chainId","family","address","counterpartyNamed","matches","lists","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["outbound","inbound","onboarding"],"description":"outbound: an operation's counterparty; inbound: a received transfer's sender; onboarding: identity verification's screening of a person or company when it was verified (its matches stay with the verification provider)."},"point":{"type":"string","description":"The signing point screened (outbound), inbound_transfers, or onboarding."},"mode":{"type":"string","enum":["log","enforce"]},"provider":{"type":"string","description":"The screening's provider: public_lists, or identity_verification (onboarding)."},"state":{"type":"string","enum":["PENDING","COMPLETED","FROZEN","BYPASSED"],"description":"PENDING: it could not complete (no list yet, a timeout). COMPLETED: screened (no match, or a match recorded in log). FROZEN: a match where the screening is enforced: held or refused. BYPASSED: a match the case released."},"result":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"],"description":"What the tenant's policy rules read (`screeningResults`)."},"reason":{"type":["string","null"],"description":"Why it is PENDING: no_list, timeout or error."},"operationId":{"type":["string","null"],"format":"uuid"},"inboundTransferId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"family":{"type":["string","null"],"description":"The chain family the address was screened in (evm, solana)."},"address":{"type":["string","null"],"description":"The counterparty's address as screened: the destination (outbound) or the sender (inbound)."},"counterpartyNamed":{"type":"boolean","description":"The counterparty's names (the Travel Rule's beneficiary) were screened too."},"matches":{"type":"array","items":{"type":"object","required":["source","entryRef","kind","name","programs","matchedOn","currency","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"entryRef":{"type":"string","description":"The list's own reference of the entry."},"kind":{"type":"string","enum":["individual","entity","vessel","aircraft","other"]},"name":{"type":"string","description":"The list's name of the entry."},"programs":{"type":"array","items":{"type":"string"}},"matchedOn":{"type":"string","enum":["address","name"]},"currency":{"type":["string","null"],"description":"The list's currency tag of the address matched."},"listDate":{"type":["string","null"],"format":"date-time"}}}},"lists":{"type":"array","description":"The lists' versions read.","items":{"type":"object","required":["source","versionId","listDate"],"properties":{"source":{"type":"string","enum":["ofac_sdn","eu_consolidated","un_consolidated"]},"versionId":{"type":"string","format":"uuid"},"listDate":{"type":["string","null"],"format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"identityVerificationId":{"type":"string","format":"uuid","description":"The identity verification an onboarding screening is about; absent for every other screening."}},"description":"The screening that opened the case."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/settings":{"get":{"summary":"Read the Gas Station settings","tags":["gas-station"],"description":"The tenant's gas mode, and whether the Gas Station runs. On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["gasMode","stationRunning"],"properties":{"gasMode":{"type":"string","enum":["airdrop","station"],"description":"airdrop: the tenant's new wallets get gas as before (the airdrop of the chain's native token where the tenant has it); station: the Gas Station's policies cover them and no registration airdrop is sent. Set by Aurea."},"stationRunning":{"type":"boolean","description":"Whether the Gas Station tops wallets up on this platform now."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/policies":{"get":{"summary":"List Gas Station policies","tags":["gas-station"],"description":"The tenant's own policies, and the platform's defaults that apply where it has none for a chain and asset. On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["policies","platformDefaults"],"properties":{"policies":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"platformDefaults":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add a Gas Station policy","tags":["gas-station"],"description":"A policy for one chain and asset: a covered wallet below `threshold` is topped up to `target`, at most `capPerTopUp` each time and `capPerWalletDay` in 24 hours, never while the network's gas price is above `maxGasPriceWei`, from the tenant's funding wallet on that chain. `target` above `threshold`, `capPerWalletDay` at least `capPerTopUp` (400 GAS_STATION_INVALID); an EVM chain the Hub supports (400 GAS_STATION_CHAIN_NOT_SUPPORTED); a token must hold a token contract (422 GAS_STATION_ASSET_NOT_A_TOKEN, 503 GAS_STATION_CHAIN_UNAVAILABLE when the chain cannot be read); one policy per chain and asset (409 GAS_STATION_POLICY_EXISTS). On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chain","asset","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"An EVM chain's slug: gnosis, base…"},"isTestnet":{"type":"boolean","default":false},"asset":{"type":"string"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"coverage":{"type":"string","enum":["custodial","account","tag"]},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean"},"enabled":{"type":"boolean"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/policies/{policyId}":{"patch":{"summary":"Change a Gas Station policy","tags":["gas-station"],"description":"Its limits, coverage or switch (its chain and asset never change); the same rules as when it was added. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"coverage":{"type":"string","enum":["custodial","account","tag"]},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean"},"enabled":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"policyId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/funding-wallets":{"get":{"summary":"List Gas Station funding wallets","tags":["gas-station"],"description":"The tenant's funding wallets — one per chain — each with its native balance read now. On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["fundingWallets"],"properties":{"fundingWallets":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","address","custodyTier","nativeBalance","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":"string","description":"Fund this address: it pays the top-ups on its chain."},"custodyTier":{"type":"string","enum":["premium","institutional"],"description":"Where its key is kept: a hardware security module, never exported."},"nativeBalance":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$","description":"Its native balance now, in the smallest unit; null when it could not be read."},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Make a Gas Station funding wallet","tags":["gas-station"],"description":"A funding wallet on one chain: its key is made in a hardware security module and never exported. Made under the tenant's quorum (202 while another administrator approves it). 409 GAS_STATION_FUNDING_WALLET_EXISTS when the tenant has one on the chain; 503 WALLET_KEY_STORE_NOT_CONFIGURED or WALLET_KEY_STORE_UNAVAILABLE when the key store cannot make it. On the caller's own tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chain"],"additionalProperties":false,"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","address","custodyTier","nativeBalance","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":"string","description":"Fund this address: it pays the top-ups on its chain."},"custodyTier":{"type":"string","enum":["premium","institutional"],"description":"Where its key is kept: a hardware security module, never exported."},"nativeBalance":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$","description":"Its native balance now, in the smallest unit; null when it could not be read."},"createdAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/top-ups":{"get":{"summary":"List Gas Station top-ups","tags":["gas-station"],"description":"The tenant's top-ups and skips, newest first. On the caller's own tenant.","parameters":[{"schema":{"type":"string","enum":["planned","signed","sent","confirmed","failed","skipped"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["topUps","nextCursor"],"properties":{"topUps":{"type":"array","items":{"type":"object","required":["id","policyId","fundingWalletId","walletId","chain","chainId","isTestnet","asset","status","skipReason","failureCode","balanceBefore","amount","gasPriceWei","txHash","operationId","occurrences","createdAt","lastSeenAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"policyId":{"type":"string","format":"uuid"},"fundingWalletId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"asset":{"type":"string"},"status":{"type":"string","enum":["planned","signed","sent","confirmed","failed","skipped"],"description":"planned → signed → sent → confirmed, or failed; skipped: a wallet below its threshold that was not topped up, with its reason (one row per episode, counted in `occurrences`)."},"skipReason":{"type":["string","null"],"enum":["day_cap_reached","gas_price_above_max","funding_insufficient","no_funding_wallet","funding_unreadable",null]},"failureCode":{"type":["string","null"]},"balanceBefore":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"gasPriceWei":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$"},"txHash":{"type":["string","null"]},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}), when operations are recorded."},"occurrences":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/gas-station/alarms":{"get":{"summary":"List the Gas Station's open alarms","tags":["gas-station"],"description":"The open alarms about the tenant's funding wallets, top-ups and policies. On the caller's own tenant.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["alarms"],"properties":{"alarms":{"type":"array","items":{"type":"object","required":["id","kind","detail","occurrences","raisedAt","lastSeenAt"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["gas_funding_low","gas_topup_failed","gas_price_above_max"],"description":"gas_funding_low: a funding wallet cannot pay a top-up; gas_topup_failed: a top-up failed; gas_price_above_max: the network is above a policy's maximum price."},"detail":{"type":"object","additionalProperties":true},"occurrences":{"type":"integer"},"raisedAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/settings":{"get":{"summary":"Read the Gas Station settings","tags":["tenants"],"description":"The tenant's gas mode, and whether the Gas Station runs. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["gasMode","stationRunning"],"properties":{"gasMode":{"type":"string","enum":["airdrop","station"],"description":"airdrop: the tenant's new wallets get gas as before (the airdrop of the chain's native token where the tenant has it); station: the Gas Station's policies cover them and no registration airdrop is sent. Set by Aurea."},"stationRunning":{"type":"boolean","description":"Whether the Gas Station tops wallets up on this platform now."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/policies":{"get":{"summary":"List Gas Station policies","tags":["tenants"],"description":"The tenant's own policies, and the platform's defaults that apply where it has none for a chain and asset. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["policies","platformDefaults"],"properties":{"policies":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"platformDefaults":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add a Gas Station policy","tags":["tenants"],"description":"A policy for one chain and asset: a covered wallet below `threshold` is topped up to `target`, at most `capPerTopUp` each time and `capPerWalletDay` in 24 hours, never while the network's gas price is above `maxGasPriceWei`, from the tenant's funding wallet on that chain. `target` above `threshold`, `capPerWalletDay` at least `capPerTopUp` (400 GAS_STATION_INVALID); an EVM chain the Hub supports (400 GAS_STATION_CHAIN_NOT_SUPPORTED); a token must hold a token contract (422 GAS_STATION_ASSET_NOT_A_TOKEN, 503 GAS_STATION_CHAIN_UNAVAILABLE when the chain cannot be read); one policy per chain and asset (409 GAS_STATION_POLICY_EXISTS). The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chain","asset","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"An EVM chain's slug: gnosis, base…"},"isTestnet":{"type":"boolean","default":false},"asset":{"type":"string"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"coverage":{"type":"string","enum":["custodial","account","tag"]},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean"},"enabled":{"type":"boolean"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/policies/{policyId}":{"patch":{"summary":"Change a Gas Station policy","tags":["tenants"],"description":"Its limits, coverage or switch (its chain and asset never change); the same rules as when it was added. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"coverage":{"type":"string","enum":["custodial","account","tag"]},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean"},"enabled":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"policyId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","asset","decimals","threshold","target","capPerTopUp","capPerWalletDay","maxGasPriceWei","coverage","accountId","tag","includeNonCustodial","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string","description":"The EVM chain's slug."},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"asset":{"type":"string","description":"\"native\", or the token's address (EIP-55)."},"decimals":{"type":"integer"},"threshold":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"A covered wallet below this balance is topped up."},"target":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"It is topped up to this balance."},"capPerTopUp":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per top-up."},"capPerWalletDay":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"At most this much per wallet in 24 hours (rolling)."},"maxGasPriceWei":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$","description":"No top-up while the network's gas price is above this; a top-up never pays more per gas."},"coverage":{"type":"string","enum":["custodial","account","tag"],"description":"custodial: every wallet of the tenant whose key the platform holds for your tenant; account: the wallets of one account; tag: the wallets of the accounts holding a tag."},"accountId":{"type":["string","null"],"format":"uuid"},"tag":{"type":["string","null"]},"includeNonCustodial":{"type":"boolean","description":"Whether client-side and MPC wallets of the coverage are topped up too (a tenant's own policies only)."},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/funding-wallets":{"get":{"summary":"List Gas Station funding wallets","tags":["tenants"],"description":"The tenant's funding wallets — one per chain — each with its native balance read now. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["fundingWallets"],"properties":{"fundingWallets":{"type":"array","items":{"type":"object","required":["id","scope","chain","isTestnet","chainId","address","custodyTier","nativeBalance","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":"string","description":"Fund this address: it pays the top-ups on its chain."},"custodyTier":{"type":"string","enum":["premium","institutional"],"description":"Where its key is kept: a hardware security module, never exported."},"nativeBalance":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$","description":"Its native balance now, in the smallest unit; null when it could not be read."},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Make a Gas Station funding wallet","tags":["tenants"],"description":"A funding wallet on one chain: its key is made in a hardware security module and never exported. Made under the tenant's quorum (202 while another administrator approves it). 409 GAS_STATION_FUNDING_WALLET_EXISTS when the tenant has one on the chain; 503 WALLET_KEY_STORE_NOT_CONFIGURED or WALLET_KEY_STORE_UNAVAILABLE when the key store cannot make it. The tenant's administrators on their own tenant, Aurea's on any.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chain"],"additionalProperties":false,"properties":{"chain":{"type":"string"},"isTestnet":{"type":"boolean","default":false}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","scope","chain","isTestnet","chainId","address","custodyTier","nativeBalance","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"scope":{"type":"string","enum":["tenant","platform"],"description":"Whose it is: the tenant's own, or the platform's default."},"chain":{"type":"string"},"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"address":{"type":"string","description":"Fund this address: it pays the top-ups on its chain."},"custodyTier":{"type":"string","enum":["premium","institutional"],"description":"Where its key is kept: a hardware security module, never exported."},"nativeBalance":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$","description":"Its native balance now, in the smallest unit; null when it could not be read."},"createdAt":{"type":"string","format":"date-time"}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/top-ups":{"get":{"summary":"List Gas Station top-ups","tags":["tenants"],"description":"The tenant's top-ups and skips, newest first. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","enum":["planned","signed","sent","confirmed","failed","skipped"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["topUps","nextCursor"],"properties":{"topUps":{"type":"array","items":{"type":"object","required":["id","policyId","fundingWalletId","walletId","chain","chainId","isTestnet","asset","status","skipReason","failureCode","balanceBefore","amount","gasPriceWei","txHash","operationId","occurrences","createdAt","lastSeenAt","sentAt","finishedAt"],"properties":{"id":{"type":"string","format":"uuid"},"policyId":{"type":"string","format":"uuid"},"fundingWalletId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"asset":{"type":"string"},"status":{"type":"string","enum":["planned","signed","sent","confirmed","failed","skipped"],"description":"planned → signed → sent → confirmed, or failed; skipped: a wallet below its threshold that was not topped up, with its reason (one row per episode, counted in `occurrences`)."},"skipReason":{"type":["string","null"],"enum":["day_cap_reached","gas_price_above_max","funding_insufficient","no_funding_wallet","funding_unreadable",null]},"failureCode":{"type":["string","null"]},"balanceBefore":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]{0,77})$"},"gasPriceWei":{"type":["string","null"],"pattern":"^(0|[1-9][0-9]{0,77})$"},"txHash":{"type":["string","null"]},"operationId":{"type":["string","null"],"format":"uuid","description":"Its operation (GET /v1/operations/{id}), when operations are recorded."},"occurrences":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/gas-station/alarms":{"get":{"summary":"List the Gas Station's open alarms","tags":["tenants"],"description":"The open alarms about the tenant's funding wallets, top-ups and policies. The tenant's administrators on their own tenant, Aurea's on any.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["alarms"],"properties":{"alarms":{"type":"array","items":{"type":"object","required":["id","kind","detail","occurrences","raisedAt","lastSeenAt"],"properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["gas_funding_low","gas_topup_failed","gas_price_above_max"],"description":"gas_funding_low: a funding wallet cannot pay a top-up; gas_topup_failed: a top-up failed; gas_price_above_max: the network is above a policy's maximum price."},"detail":{"type":"object","additionalProperties":true},"occurrences":{"type":"integer"},"raisedAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/inbound-transfers":{"get":{"summary":"List inbound transfers","tags":["inbound-transfers"],"description":"The transfers into the tenant's EVM and Solana wallets from any address — on EVM the native coin a transaction sent and the Transfer logs of the tokens the tenant lists, read once their block has the platform's confirmations; on Solana each SOL and SPL token transfer (of a token the tenant lists) into the wallet, read at finalized — newest recorded first. Native coin a contract sends on EVM is not seen (it is in the wallet's balance). A user reads their own wallets'; a tenant administrator every wallet of the tenant. Transfers are recorded only while Aurea has the inbound transfers job switched on for the platform; they are not transactions, whose answers are unchanged.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false,"description":"One account's wallets"},{"schema":{"type":"integer","minimum":1},"in":"query","name":"chainId","required":false},{"schema":{"type":"string","pattern":"^(native|0x[0-9a-fA-F]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"in":"query","name":"asset","required":false,"description":"`native`, an EVM token contract or a Solana mint (base58, as written)"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false,"description":"Recorded at or after"},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false,"description":"Recorded before"},{"schema":{"type":"boolean","default":false},"in":"query","name":"includeRemoved","required":false,"description":"Also the transfers a re-organisation took away"},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"transfers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid","description":"The tenant's wallet the transfer reached"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid","description":"The wallet's user when the transfer was recorded"},"chain":{"type":"string","description":"The chain's family, as wallets and tokens name it (gnosis, polygon, base…)"},"chainId":{"type":"integer","description":"The chain id: an EVM chain's, or Solana's (1399811149 mainnet, 1399811150 the test cluster)"},"isTestnet":{"type":"boolean"},"txHash":{"type":"string","description":"The transaction: EVM, its hash, lower case; Solana, its signature (base58, case kept)"},"logIndex":{"type":"integer","description":"EVM: the Transfer log's index in its block for a token, -1 for the native coin the transaction carried. Solana: the instruction's place in the transaction (top-level and inner instructions in the order they ran)"},"blockNumber":{"type":"integer","description":"EVM: the block; Solana: the slot"},"blockHash":{"type":"string","description":"EVM: the block's hash; Solana: the slot's blockhash"},"blockTime":{"type":["string","null"],"format":"date-time"},"from":{"type":"string","description":"The sender (EVM lower case; Solana base58: for a token, the source account's owner, for a mint, the mint's authority)"},"to":{"type":"string","description":"The wallet's address (EVM lower case; Solana base58)"},"asset":{"type":"string","description":"`native`, or the token: an EVM contract, lower case, or a Solana mint, base58"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"In the asset's smallest unit (wei for 18 decimals, lamports for SOL)"},"recordedAt":{"type":"string","format":"date-time"},"removed":{"type":"boolean","description":"A re-organisation of the chain took the transfer's block away; it counts nowhere until a new block carries it again"},"removedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"],"description":"Pass it as `cursor` for the next page; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/inbound-transfers/{id}":{"get":{"summary":"Get an inbound transfer","tags":["inbound-transfers"],"description":"One transfer into one of the tenant's wallets. A user reads their own wallets'; a tenant administrator any of the tenant.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid","description":"The tenant's wallet the transfer reached"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid","description":"The wallet's user when the transfer was recorded"},"chain":{"type":"string","description":"The chain's family, as wallets and tokens name it (gnosis, polygon, base…)"},"chainId":{"type":"integer","description":"The chain id: an EVM chain's, or Solana's (1399811149 mainnet, 1399811150 the test cluster)"},"isTestnet":{"type":"boolean"},"txHash":{"type":"string","description":"The transaction: EVM, its hash, lower case; Solana, its signature (base58, case kept)"},"logIndex":{"type":"integer","description":"EVM: the Transfer log's index in its block for a token, -1 for the native coin the transaction carried. Solana: the instruction's place in the transaction (top-level and inner instructions in the order they ran)"},"blockNumber":{"type":"integer","description":"EVM: the block; Solana: the slot"},"blockHash":{"type":"string","description":"EVM: the block's hash; Solana: the slot's blockhash"},"blockTime":{"type":["string","null"],"format":"date-time"},"from":{"type":"string","description":"The sender (EVM lower case; Solana base58: for a token, the source account's owner, for a mint, the mint's authority)"},"to":{"type":"string","description":"The wallet's address (EVM lower case; Solana base58)"},"asset":{"type":"string","description":"`native`, or the token: an EVM contract, lower case, or a Solana mint, base58"},"symbol":{"type":["string","null"]},"decimals":{"type":["integer","null"]},"amount":{"type":"string","description":"In the asset's smallest unit (wei for 18 decimals, lamports for SOL)"},"recordedAt":{"type":"string","format":"date-time"},"removed":{"type":"boolean","description":"A re-organisation of the chain took the transfer's block away; it counts nowhere until a new block carries it again"},"removedAt":{"type":["string","null"],"format":"date-time"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/reconciliation/positions":{"get":{"summary":"List the reconciliation of the tenant's wallets","tags":["reconciliation"],"description":"For each of the tenant's EVM wallets, chain and asset (the native coin and the tokens the tenant lists): the balance the Hub's records give at a block — the opening balance read the first time, plus the transfers recorded into the wallet, minus what the Hub's recorded transactions took out and their fees — against the chain's balance at the same block. The latest changed first. Positions exist only while Aurea has the reconciliation switched on for the platform. Tenant administrators.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false,"description":"One account's wallets"},{"schema":{"type":"integer","minimum":1},"in":"query","name":"chainId","required":false},{"schema":{"type":"string","pattern":"^(native|0x[0-9a-fA-F]{40})$"},"in":"query","name":"asset","required":false},{"schema":{"type":"string","enum":["baseline","matched","mismatch","in_flight","unread"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"positions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The wallet's address, lower case"},"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"asset":{"type":"string","description":"`native` or the token contract, lower case"},"symbol":{"type":["string","null"]},"decimals":{"type":"integer"},"status":{"type":"string","enum":["baseline","matched","mismatch","in_flight","unread"],"description":"baseline: the opening balance was just read, nothing to compare yet; matched: the chain and the records agree within the platform's tolerance; mismatch: they do not; in_flight: a transaction of the wallet is under way, compared on a later run; unread: the chain could not be read (statusCode says why)"},"statusCode":{"type":["string","null"]},"baselineBlock":{"type":"integer","description":"Where the reconciliation began: what came before is in the opening balance"},"baselineBalance":{"type":"string","description":"The opening balance, in the asset's smallest unit"},"baselineAt":{"type":"string","format":"date-time"},"checkedBlock":{"type":["integer","null"]},"onChain":{"type":["string","null"],"description":"The chain's balance at the checked block, in the asset's smallest unit"},"expected":{"type":["string","null"],"description":"The records' balance at the checked block: opening balance + inbound transfers - recorded outbound - fees, in the asset's smallest unit"},"difference":{"type":["string","null"],"description":"onChain - expected (below zero: the chain holds less), in the asset's smallest unit"},"inbound":{"type":"string","description":"Transfers recorded into the wallet since the opening block, in the asset's smallest unit"},"outbound":{"type":"string","description":"What the Hub's recorded transactions took out since the opening block, in the asset's smallest unit"},"fee":{"type":"string","description":"Their fees, when the wallet paid them (the native coin only), in the asset's smallest unit"},"checkedAt":{"type":["string","null"],"format":"date-time"},"mismatchSince":{"type":["string","null"],"format":"date-time"},"differenceSince":{"type":["string","null"],"format":"date-time","description":"Since when the difference has been this very amount. After RECONCILIATION_REBASELINE_DAYS (7) of it the position is opened again at the chain's balance (rebaselines + 1) and its alarm resolved"},"rebaselines":{"type":"integer","description":"How many times a difference that lasted became the opening balance"},"rebaselinedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"nextCursor":{"type":["string","null"],"description":"Pass it as `cursor` for the next page; null on the last"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/reconciliation/positions/{id}":{"get":{"summary":"Get one reconciliation position","tags":["reconciliation"],"description":"One wallet's asset on one chain, as the last run found it. Tenant administrators.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"accountId":{"type":["string","null"],"format":"uuid","description":"The account the wallet is in when read: its account, else its user's default account (whose id is the user's)"},"userId":{"type":["string","null"],"format":"uuid"},"address":{"type":"string","description":"The wallet's address, lower case"},"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"asset":{"type":"string","description":"`native` or the token contract, lower case"},"symbol":{"type":["string","null"]},"decimals":{"type":"integer"},"status":{"type":"string","enum":["baseline","matched","mismatch","in_flight","unread"],"description":"baseline: the opening balance was just read, nothing to compare yet; matched: the chain and the records agree within the platform's tolerance; mismatch: they do not; in_flight: a transaction of the wallet is under way, compared on a later run; unread: the chain could not be read (statusCode says why)"},"statusCode":{"type":["string","null"]},"baselineBlock":{"type":"integer","description":"Where the reconciliation began: what came before is in the opening balance"},"baselineBalance":{"type":"string","description":"The opening balance, in the asset's smallest unit"},"baselineAt":{"type":"string","format":"date-time"},"checkedBlock":{"type":["integer","null"]},"onChain":{"type":["string","null"],"description":"The chain's balance at the checked block, in the asset's smallest unit"},"expected":{"type":["string","null"],"description":"The records' balance at the checked block: opening balance + inbound transfers - recorded outbound - fees, in the asset's smallest unit"},"difference":{"type":["string","null"],"description":"onChain - expected (below zero: the chain holds less), in the asset's smallest unit"},"inbound":{"type":"string","description":"Transfers recorded into the wallet since the opening block, in the asset's smallest unit"},"outbound":{"type":"string","description":"What the Hub's recorded transactions took out since the opening block, in the asset's smallest unit"},"fee":{"type":"string","description":"Their fees, when the wallet paid them (the native coin only), in the asset's smallest unit"},"checkedAt":{"type":["string","null"],"format":"date-time"},"mismatchSince":{"type":["string","null"],"format":"date-time"},"differenceSince":{"type":["string","null"],"format":"date-time","description":"Since when the difference has been this very amount. After RECONCILIATION_REBASELINE_DAYS (7) of it the position is opened again at the chain's balance (rebaselines + 1) and its alarm resolved"},"rebaselines":{"type":"integer","description":"How many times a difference that lasted became the opening balance"},"rebaselinedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/reconciliation/summary":{"get":{"summary":"Count the reconciliation's positions by status","tags":["reconciliation"],"description":"How many of the tenant's positions are in each status, optionally of one account's wallets. Tenant administrators.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"accountId","required":false,"description":"One account's wallets"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"baseline":{"type":"integer"},"matched":{"type":"integer"},"mismatch":{"type":"integer"},"in_flight":{"type":"integer"},"unread":{"type":"integer"}}}}}}}}},"/v1/fees/estimate":{"get":{"summary":"Estimate a chain's fees","tags":["fees"],"description":"LOW, MEDIUM and HIGH fee levels for one of the tenant's chains, from that chain's recent fee history (EVM: eth_feeHistory over the last 20 blocks, the 10th, 50th and 90th percentile of the tips; a chain without one: its gas price; Solana: the recent prioritization fees). Read through the tenant's own node; nothing is signed or sent.","parameters":[{"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"in":"query","name":"chain","required":true,"description":"The chain's name, as the tenant's chains list it (gnosis, base, solana…)"},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"family":{"type":"string","enum":["evm","solana"]},"model":{"type":"string","enum":["eip1559","legacy","solana"],"description":"eip1559: levels from the fee history; legacy: the node's gas price (no fee history or no base fee); solana: prioritization fees"},"baseFeePerGas":{"type":["string","null"],"description":"EVM eip1559: the next block's base fee, in wei; null otherwise"},"levels":{"type":"object","properties":{"LOW":{"type":"object","properties":{"maxFeePerGas":{"type":["string","null"],"description":"EVM: the most a unit of gas may cost at this level, in wei (the base fee with room to rise, plus the tip); null on Solana"},"maxPriorityFeePerGas":{"type":["string","null"],"description":"EVM: the tip per unit of gas, in wei; on a chain without a base fee (legacy) the whole gas price; null on Solana"},"priorityFeeMicroLamports":{"type":["string","null"],"description":"Solana: the priority fee per compute unit, in micro-lamports; null on EVM"},"networkFee":{"type":"string","pattern":"^\\d+$","description":"A plain native transfer at this level, in the native coin's smallest unit: on EVM 21 000 gas at maxFeePerGas (the most it can cost), on Solana one signature plus the priority fee of 200 000 compute units"}}},"MEDIUM":{"type":"object","properties":{"maxFeePerGas":{"type":["string","null"],"description":"EVM: the most a unit of gas may cost at this level, in wei (the base fee with room to rise, plus the tip); null on Solana"},"maxPriorityFeePerGas":{"type":["string","null"],"description":"EVM: the tip per unit of gas, in wei; on a chain without a base fee (legacy) the whole gas price; null on Solana"},"priorityFeeMicroLamports":{"type":["string","null"],"description":"Solana: the priority fee per compute unit, in micro-lamports; null on EVM"},"networkFee":{"type":"string","pattern":"^\\d+$","description":"A plain native transfer at this level, in the native coin's smallest unit: on EVM 21 000 gas at maxFeePerGas (the most it can cost), on Solana one signature plus the priority fee of 200 000 compute units"}}},"HIGH":{"type":"object","properties":{"maxFeePerGas":{"type":["string","null"],"description":"EVM: the most a unit of gas may cost at this level, in wei (the base fee with room to rise, plus the tip); null on Solana"},"maxPriorityFeePerGas":{"type":["string","null"],"description":"EVM: the tip per unit of gas, in wei; on a chain without a base fee (legacy) the whole gas price; null on Solana"},"priorityFeeMicroLamports":{"type":["string","null"],"description":"Solana: the priority fee per compute unit, in micro-lamports; null on EVM"},"networkFee":{"type":"string","pattern":"^\\d+$","description":"A plain native transfer at this level, in the native coin's smallest unit: on EVM 21 000 gas at maxFeePerGas (the most it can cost), on Solana one signature plus the priority fee of 200 000 compute units"}}}}},"estimatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/wallets/{id}/max-spendable":{"get":{"summary":"The most a wallet can send of an asset","tags":["fees"],"description":"For one of the caller's own wallets: the native coin's balance minus the fee of sending it at the level (never below zero), or a token's whole balance — its fee is paid in the native coin, and feeCovered says whether the native balance covers it. Read through the tenant's own node.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":100,"default":"native"},"in":"query","name":"asset","required":false,"description":"native, or the token's address (an SPL mint on Solana)"},{"schema":{"type":"string","enum":["LOW","MEDIUM","HIGH"],"default":"MEDIUM"},"in":"query","name":"level","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"walletId":{"type":"string","format":"uuid"},"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"asset":{"type":"string"},"level":{"type":"string","enum":["LOW","MEDIUM","HIGH"]},"balance":{"type":"string","pattern":"^\\d+$","description":"The asset's balance, in its smallest unit"},"nativeBalance":{"type":"string","pattern":"^\\d+$","description":"The native coin's balance, in its smallest unit"},"fee":{"type":"string","pattern":"^\\d+$","description":"The fee of sending the asset at the level, in the native coin's smallest unit (the most it can cost on EVM)"},"feeCovered":{"type":"boolean","description":"Whether the native balance covers the fee"},"maxSpendable":{"type":"string","pattern":"^\\d+$","description":"The most that can be sent, in the asset's smallest unit"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/addresses/validate":{"post":{"summary":"Validate an address for a chain","tags":["fees"],"description":"The address's format and checksum for the chain's family (EVM: EIP-55, absent when all one case; Solana: base58 of 32 bytes), and what sits there where it is cheap to know: an EVM address's code (one read of the tenant's node: eoa, contract, or an EIP-7702 delegated eoa; unknown when the node does not answer), a Solana address on the curve (a wallet) or off it (program-derived). In the body, so the address stays out of URLs and logs.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["chain","address"],"additionalProperties":false,"properties":{"chain":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"isTestnet":{"type":"boolean","default":false},"address":{"type":"string","minLength":1,"maxLength":128}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string"},"chainId":{"type":"integer"},"isTestnet":{"type":"boolean"},"family":{"type":"string","enum":["evm","solana"]},"valid":{"type":"boolean"},"normalized":{"type":["string","null"],"description":"The address as it should be written (checksummed on EVM); null when invalid"},"checksum":{"type":"string","enum":["valid","absent","invalid","not_applicable"]},"kind":{"type":["string","null"],"enum":["eoa","contract","delegated_eoa","wallet","program_derived","unknown",null]},"reason":{"type":["string","null"],"enum":["format","checksum",null],"description":"Why it is not valid; null when it is"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets":{"get":{"summary":"List policy sets","tags":["policies"],"description":"The tenant's policy sets — each a version of its signing policy — newest first, without their rules. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","parameters":[{"schema":{"type":"string","enum":["draft","awaiting_quorum","active","archived"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1},"in":"query","name":"beforeVersion","required":false,"description":"The `nextBeforeVersion` of the previous page."},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["sets","nextBeforeVersion"],"properties":{"sets":{"type":"array","items":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"}}}},"nextBeforeVersion":{"type":["integer","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Create a draft policy set","tags":["policies"],"description":"A new draft, the tenant's next version: empty, with the rules given, or a copy of a version's rules (`copyFromSetId`, any status). Its author is the caller. Nothing is enforced: the active set's verdicts are only logged. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"description":{"type":["string","null"],"maxLength":1000},"rules":{"type":"array","maxItems":500,"items":{"type":"object","additionalProperties":false,"required":["name","verdict"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}},"copyFromSetId":{"type":"string","format":"uuid"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}":{"get":{"summary":"Get a policy set","tags":["policies"],"description":"A policy set with its rules in order. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/rules":{"put":{"summary":"Replace a draft's rules","tags":["policies"],"description":"The draft's rules, replaced by these in their order (the first match decides). Only a draft, and only by its author: an awaiting, active or archived set is immutable. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["rules"],"properties":{"rules":{"type":"array","maxItems":500,"items":{"type":"object","additionalProperties":false,"required":["name","verdict"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/validate":{"post":{"summary":"Validate a policy set","tags":["policies"],"description":"Checks the set as a whole and what its rules name (approvers, signers, wallets and users of the tenant), with errors that stop a submission and warnings that do not. Changes nothing. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["valid","ruleCount","errors","warnings"],"properties":{"valid":{"type":"boolean","description":"No error: the set may be submitted."},"ruleCount":{"type":"integer"},"errors":{"type":"array","items":{"type":"object","required":["code","position","message"],"properties":{"code":{"type":"string"},"position":{"type":["integer","null"]},"message":{"type":"string"}}},"description":"APPROVAL_THRESHOLD_UNREACHABLE, APPROVER_UNKNOWN, DESIGNATED_SIGNER_UNKNOWN: a set with one is not submitted."},"warnings":{"type":"array","items":{"type":"object","required":["code","position","message"],"properties":{"code":{"type":"string"},"position":{"type":["integer","null"]},"message":{"type":"string"}}},"description":"EMPTY_SET, SHADOWED, SHADOWED_UNDER_LEGACY, WINDOW_NOT_MEASURED, SCREENING_NOT_AVAILABLE, SOURCE_WALLET_UNKNOWN, INITIATOR_USER_UNKNOWN."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/simulate":{"post":{"summary":"Simulate a policy set on the tenant's history","tags":["policies"],"description":"Evaluates the set (a draft, or any version) on the tenant's operations of the last `days` (default 30, at most 90), the newest `limit` (default 2000, at most 5000): counts per verdict and per rule under the tenant's profile and under the institutional profile, with a sample of each rule's operations. Read only; amounts in EUR from the token registry (unknown when a price is missing). Changes nothing. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"days":{"type":"integer","minimum":1,"maximum":90,"default":30},"limit":{"type":"integer","minimum":1,"maximum":5000,"default":2000}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["policySetId","policySetVersion","policySetStatus","tenantProfile","window","limits","operations","amounts","results"],"properties":{"policySetId":{"type":"string","format":"uuid"},"policySetVersion":{"type":"integer"},"policySetStatus":{"type":"string","enum":["draft","awaiting_quorum","active","archived"]},"tenantProfile":{"type":"string","enum":["legacy","institutional"]},"window":{"type":"object","required":["from","to","days"],"properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"days":{"type":"integer"}}},"limits":{"type":"object","required":["maxOperations","samplePerRule","readBudgetMs","evaluationBudgetMs"],"properties":{"maxOperations":{"type":"integer"},"samplePerRule":{"type":"integer"},"readBudgetMs":{"type":"integer"},"evaluationBudgetMs":{"type":"integer"}}},"operations":{"type":"object","required":["read","evaluated","truncated","truncatedBy","bySource"],"properties":{"read":{"type":"integer"},"evaluated":{"type":"integer"},"truncated":{"type":"boolean","description":"The window held more operations than the limit (the newest were evaluated), or the evaluation stopped at its time budget."},"truncatedBy":{"type":["string","null"],"enum":["limit","deadline",null]},"bySource":{"type":"object","required":["custodial_transaction","prepared_transaction","gasless_permit","earn_operation","operation"],"properties":{"custodial_transaction":{"type":"integer"},"prepared_transaction":{"type":"integer"},"gasless_permit":{"type":"integer"},"earn_operation":{"type":"integer"},"operation":{"type":"integer"}},"description":"custodial_transaction (sent from a custodial wallet), prepared_transaction (handed to a client-side or MPC wallet to sign), gasless_permit, earn_operation, operation (recorded by the operations, with no transaction or prepared transaction of their own)."}}},"amounts":{"type":"object","required":["referenceCurrency","priced","unpriced"],"properties":{"referenceCurrency":{"type":"string"},"priced":{"type":"integer","description":"Signatures whose amount was normalised to EUR."},"unpriced":{"type":"integer","description":"Signatures whose token or price is not known: their amount stays unknown to the engine (missing:amount)."}}},"addressBook":{"type":"object","required":["listed","notListed"],"description":"Present when the set names the destination kind address_book and the tenant's address book is in log or enforce: the signatures whose destination is an active entry of the book now (listed), and those whose destination is not (notListed). Absent otherwise: address_book then matches no destination.","properties":{"listed":{"type":"integer"},"notListed":{"type":"integer"}}},"results":{"type":"object","required":["tenant","institutional"],"properties":{"tenant":{"type":"object","required":["profile","verdicts","rules","defaultDecision","reasons"],"properties":{"profile":{"type":"string","enum":["legacy","institutional"]},"verdicts":{"type":"object","required":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"properties":{"ALLOW":{"type":"integer"},"SCREEN":{"type":"integer"},"REQUIRE_APPROVAL":{"type":"integer"},"BLOCK":{"type":"integer"},"FREEZE":{"type":"integer"}}},"rules":{"type":"array","items":{"type":"object","required":["ruleId","position","name","verdict","matched","sample"],"properties":{"ruleId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"]},"matched":{"type":"integer","description":"Operations this rule decided."},"sample":{"type":"array","items":{"type":"object","required":["source","id"],"properties":{"source":{"type":"string","enum":["custodial_transaction","prepared_transaction","gasless_permit","earn_operation","operation"]},"id":{"type":"string","format":"uuid"}}},"description":"At most 10 operations, the newest first."}}}},"defaultDecision":{"type":"object","required":["verdict","matched","sample"],"description":"Operations no rule decided: the profile's default (legacy ALLOW, institutional BLOCK).","properties":{"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"]},"matched":{"type":"integer"},"sample":{"type":"array","items":{"type":"object","required":["source","id"],"properties":{"source":{"type":"string","enum":["custodial_transaction","prepared_transaction","gasless_permit","earn_operation","operation"]},"id":{"type":"string","format":"uuid"}}},"description":"At most 10 operations, the newest first."}}},"reasons":{"type":"object","additionalProperties":{"type":"integer"},"description":"How many operations each reason was given for: missing:<field> (a value the operation does not carry), possible-match:<position>, explicit-rule-required:<TYPE>, rule-matched, no-matching-rule, no-policy-set."}},"description":"Under the tenant's own profile."},"institutional":{"type":"object","required":["profile","verdicts","rules","defaultDecision","reasons"],"properties":{"profile":{"type":"string","enum":["legacy","institutional"]},"verdicts":{"type":"object","required":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"properties":{"ALLOW":{"type":"integer"},"SCREEN":{"type":"integer"},"REQUIRE_APPROVAL":{"type":"integer"},"BLOCK":{"type":"integer"},"FREEZE":{"type":"integer"}}},"rules":{"type":"array","items":{"type":"object","required":["ruleId","position","name","verdict","matched","sample"],"properties":{"ruleId":{"type":"string","format":"uuid"},"position":{"type":"integer"},"name":{"type":"string"},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"]},"matched":{"type":"integer","description":"Operations this rule decided."},"sample":{"type":"array","items":{"type":"object","required":["source","id"],"properties":{"source":{"type":"string","enum":["custodial_transaction","prepared_transaction","gasless_permit","earn_operation","operation"]},"id":{"type":"string","format":"uuid"}}},"description":"At most 10 operations, the newest first."}}}},"defaultDecision":{"type":"object","required":["verdict","matched","sample"],"description":"Operations no rule decided: the profile's default (legacy ALLOW, institutional BLOCK).","properties":{"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"]},"matched":{"type":"integer"},"sample":{"type":"array","items":{"type":"object","required":["source","id"],"properties":{"source":{"type":"string","enum":["custodial_transaction","prepared_transaction","gasless_permit","earn_operation","operation"]},"id":{"type":"string","format":"uuid"}}},"description":"At most 10 operations, the newest first."}}},"reasons":{"type":"object","additionalProperties":{"type":"integer"},"description":"How many operations each reason was given for: missing:<field> (a value the operation does not carry), possible-match:<position>, explicit-rule-required:<TYPE>, rule-matched, no-matching-rule, no-policy-set."}},"description":"Under the institutional profile's defaults."}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/submit":{"post":{"summary":"Submit a draft for publication","tags":["policies"],"description":"draft → awaiting_quorum, by its author, once valid (422 POLICY_SET_INVALID with the errors otherwise). From then on the set is immutable. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/publish":{"post":{"summary":"Publish a policy set","tags":["policies"],"description":"awaiting_quorum → active, replacing the tenant's active set (archived). When the tenant's quorum applies — an institutional tenant, or two administrators or more — an administrator other than the set's author publishes it (403 POLICY_QUORUM_AUTHOR otherwise); a legacy tenant with a single administrator publishes alone. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"additionalProperties":false,"properties":{"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"A step-up token of the caller's passkey for `policy_set.publish` on this set (POST /v1/auth/step-up/options, then POST /v1/auth/step-up). Required where the tenant's step-up mode is `enforce` (an institutional tenant): 403 `STEP_UP_REQUIRED` without it, `STEP_UP_INVALID` with one that is not for this; under `log` (the default) a missing or wrong one is recorded and nothing is refused."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/archive":{"post":{"summary":"Withdraw a policy set","tags":["policies"],"description":"A draft or a set awaiting its quorum → archived. The active set is archived only when another version is published in its place (409 POLICY_SET_ACTIVE). The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policy-sets/{setId}/rollback":{"post":{"summary":"Roll back to an archived version","tags":["policies"],"description":"Publishes an archived version that was once active again, as a new version (its rules copied), authored by the caller: active at once where the tenant's quorum is off, awaiting another administrator's publication where it applies. The tenant's administrators, on their own tenant (a caller with no tenant is answered 400).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"description":{"type":["string","null"],"maxLength":1000},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"A step-up token of the caller's passkey for `policy_set.rollback` on this set (POST /v1/auth/step-up/options, then POST /v1/auth/step-up). Required where the tenant's step-up mode is `enforce` (an institutional tenant): 403 `STEP_UP_REQUIRED` without it, `STEP_UP_INVALID` with one that is not for this; under `log` (the default) a missing or wrong one is recorded and nothing is refused."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"setId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","version","status","description","authorUserId","requiredApprovals","approverUserIds","submittedAt","activatedAt","archivedAt","createdAt","copiedFromSetId","activatedBy","archivedBy","ruleCount","rules"],"properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"version":{"type":"integer","description":"The set's version: each set is the tenant's next version."},"status":{"type":"string","enum":["draft","awaiting_quorum","active","archived"],"description":"draft (written and edited by its author) → awaiting_quorum (submitted, immutable) → active (the tenant's policy, one at a time) → archived (replaced, or withdrawn). Only a draft is edited."},"description":{"type":["string","null"]},"authorUserId":{"type":["string","null"],"format":"uuid","description":"Who wrote the set."},"requiredApprovals":{"type":"integer","description":"Approvals of administrators other than the author the publication needed: 1 when the tenant's quorum applies, else 0."},"approverUserIds":{"type":"array","items":{"type":"string"},"description":"Who approved it (published it, not being its author)."},"submittedAt":{"type":["string","null"],"format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"archivedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"copiedFromSetId":{"type":["string","null"],"format":"uuid","description":"The version it was copied from (a copy, or a rollback)."},"activatedBy":{"type":["string","null"],"format":"uuid","description":"Who published it."},"archivedBy":{"type":["string","null"],"format":"uuid","description":"Who archived it: withdrew it, or published its replacement."},"ruleCount":{"type":"integer"},"rules":{"type":"array","items":{"type":"object","required":["id","position","name","verdict","operationTypes","initiatorKinds","initiatorIds","sourceKinds","sourceIds","destinationKinds","destinationAddresses","chains","assets","amountMinRef","amountMaxRef","windowScope","windowSeconds","windowMinRef","windowMaxRef","methodSelectors","timeDays","timeFromMinute","timeToMinute","screeningResults","approvalThreshold","approverIds","approversExcludeInitiator","designatedSignerIds"],"properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer","description":"Its place in the set, from 0: the first match decides."},"name":{"type":"string","minLength":1,"maxLength":200},"verdict":{"type":"string","enum":["ALLOW","SCREEN","REQUIRE_APPROVAL","BLOCK","FREEZE"],"description":"ALLOW, SCREEN, REQUIRE_APPROVAL, BLOCK or FREEZE, from the least to the most restrictive. The first rule an operation matches decides; a rule whose condition the operation cannot be checked against (a missing value) never allows, a restrictive one counts."},"operationTypes":{"type":["array","null"],"items":{"type":"string","enum":["TRANSFER","CONTRACT_CALL","APPROVE","TYPED_MESSAGE","RAW","DEPLOY","KEY_EXPORT"]},"description":"The operation types the rule applies to. Under the institutional profile, RAW, TYPED_MESSAGE and KEY_EXPORT need a rule that names them (a rule for any type covers them only when it blocks or freezes). Null: any."},"initiatorKinds":{"type":["array","null"],"items":{"type":"string","enum":["user","group","api_credential","agent","platform"]},"description":"Who starts the operation. Null: any."},"initiatorIds":{"type":["array","null"],"items":{"type":"string"},"description":"The initiators' ids. Null: any."},"sourceKinds":{"type":["array","null"],"items":{"type":"string","enum":["custodial","client_side","mpc","platform","group"]},"description":"Whose key signs: custodial, client_side, mpc, platform, group. Null: any."},"sourceIds":{"type":["array","null"],"items":{"type":"string"},"description":"The source wallets' ids. Null: any."},"destinationKinds":{"type":["array","null"],"items":{"type":"string","enum":["address_book","one_time","internal","contract","dapp"]},"description":"Where the operation goes: internal (a wallet of the tenant), one_time, address_book, contract, dapp. address_book matches a destination that is an active entry of the tenant's address book, whatever its own kind (a listed contract is both contract and address_book) — read for a tenant whose address book is in log or enforce; for any other tenant it matches no destination. Null: any."},"destinationAddresses":{"type":["array","null"],"items":{"type":"string"},"description":"Destination addresses. Null: any."},"chains":{"type":["array","null"],"items":{"type":"string"},"description":"Chain slugs (gnosis, base, solana…). Null: any."},"assets":{"type":["array","null"],"items":{"type":"string"},"description":"'<chain>:<token address>' or '<chain>:native'. Null: any."},"amountMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at least (inclusive)."},"amountMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$","description":"The operation's amount in EUR, at most (inclusive)."},"windowScope":{"type":["string","null"],"enum":["initiator","source","destination",null],"description":"A rolling window's scope. Its total is not recorded yet: such a rule is only ever a possible match."},"windowSeconds":{"type":["integer","null"],"minimum":60,"maximum":31622400},"windowMinRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"windowMaxRef":{"type":["string","null"],"pattern":"^\\d{1,20}(\\.\\d{1,18})?$"},"methodSelectors":{"type":["array","null"],"items":{"type":"string","pattern":"^0x[0-9a-fA-F]{8}$"},"description":"Four-byte function selectors. Null: any."},"timeDays":{"type":["array","null"],"items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekdays (1 = Monday), UTC. Null: any."},"timeFromMinute":{"type":["integer","null"],"minimum":0,"maximum":1439,"description":"Minutes of the UTC day, [from, to); from > to wraps past midnight."},"timeToMinute":{"type":["integer","null"],"minimum":1,"maximum":1440},"screeningResults":{"type":["array","null"],"items":{"type":"string","enum":["PASSED","FLAGGED","PENDING","BYPASSED"]},"description":"Screening results (no screening exists yet: only ever a possible match). Null: any."},"approvalThreshold":{"type":["integer","null"],"minimum":1,"maximum":20,"description":"REQUIRE_APPROVAL only: how many approvals."},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"REQUIRE_APPROVAL's approvers. Null: any."},"approversExcludeInitiator":{"type":"boolean","description":"The initiator never approves its own operation (default true)."},"designatedSignerIds":{"type":["array","null"],"items":{"type":"string"},"description":"Designated signers. Null: any."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/groups":{"get":{"summary":"List the tenant's groups","tags":["groups"],"description":"The tenant's groups of users, by name, with their member counts. A group is a named set of the tenant's users its policy rules can name (initiators, sources, approvers, designated signers); it grants no permission.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","name","description","memberCount","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"memberCount":{"type":"integer"},"createdBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Create a group","tags":["groups"],"description":"A new group, empty. Its name (1–100 characters) is unique in the tenant, whatever its case.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","description","memberCount","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"memberCount":{"type":"integer"},"createdBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"GROUP_NAME_TAKEN","content":{"application/json":{"schema":{"description":"GROUP_NAME_TAKEN","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/groups/{groupId}":{"get":{"summary":"Read a group and its members","tags":["groups"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"groupId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","description","memberCount","createdBy","createdAt","updatedAt","members"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"memberCount":{"type":"integer"},"createdBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"members":{"type":"array","items":{"type":"object","required":["userId","username","role","addedBy","addedAt"],"properties":{"userId":{"type":"string","format":"uuid"},"username":{"type":"string"},"role":{"type":"string"},"addedBy":{"type":["string","null"],"format":"uuid"},"addedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"GROUP_NOT_FOUND","content":{"application/json":{"schema":{"description":"GROUP_NOT_FOUND","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"patch":{"summary":"Rename a group or change its description","tags":["groups"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":["string","null"],"maxLength":500}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"groupId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","description","memberCount","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"memberCount":{"type":"integer"},"createdBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"GROUP_NOT_FOUND","content":{"application/json":{"schema":{"description":"GROUP_NOT_FOUND","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"GROUP_NAME_TAKEN","content":{"application/json":{"schema":{"description":"GROUP_NAME_TAKEN","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Delete a group","tags":["groups"],"description":"The group and its memberships. A policy rule that names it then names no one by it.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"groupId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Deleted"},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"GROUP_NOT_FOUND","content":{"application/json":{"schema":{"description":"GROUP_NOT_FOUND","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/groups/{groupId}/members":{"post":{"summary":"Add a user to a group","tags":["groups"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["userId"],"additionalProperties":false,"properties":{"userId":{"type":"string","format":"uuid"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"groupId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","description","memberCount","createdBy","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"memberCount":{"type":"integer"},"createdBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"GROUP_NOT_FOUND or GROUP_USER_NOT_FOUND (not a user of the tenant)","content":{"application/json":{"schema":{"description":"GROUP_NOT_FOUND or GROUP_USER_NOT_FOUND (not a user of the tenant)","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"GROUP_ALREADY_MEMBER","content":{"application/json":{"schema":{"description":"GROUP_ALREADY_MEMBER","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/groups/{groupId}/members/{userId}":{"delete":{"summary":"Remove a user from a group","tags":["groups"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"groupId","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Removed"},"400":{"description":"GROUP_REQUEST_INVALID: a request written wrong","content":{"application/json":{"schema":{"description":"GROUP_REQUEST_INVALID: a request written wrong","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"GROUP_NOT_FOUND or GROUP_NOT_MEMBER","content":{"application/json":{"schema":{"description":"GROUP_NOT_FOUND or GROUP_NOT_MEMBER","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approval-keys":{"get":{"summary":"List your approval keys","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. Your own keys, newest first, revoked ones included.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","name","status","publicKey","thumbprint","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid","description":"The key, and the `kid` of the decisions it signs."},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last decision it signed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Register an approval key (a public key)","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. You generate a P-256 key pair and register its public key; the Hub never sees the private key. At most 2 active keys: to rotate, register the second, then revoke the first. **Signing a decision.** The approver keeps the private key of one of their approval keys and sends `signature`, a compact JWS signed ES256 (JOSE r‖s): header `{ \"alg\": \"ES256\", \"typ\": \"aurea-approval+jwt\", \"kid\": \"<approval key id>\" }` (no other member), payload the canonical payload's exact bytes, as `GET /v1/approvals/{operationId}` gives them in `payloads.approve` or `payloads.reject` — JSON with its members in this order and no whitespace: `{\"action\":\"approve\"|\"reject\",\"amount\",\"approvalId\",\"asset\",\"chain\",\"chainId\",\"destination\",\"expiresAt\",\"operationId\",\"ruleId\",\"tenantId\",\"v\":1}`. A signature answers one request with one action, and is used once, ever. Refusals: 400 `APPROVAL_KEY_INVALID`, `APPROVAL_KEY_PRIVATE`, `APPROVAL_KEY_NAME_INVALID`; 409 `APPROVAL_KEY_IN_USE` (a key is registered once, ever), `APPROVAL_KEY_LIMIT`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","publicKey"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"publicKey":{"type":"object","description":"The key's P-256 public key as a JWK: `{ \"kty\": \"EC\", \"crv\": \"P-256\", \"x\": \"…\", \"y\": \"…\" }` (`x`, `y`: 32 bytes each, unpadded base64url). `alg` (\"ES256\"), `use` (\"sig\"), `kid`, `key_ops` and `ext` are accepted and dropped. Never the private key: a JWK with `d` is refused (400 `APPROVAL_KEY_PRIVATE`).","properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","status","publicKey","thumbprint","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid","description":"The key, and the `kid` of the decisions it signs."},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last decision it signed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approval-keys/{keyId}/revoke":{"post":{"summary":"Revoke one of your approval keys","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. For good: the decisions it signs are refused from now on. 404 `APPROVAL_KEY_NOT_FOUND`; 409 `APPROVAL_KEY_REVOKED`.","requestBody":{"content":{"application/json":{"schema":{"type":["object","null"],"additionalProperties":false,"properties":{"reason":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"keyId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","name","status","publicKey","thumbprint","createdAt","lastUsedAt","revokedAt","revokeReason"],"properties":{"id":{"type":"string","format":"uuid","description":"The key, and the `kid` of the decisions it signs."},"name":{"type":"string"},"status":{"type":"string","enum":["active","revoked"]},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last decision it signed."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokeReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals":{"get":{"summary":"The operations waiting for your approval","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. The operations an institutional tenant's policy holds for approval that you may decide now: pending and within their window, naming you (or any approver), not your own when the rule keeps the initiator apart, not decided by you yet. Newest first. 400 `APPROVAL_CURSOR_INVALID`.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"cursor","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The approval request (`approvalId` in the payload)."},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"],"description":"pending: waiting for its approvers; approved: the rule's threshold reached, the operation goes on; rejected: an approver rejected it; expired: not approved within its window; withdrawn: its initiator cancelled the operation while it waited (POST /v1/operations/{id}/cancel)."},"origin":{"type":"string","description":"The call that started the operation, e.g. transactions.create"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer","description":"How many distinct approvers must approve."},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"The approvers the rule names; null: any of the tenant's approvers."},"excludeInitiator":{"type":"boolean","description":"The initiator cannot approve its own operation."},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"In EUR, as the policy read it"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time","description":"The end of the approval window; null: no window — the request waits until it is decided."},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}},"nextCursor":{"type":["string","null"],"description":"Pass it as `cursor` for the next page; null on the last."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals/{operationId}":{"get":{"summary":"An operation's approval request, with the payloads to sign","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. The operation's newest approval request in your tenant, its decisions, whether you may decide it now, and the two canonical payloads (`payloads.approve`, `payloads.reject`) a decision signs. 404 `APPROVAL_NOT_FOUND`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The approval request (`approvalId` in the payload)."},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"],"description":"pending: waiting for its approvers; approved: the rule's threshold reached, the operation goes on; rejected: an approver rejected it; expired: not approved within its window; withdrawn: its initiator cancelled the operation while it waited (POST /v1/operations/{id}/cancel)."},"origin":{"type":"string","description":"The call that started the operation, e.g. transactions.create"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer","description":"How many distinct approvers must approve."},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"The approvers the rule names; null: any of the tenant's approvers."},"excludeInitiator":{"type":"boolean","description":"The initiator cannot approve its own operation."},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"In EUR, as the policy read it"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time","description":"The end of the approval window; null: no window — the request waits until it is decided."},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"decisions":{"type":"array","items":{"type":"object","required":["approverId","decision","at"],"properties":{"approverId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject"]},"at":{"type":"string","format":"date-time"}}}},"canDecide":{"type":"boolean"},"payloads":{"type":"object","required":["approve","reject"],"properties":{"approve":{"type":"string"},"reject":{"type":"string"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals/{operationId}/approve":{"post":{"summary":"Approve an operation held for approval","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. Once the rule's threshold of distinct approvers approved, the operation goes on server-side, as the call that started it would have: a custodial send is signed and sent; a client-side or MPC wallet's is prepared for its owner to sign (`GET /v1/operations/{id}/approval`, `result`). **Signing a decision.** The approver keeps the private key of one of their approval keys and sends `signature`, a compact JWS signed ES256 (JOSE r‖s): header `{ \"alg\": \"ES256\", \"typ\": \"aurea-approval+jwt\", \"kid\": \"<approval key id>\" }` (no other member), payload the canonical payload's exact bytes, as `GET /v1/approvals/{operationId}` gives them in `payloads.approve` or `payloads.reject` — JSON with its members in this order and no whitespace: `{\"action\":\"approve\"|\"reject\",\"amount\",\"approvalId\",\"asset\",\"chain\",\"chainId\",\"destination\",\"expiresAt\",\"operationId\",\"ruleId\",\"tenantId\",\"v\":1}`. A signature answers one request with one action, and is used once, ever. **Or with a passkey** (the console): send `stepUpToken` instead — the token your passkey's step-up gave for `approval.approve` or `approval.reject` on this operation (POST /v1/auth/step-up/options, then POST /v1/auth/step-up): its challenge commits to the request and its canonical payload for that action, it lives two minutes and is used once. One or the other: a decision is never taken on the session alone (400 `APPROVAL_SIGNATURE_MALFORMED` with neither, or both). Refusals: 400 `APPROVAL_SIGNATURE_MALFORMED`, `APPROVAL_SIGNATURE_PAYLOAD_MISMATCH`; 403 `APPROVAL_NOT_APPROVER`, `APPROVAL_SIGNATURE_KEY_UNKNOWN`, `APPROVAL_SIGNATURE_INVALID`, `STEP_UP_INVALID`; 404 `APPROVAL_NOT_FOUND`; 409 `APPROVAL_NOT_PENDING`, `APPROVAL_EXPIRED`, `APPROVAL_ALREADY_DECIDED`, `APPROVAL_SIGNATURE_USED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"signature":{"type":"string","minLength":1,"maxLength":4096,"description":"The compact JWS of the decision (see the description)."},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"Instead of `signature`: a step-up token of your passkey for this action on this request (POST /v1/auth/step-up/options with `action` approval.approve or approval.reject and the `operationId`, then POST /v1/auth/step-up)."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The approval request (`approvalId` in the payload)."},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"],"description":"pending: waiting for its approvers; approved: the rule's threshold reached, the operation goes on; rejected: an approver rejected it; expired: not approved within its window; withdrawn: its initiator cancelled the operation while it waited (POST /v1/operations/{id}/cancel)."},"origin":{"type":"string","description":"The call that started the operation, e.g. transactions.create"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer","description":"How many distinct approvers must approve."},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"The approvers the rule names; null: any of the tenant's approvers."},"excludeInitiator":{"type":"boolean","description":"The initiator cannot approve its own operation."},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"In EUR, as the policy read it"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time","description":"The end of the approval window; null: no window — the request waits until it is decided."},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals/{operationId}/reject":{"post":{"summary":"Reject an operation held for approval","tags":["approvals"],"description":"The tenant's approvers: the Approver, and the Owner, the Admin and the Non-signing Admin, on their own tenant. One rejection ends it: the operation is REJECTED (`APPROVAL_REJECTED`), nothing is signed or sent. **Signing a decision.** The approver keeps the private key of one of their approval keys and sends `signature`, a compact JWS signed ES256 (JOSE r‖s): header `{ \"alg\": \"ES256\", \"typ\": \"aurea-approval+jwt\", \"kid\": \"<approval key id>\" }` (no other member), payload the canonical payload's exact bytes, as `GET /v1/approvals/{operationId}` gives them in `payloads.approve` or `payloads.reject` — JSON with its members in this order and no whitespace: `{\"action\":\"approve\"|\"reject\",\"amount\",\"approvalId\",\"asset\",\"chain\",\"chainId\",\"destination\",\"expiresAt\",\"operationId\",\"ruleId\",\"tenantId\",\"v\":1}`. A signature answers one request with one action, and is used once, ever. **Or with a passkey** (the console): send `stepUpToken` instead — the token your passkey's step-up gave for `approval.approve` or `approval.reject` on this operation (POST /v1/auth/step-up/options, then POST /v1/auth/step-up): its challenge commits to the request and its canonical payload for that action, it lives two minutes and is used once. One or the other: a decision is never taken on the session alone (400 `APPROVAL_SIGNATURE_MALFORMED` with neither, or both). Refusals: 400 `APPROVAL_SIGNATURE_MALFORMED`, `APPROVAL_SIGNATURE_PAYLOAD_MISMATCH`, `APPROVAL_REASON_INVALID`; 403 `APPROVAL_NOT_APPROVER`, `APPROVAL_SIGNATURE_KEY_UNKNOWN`, `APPROVAL_SIGNATURE_INVALID`, `STEP_UP_INVALID`; 404 `APPROVAL_NOT_FOUND`; 409 `APPROVAL_NOT_PENDING`, `APPROVAL_EXPIRED`, `APPROVAL_ALREADY_DECIDED`, `APPROVAL_SIGNATURE_USED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"signature":{"type":"string","minLength":1,"maxLength":4096,"description":"The compact JWS of the decision (see the description)."},"stepUpToken":{"type":"string","minLength":1,"maxLength":200,"description":"Instead of `signature`: a step-up token of your passkey for this action on this request (POST /v1/auth/step-up/options with `action` approval.approve or approval.reject and the `operationId`, then POST /v1/auth/step-up)."},"reason":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The approval request (`approvalId` in the payload)."},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"],"description":"pending: waiting for its approvers; approved: the rule's threshold reached, the operation goes on; rejected: an approver rejected it; expired: not approved within its window; withdrawn: its initiator cancelled the operation while it waited (POST /v1/operations/{id}/cancel)."},"origin":{"type":"string","description":"The call that started the operation, e.g. transactions.create"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer","description":"How many distinct approvers must approve."},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"The approvers the rule names; null: any of the tenant's approvers."},"excludeInitiator":{"type":"boolean","description":"The initiator cannot approve its own operation."},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"In EUR, as the policy read it"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time","description":"The end of the approval window; null: no window — the request waits until it is decided."},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/operations/{id}/approval":{"get":{"summary":"An operation's approval, and the answer it went on with","tags":["operations"],"description":"The newest approval request of an operation an institutional tenant's policy held (a money route answered 202): its status, the decisions, and — once approved and gone on — `result`, the answer the call would have given (for a client-side or MPC wallet, the prepared transaction to sign). Your own operations; every operation of your tenant with `tenant.operations.read`. 404 `APPROVAL_NOT_FOUND`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The approval request (`approvalId` in the payload)."},"operationId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","approved","rejected","expired","withdrawn"],"description":"pending: waiting for its approvers; approved: the rule's threshold reached, the operation goes on; rejected: an approver rejected it; expired: not approved within its window; withdrawn: its initiator cancelled the operation while it waited (POST /v1/operations/{id}/cancel)."},"origin":{"type":"string","description":"The call that started the operation, e.g. transactions.create"},"initiatorId":{"type":["string","null"],"format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"policySetVersion":{"type":["integer","null"]},"threshold":{"type":"integer","description":"How many distinct approvers must approve."},"approvals":{"type":"integer"},"rejections":{"type":"integer"},"approverIds":{"type":["array","null"],"items":{"type":"string"},"description":"The approvers the rule names; null: any of the tenant's approvers."},"excludeInitiator":{"type":"boolean","description":"The initiator cannot approve its own operation."},"chain":{"type":["string","null"]},"chainId":{"type":["integer","null"]},"asset":{"type":["string","null"],"description":"native, or the token's address"},"amount":{"type":["string","null"],"description":"In the asset's smallest unit"},"amountRef":{"type":["string","null"],"description":"In EUR, as the policy read it"},"destination":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time","description":"The end of the approval window; null: no window — the request waits until it is decided."},"createdAt":{"type":"string","format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"decisions":{"type":"array","items":{"type":"object","required":["approverId","decision","at"],"properties":{"approverId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject"]},"at":{"type":"string","format":"date-time"}}}},"result":{"type":["object","null"],"properties":{"status":{"type":"integer"},"body":{}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policies/effective":{"get":{"summary":"The tenant's policy as the Hub and the cosigner apply it","tags":["policies"],"description":"The Hub's active policy set and the cosigner-bound policy: the cosigner's own state (`source: cosigner`) when it answers, else the Hub's copy (`source: mirror`). Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["hub","cosigner","versions"],"properties":{"hub":{"type":"object","required":["policySetId","policySetVersion","ruleCount"],"properties":{"policySetId":{"type":["string","null"]},"policySetVersion":{"type":["integer","null"]},"ruleCount":{"type":"integer"}}},"cosigner":{"type":"object","required":["source","status","accepted"],"properties":{"source":{"type":"string","enum":["cosigner","mirror"]},"status":{"type":["object","null"],"additionalProperties":true},"accepted":{"type":["object","null"],"required":["version","policyHash","effectiveAt","policy"],"properties":{"version":{"type":"integer"},"policyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"effectiveAt":{"type":["string","null"],"format":"date-time"},"policy":{"type":"object","additionalProperties":true}}}}},"versions":{"type":"array","items":{"type":"object","required":["version","status","policyHash","effectiveAt","createdAt"],"properties":{"version":{"type":"integer"},"status":{"type":"string"},"policyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"effectiveAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policies/cosigner":{"put":{"summary":"Draft the next version of the cosigner-bound policy","tags":["policies"],"description":"Compiles the next version from these limits and thresholds, the administrators' keys and the address book's cooling period, and answers the canonical document and the challenge the administrators sign. A newer draft replaces an open one. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"limits":{"type":"object","additionalProperties":false,"properties":{"perTx":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."},"daily":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."}},"description":"Per payment, and per wallet per UTC day."},"velocity":{"type":"object","additionalProperties":false,"properties":{"maxTxPerHour":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Per wallet, per UTC clock hour."}}},"newDestinationDelaySeconds":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"How long a new recipient waits before it is active (default: the address book's cooling period)."},"allowlistMode":{"type":"string","enum":["off","delay","strict"],"description":"off: any recipient; delay: a recipient seen for the first time waits newDestinationDelaySeconds; strict: only recipients added with a passkey and active."},"quorum":{"type":"object","additionalProperties":false,"properties":{"above":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"A payment above this needs `approvers` administrators' approval."},"approvers":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"How many administrators sign the next version and approve a held payment (default: 2, or 1 with one key)."}}},"sessionApproval":{"type":"object","additionalProperties":false,"description":"The thresholds of session approvals (one passkey for several small payments to known recipients).","properties":{"maxSeconds":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"The longest session, at most 86400."},"maxPerTx":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."},"maxTotal":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."}}}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["version","status","policy","canonical","policyHash","prevPolicyHash","challenge","approvers","signers","signatures","effectiveAt","cosigner","sourcePolicySetId","createdAt"],"properties":{"version":{"type":"integer"},"status":{"type":"string","enum":["draft","submitted","accepted","refused","superseded"],"description":"draft: waiting for signatures; submitted: signed, the cosigner has not answered yet (sign again to retry); accepted: the cosigner took it (binding from effectiveAt); refused: the cosigner refused it; superseded: a newer draft replaced it."},"policy":{"type":"object","additionalProperties":true,"description":"The document, as signed."},"canonical":{"type":"string","description":"The document's canonical JSON (RFC 8785): the exact bytes hashed."},"policyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"prevPolicyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"challenge":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"What each administrator signs: as a passkey assertion's challenge (its 32 bytes), or with an approval key as ECDSA P-256 over these 32 bytes (the digest, not hashed again)."},"approvers":{"type":"integer","description":"How many signatures it needs."},"signers":{"type":"array","description":"The keys that may sign it.","items":{"type":"object","required":["kid","alg","userId"],"properties":{"kid":{"type":"string"},"alg":{"type":"string","enum":["webauthn-es256","p256-raw"]},"userId":{"type":["string","null"]}}}},"signatures":{"type":"array","items":{"type":"object","required":["kid","userId","signedAt"],"properties":{"kid":{"type":"string"},"userId":{"type":"string"},"signedAt":{"type":"string","format":"date-time"}}}},"effectiveAt":{"type":["string","null"],"format":"date-time"},"cosigner":{"type":"object","required":["status","answer"],"properties":{"status":{"type":["integer","null"]},"answer":{"type":["object","null"],"additionalProperties":true}}},"sourcePolicySetId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policies/cosigner/{version}":{"get":{"summary":"A version of the cosigner-bound policy, with its challenge and signatures","tags":["policies"],"description":"Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":4294967295},"in":"path","name":"version","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["version","status","policy","canonical","policyHash","prevPolicyHash","challenge","approvers","signers","signatures","effectiveAt","cosigner","sourcePolicySetId","createdAt"],"properties":{"version":{"type":"integer"},"status":{"type":"string","enum":["draft","submitted","accepted","refused","superseded"],"description":"draft: waiting for signatures; submitted: signed, the cosigner has not answered yet (sign again to retry); accepted: the cosigner took it (binding from effectiveAt); refused: the cosigner refused it; superseded: a newer draft replaced it."},"policy":{"type":"object","additionalProperties":true,"description":"The document, as signed."},"canonical":{"type":"string","description":"The document's canonical JSON (RFC 8785): the exact bytes hashed."},"policyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"prevPolicyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"challenge":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"What each administrator signs: as a passkey assertion's challenge (its 32 bytes), or with an approval key as ECDSA P-256 over these 32 bytes (the digest, not hashed again)."},"approvers":{"type":"integer","description":"How many signatures it needs."},"signers":{"type":"array","description":"The keys that may sign it.","items":{"type":"object","required":["kid","alg","userId"],"properties":{"kid":{"type":"string"},"alg":{"type":"string","enum":["webauthn-es256","p256-raw"]},"userId":{"type":["string","null"]}}}},"signatures":{"type":"array","items":{"type":"object","required":["kid","userId","signedAt"],"properties":{"kid":{"type":"string"},"userId":{"type":"string"},"signedAt":{"type":"string","format":"date-time"}}}},"effectiveAt":{"type":["string","null"],"format":"date-time"},"cosigner":{"type":"object","required":["status","answer"],"properties":{"status":{"type":["integer","null"]},"answer":{"type":["object","null"],"additionalProperties":true}}},"sourcePolicySetId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policies/cosigner/{version}/signatures":{"post":{"summary":"Sign a version of the cosigner-bound policy","tags":["policies"],"description":"One administrator's signature over the version's `challenge`, with one of their own keys the version's signers name. At the version's `approvers` signatures the Hub sends it to the cosigner and answers what it said (accepted, with effectiveAt; version 1 binds 72 hours after, and every administrator is emailed). Sending a signature again on a submitted version retries the hand-over. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["signature"],"additionalProperties":false,"properties":{"signature":{"type":"object","required":["kid","alg","signature"],"additionalProperties":true,"properties":{"kid":{"type":"string","description":"The key's id as the document names it."},"alg":{"type":"string","enum":["webauthn-es256","p256-raw","session-p256"]},"credentialId":{"type":"string"},"authenticatorData":{"type":"string"},"clientDataJSON":{"type":"string"},"signature":{"type":"string"}},"description":"webauthn-es256: the passkey assertion's credentialId, authenticatorData, clientDataJSON and signature (base64url, the signature DER); p256-raw: `signature`, base64url r‖s."}}}}},"required":true},"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":4294967295},"in":"path","name":"version","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["version","status","policy","canonical","policyHash","prevPolicyHash","challenge","approvers","signers","signatures","effectiveAt","cosigner","sourcePolicySetId","createdAt"],"properties":{"version":{"type":"integer"},"status":{"type":"string","enum":["draft","submitted","accepted","refused","superseded"],"description":"draft: waiting for signatures; submitted: signed, the cosigner has not answered yet (sign again to retry); accepted: the cosigner took it (binding from effectiveAt); refused: the cosigner refused it; superseded: a newer draft replaced it."},"policy":{"type":"object","additionalProperties":true,"description":"The document, as signed."},"canonical":{"type":"string","description":"The document's canonical JSON (RFC 8785): the exact bytes hashed."},"policyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"prevPolicyHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"challenge":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"What each administrator signs: as a passkey assertion's challenge (its 32 bytes), or with an approval key as ECDSA P-256 over these 32 bytes (the digest, not hashed again)."},"approvers":{"type":"integer","description":"How many signatures it needs."},"signers":{"type":"array","description":"The keys that may sign it.","items":{"type":"object","required":["kid","alg","userId"],"properties":{"kid":{"type":"string"},"alg":{"type":"string","enum":["webauthn-es256","p256-raw"]},"userId":{"type":["string","null"]}}}},"signatures":{"type":"array","items":{"type":"object","required":["kid","userId","signedAt"],"properties":{"kid":{"type":"string"},"userId":{"type":"string"},"signedAt":{"type":"string","format":"date-time"}}}},"effectiveAt":{"type":["string","null"],"format":"date-time"},"cosigner":{"type":"object","required":["status","answer"],"properties":{"status":{"type":["integer","null"]},"answer":{"type":["object","null"],"additionalProperties":true}}},"sourcePolicySetId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/policies/holds":{"get":{"summary":"Payments the cosigner held","tags":["approvals"],"description":"The tenant's approvers see every hold; anyone else the holds of their own wallets (a client looks for its signature's hold with `sessionId`). With `sessionId`, the session's owner also gets the cosigner's refusal of that session (`kind: refusal`: a step-up, or a refusal with no way but help@aureahub.com) until the session expires. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"in":"query","name":"sessionId","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","enum":["pending","released","rejected","expired"]},"in":"query","name":"status","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["holdId","walletId","sessionId","digest","reason","next","until","expiresAt","status","releasedBy","approvals","approvers","decisions","createdAt","updatedAt"],"properties":{"holdId":{"type":"string"},"walletId":{"type":"string"},"sessionId":{"type":["string","null"]},"digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"reason":{"type":"string","description":"destination_not_active, destination_cooling, over_limit, over_daily or needs_quorum; for a refusal (`kind: refusal`), the cosigner's reason (e.g. session_recipient, session_over_tx, approval, tenant)."},"next":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["step_up","wait_until","add_destination","ask_admin","contact_support"]},"until":{"type":"string"},"email":{"type":"string"}},"description":"The button the client shows: wait_until \"Remind me at <until>\", add_destination \"Add to address book\", ask_admin \"Ask an admin\", contact_support \"Contact help@aureahub.com\"."},"until":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["pending","released","rejected","expired"]},"releasedBy":{"type":["string","null"],"enum":["quorum","time",null]},"approvals":{"type":"integer"},"approvers":{"type":["integer","null"]},"decisions":{"type":"array","items":{"type":"object","required":["userId","kid","decision","at"],"properties":{"userId":{"type":"string"},"kid":{"type":"string"},"decision":{"type":"string","enum":["approve","reject"]},"at":{"type":"string","format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"kind":{"type":"string","enum":["refusal"],"description":"Present only on a refusal: the cosigner refused the signature session without holding it (GET /v1/policies/holds?sessionId= and GET /v1/approvals/holds/{holdId}, for the session's owner, until the session expires). Never approvable; `next.action` is step_up (sign again with a full passkey approval) or contact_support."},"code":{"type":"string","description":"A refusal's code: step_up_required, hold_rejected, hold_unreadable, policy, frozen, recovery, claim, mtls or refused."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals/holds/{holdId}":{"get":{"summary":"A payment the cosigner held","tags":["approvals"],"description":"Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"in":"path","name":"holdId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["holdId","walletId","sessionId","digest","reason","next","until","expiresAt","status","releasedBy","approvals","approvers","decisions","createdAt","updatedAt"],"properties":{"holdId":{"type":"string"},"walletId":{"type":"string"},"sessionId":{"type":["string","null"]},"digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"reason":{"type":"string","description":"destination_not_active, destination_cooling, over_limit, over_daily or needs_quorum; for a refusal (`kind: refusal`), the cosigner's reason (e.g. session_recipient, session_over_tx, approval, tenant)."},"next":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["step_up","wait_until","add_destination","ask_admin","contact_support"]},"until":{"type":"string"},"email":{"type":"string"}},"description":"The button the client shows: wait_until \"Remind me at <until>\", add_destination \"Add to address book\", ask_admin \"Ask an admin\", contact_support \"Contact help@aureahub.com\"."},"until":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["pending","released","rejected","expired"]},"releasedBy":{"type":["string","null"],"enum":["quorum","time",null]},"approvals":{"type":"integer"},"approvers":{"type":["integer","null"]},"decisions":{"type":"array","items":{"type":"object","required":["userId","kid","decision","at"],"properties":{"userId":{"type":"string"},"kid":{"type":"string"},"decision":{"type":"string","enum":["approve","reject"]},"at":{"type":"string","format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"kind":{"type":"string","enum":["refusal"],"description":"Present only on a refusal: the cosigner refused the signature session without holding it (GET /v1/policies/holds?sessionId= and GET /v1/approvals/holds/{holdId}, for the session's owner, until the session expires). Never approvable; `next.action` is step_up (sign again with a full passkey approval) or contact_support."},"code":{"type":"string","description":"A refusal's code: step_up_required, hold_rejected, hold_unreadable, policy, frozen, recovery, claim, mtls or refused."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/approvals/{holdId}/decision":{"post":{"summary":"Approve or reject a payment the cosigner held","tags":["approvals"],"description":"An administrator's decision on a hold whose next step is `ask_admin`, with a passkey assertion (or an approval key's p256-raw signature) over the hold's challenge `H(\"aurea-mpc-hold-approval/v1\" 0x00 ‖ lp16(tenantId) ‖ lp16(walletId) ‖ lp16(holdId) ‖ digest)`. The cosigner releases the hold at the policy's approvers; the payment's owner then signs it again with `holdId`. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["decision","assertion"],"additionalProperties":false,"properties":{"decision":{"type":"string","enum":["approve","reject"]},"assertion":{"type":"object","required":["alg"],"additionalProperties":true,"properties":{"kid":{"type":"string","description":"The key's id as the document names it."},"alg":{"type":"string","enum":["webauthn-es256","p256-raw","session-p256"]},"credentialId":{"type":"string"},"authenticatorData":{"type":"string"},"clientDataJSON":{"type":"string"},"signature":{"type":"string"}},"description":"webauthn-es256: the passkey assertion's credentialId, authenticatorData, clientDataJSON and signature (base64url, the signature DER); p256-raw: `signature`, base64url r‖s."}}}}},"required":true},"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64},"in":"path","name":"holdId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["holdId","walletId","sessionId","digest","reason","next","until","expiresAt","status","releasedBy","approvals","approvers","decisions","createdAt","updatedAt"],"properties":{"holdId":{"type":"string"},"walletId":{"type":"string"},"sessionId":{"type":["string","null"]},"digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"reason":{"type":"string","description":"destination_not_active, destination_cooling, over_limit, over_daily or needs_quorum; for a refusal (`kind: refusal`), the cosigner's reason (e.g. session_recipient, session_over_tx, approval, tenant)."},"next":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["step_up","wait_until","add_destination","ask_admin","contact_support"]},"until":{"type":"string"},"email":{"type":"string"}},"description":"The button the client shows: wait_until \"Remind me at <until>\", add_destination \"Add to address book\", ask_admin \"Ask an admin\", contact_support \"Contact help@aureahub.com\"."},"until":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["pending","released","rejected","expired"]},"releasedBy":{"type":["string","null"],"enum":["quorum","time",null]},"approvals":{"type":"integer"},"approvers":{"type":["integer","null"]},"decisions":{"type":"array","items":{"type":"object","required":["userId","kid","decision","at"],"properties":{"userId":{"type":"string"},"kid":{"type":"string"},"decision":{"type":"string","enum":["approve","reject"]},"at":{"type":"string","format":"date-time"}}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"kind":{"type":"string","enum":["refusal"],"description":"Present only on a refusal: the cosigner refused the signature session without holding it (GET /v1/policies/holds?sessionId= and GET /v1/approvals/holds/{holdId}, for the session's owner, until the session expires). Never approvable; `next.action` is step_up (sign again with a full passkey approval) or contact_support."},"code":{"type":"string","description":"A refusal's code: step_up_required, hold_rejected, hold_unreadable, policy, frozen, recovery, claim, mtls or refused."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/mpc/wallets/{walletId}/destinations":{"get":{"summary":"The recipients added to an MPC wallet with a passkey","tags":["mpc"],"description":"As the cosigner recorded them: a payment to one needs no wait from `activeAt`. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["walletId","chainId","address","label","addedAt","activeAt"],"properties":{"walletId":{"type":"string"},"chainId":{"type":"string"},"address":{"type":"string"},"label":{"type":"string"},"addedAt":{"type":"string","format":"date-time"},"activeAt":{"type":"string","format":"date-time","description":"From when payments to it need no wait."}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Add a recipient to an MPC wallet, approved with its passkey","tags":["mpc"],"description":"The wallet's owner approves `destination_add` with the passkey bound to the wallet: its approval over `H(\"aurea-mpc-destination/v1\" 0x00 ‖ lp16(walletId) ‖ lp16(chainId) ‖ address[20])`. The cosigner records it (binding) and it is active after the policy's new destination delay. Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["intent","approval"],"additionalProperties":false,"properties":{"intent":{"type":"object","required":["v","kind","chainId","address"],"additionalProperties":false,"properties":{"v":{"type":"integer","enum":[1]},"kind":{"type":"string","enum":["destination_add"]},"chainId":{"type":"string","pattern":"^[1-9][0-9]{0,18}$"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"label":{"type":"string","maxLength":100}}},"approval":{"type":"object","required":["alg"],"additionalProperties":true,"properties":{"alg":{"type":"string","enum":["webauthn-es256","p256-raw"]}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["walletId","chainId","address","label","addedAt","activeAt"],"properties":{"walletId":{"type":"string"},"chainId":{"type":"string"},"address":{"type":"string"},"label":{"type":"string"},"addedAt":{"type":"string","format":"date-time"},"activeAt":{"type":"string","format":"date-time","description":"From when payments to it need no wait."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/mpc/wallets/{walletId}/session-approval":{"get":{"summary":"An MPC wallet's session approval thresholds","tags":["mpc"],"description":"For the wallet's owner: the thresholds of session approvals (one passkey for several small payments to recipients added with it) the cosigner applies to this wallet — its own effective policy (`status.effective`, `source: cosigner`) when it answers, else the Hub's accepted copy (`accepted.policy`). Only `sessionApproval` of the policy is answered; a policy without it answers `{}` (no session). Exists where the platform has switched the cosigner-bound policy on; otherwise answers 404 as a route that does not exist.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"walletId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["walletId","cosigner"],"properties":{"walletId":{"type":"string"},"cosigner":{"type":"object","required":["source","status","accepted"],"properties":{"source":{"type":"string","enum":["cosigner","mirror"]},"status":{"type":["object","null"],"required":["effective"],"properties":{"effective":{"type":["object","null"],"properties":{"sessionApproval":{"type":"object","required":["maxPerTx","maxTotal"],"properties":{"maxSeconds":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"maxPerTx":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."},"maxTotal":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."}}}}}}},"accepted":{"type":["object","null"],"required":["version","effectiveAt","policy"],"properties":{"version":{"type":"integer"},"effectiveAt":{"type":["string","null"],"format":"date-time"},"policy":{"type":"object","properties":{"sessionApproval":{"type":"object","required":["maxPerTx","maxTotal"],"properties":{"maxSeconds":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"maxPerTx":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."},"maxTotal":{"type":"object","additionalProperties":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"description":"Base units per asset: keys `<chainId>:<asset>` (`asset` = `native` or the token's 0x address), values decimal strings, e.g. `{ \"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\": \"1000000000\" }`."}}}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/operations/{id}/callback":{"get":{"summary":"An operation's institution callback, and the answer it went on with","tags":["operations"],"description":"The institution callback request an operation was held on — your callback answered RETRY at the call's first signature, and the money route answered 202 with `subState` `awaiting_callback`: its status (pending, approved, rejected, ignored, expired, failed, cancelled), attempts, next attempt, deadline and reason, and — once your endpoint approved and the operation went on — `result`, the answer the call would have given. For a client-side or MPC wallet that is what the wallet signs: the prepared transaction (or permit) with its `expiresAt` — sign it and send it before then, as the call's own answer would have been used. Your own operations; every operation of your tenant with `tenant.operations.read`. 404 `INSTITUTION_CALLBACK_REQUEST_NOT_FOUND` when no callback held the operation (or it is not yours to read).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["operationId","requestId","environment","status","attempts","nextPollAt","deadlineAt","reason","decidedAt","result"],"properties":{"operationId":{"type":"string","format":"uuid"},"requestId":{"type":"string","format":"uuid","description":"The request's id: the 202's `callback.requestId`, the `requestId` your endpoint was asked with"},"environment":{"type":"string","enum":["production","sandbox"],"description":"production: the signatures on main networks; sandbox: on test networks"},"status":{"type":"string","enum":["pending","approved","rejected","ignored","expired","failed","cancelled"]},"attempts":{"type":"integer"},"nextPollAt":{"type":["string","null"],"format":"date-time","description":"When your endpoint is asked again, while pending"},"deadlineAt":{"type":"string","format":"date-time"},"reason":{"type":["string","null"],"description":"The reason code your endpoint's answer gave"},"decidedAt":{"type":["string","null"],"format":"date-time"},"result":{"type":["object","null"],"description":"Once approved and gone on: the status and body the call would have answered (for a client-side or MPC wallet, the preparation to sign)","properties":{"status":{"type":"integer"},"body":{}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests":{"get":{"summary":"The tenant's quorum requests","tags":["quorum"],"description":"The covered actions the tenant's own administrators took (observed) or asked for (held for another administrator), newest first: users and roles, credentials and secrets, custody (where Aurea enables the tenant's quorum; an institutional tenant's is enforced).","parameters":[{"schema":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"in":"query","name":"state","required":false},{"schema":{"type":"string","enum":["users.tenant_user.create","users.tenant_invitation.create","users.platform_invitation.create","users.tenant_user.delete","users.role.change","users.email_change.start","users.email_change.cancel","users.mfa.reset","users.passkeys.reset","users.passkey_address.change","users.passkey_address.remove","users.password_reset.send","users.password_reset.send_support","users.account.update","users.account.delete","users.tenant_user.create_own","credentials.service.change","credentials.service.delete","credentials.noah_signing_key.generate","credentials.api_key.rotate","credentials.api_secret.rotate","credentials.webhook.save","credentials.webhook.delete","credentials.webhook_secret.rotate","credentials.webhook_endpoint.create","credentials.webhook_endpoint.change","credentials.webhook_endpoint.delete","credentials.webhook_endpoint_secret.rotate","tenant.wallet_embed_key.create","tenant.wallet_embed_key.origins","tenant.wallet_embed_key.revoke","credentials.identity_platform.change","credentials.identity_webhook_endpoint.change","credentials.bank_ramp_webhook_secret.change","credentials.server_credential.create","credentials.server_credential.update","credentials.wallet_key.rotate","custody.tenant_config.change","custody.mpc_recovery_key.register","custody.mpc_recovery_kit.export","custody.mpc_cosigner.change","tenants.status.change","tenants.tenant.delete","policy.security_profile.lower","policy.security_control.lower","policy.rate_limit.raise","policy.message_signing_rule.add","policy.tenant_freeze.lift","policy.tenant_freeze.lift_in_tenant","policy.institution_callback.change","policy.policy_set.publish","policy.policy_set.rollback","address_book.entry.approve","address_book.settings.change","address_book.settings.approve","address_book.enforcement.lower","swap_routes.enforcement.lower","gas_station.funding_wallet.create","gas_station.funding_wallet.create_own","gas_station.platform_funding_wallet.create","gas_station.mode.change","structures.omnibus_adjustment.record","structures.structure.change","structures.collection_accounts.add","structures.collection_accounts.remove"]},"in":"query","name":"action","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"requestedBy","required":false},{"schema":{"type":"string","maxLength":200},"in":"query","name":"cursor","required":false,"description":"The `nextCursor` of the previous page"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string","description":"The action key, e.g. users.role.change"},"group":{"type":["string","null"],"description":"users_and_roles, credentials_and_secrets or policy_and_custody"},"state":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"mode":{"type":"string","enum":["log","enforce"],"description":"The quorum's mode when it was asked: log (observed) or enforce (held for another administrator's approval); enforce with observed: no other active administrator could approve it, so it ran as observed"},"target":{"type":"object","properties":{"tenantId":{"type":["string","null"]},"userId":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"resourceId":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"What the action changes, by name (never a secret)"},"requestedBy":{"type":"string","format":"uuid"},"requestedAt":{"type":"string","format":"date-time"},"route":{"type":"string","description":"METHOD and route pattern"},"requestId":{"type":["string","null"]},"requiredApprovals":{"type":"integer"},"approvals":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"executedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"],"description":"The HTTP status the approved action answered"},"secretAnswer":{"type":"boolean","description":"The answer carries a new secret: only the requester reads it, once"},"resultAvailable":{"type":"boolean","description":"The answer waits for its requester (POST …/result)"},"resultReadAt":{"type":["string","null"],"format":"date-time"},"error":{"type":["object","null"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"decisions":{"type":"array","items":{"type":"object","properties":{"adminId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject","cancel"]},"reason":{"type":["string","null"]},"decidedAt":{"type":"string","format":"date-time"}}}}}}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests/{id}":{"get":{"summary":"One of the tenant's quorum requests, with its decisions","tags":["quorum"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string","description":"The action key, e.g. users.role.change"},"group":{"type":["string","null"],"description":"users_and_roles, credentials_and_secrets or policy_and_custody"},"state":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"mode":{"type":"string","enum":["log","enforce"],"description":"The quorum's mode when it was asked: log (observed) or enforce (held for another administrator's approval); enforce with observed: no other active administrator could approve it, so it ran as observed"},"target":{"type":"object","properties":{"tenantId":{"type":["string","null"]},"userId":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"resourceId":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"What the action changes, by name (never a secret)"},"requestedBy":{"type":"string","format":"uuid"},"requestedAt":{"type":"string","format":"date-time"},"route":{"type":"string","description":"METHOD and route pattern"},"requestId":{"type":["string","null"]},"requiredApprovals":{"type":"integer"},"approvals":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"executedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"],"description":"The HTTP status the approved action answered"},"secretAnswer":{"type":"boolean","description":"The answer carries a new secret: only the requester reads it, once"},"resultAvailable":{"type":"boolean","description":"The answer waits for its requester (POST …/result)"},"resultReadAt":{"type":["string","null"],"format":"date-time"},"error":{"type":["object","null"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"decisions":{"type":"array","items":{"type":"object","properties":{"adminId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject","cancel"]},"reason":{"type":["string","null"]},"decidedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests/{id}/approve":{"post":{"summary":"Approve another administrator's request","tags":["quorum"],"description":"Another active administrator of the tenant whose role could take the action, with their password (checked as the login checks it; a wrong one counts toward the login throttle). Never the requester. Once approved, the action runs now, as its requester with its role as it is now; the answer shows how it ended, never its body.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["password"],"properties":{"password":{"type":"string","minLength":1,"maxLength":200,"description":"The deciding administrator's own password"},"reason":{"type":"string","maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string","description":"The action key, e.g. users.role.change"},"group":{"type":["string","null"],"description":"users_and_roles, credentials_and_secrets or policy_and_custody"},"state":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"mode":{"type":"string","enum":["log","enforce"],"description":"The quorum's mode when it was asked: log (observed) or enforce (held for another administrator's approval); enforce with observed: no other active administrator could approve it, so it ran as observed"},"target":{"type":"object","properties":{"tenantId":{"type":["string","null"]},"userId":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"resourceId":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"What the action changes, by name (never a secret)"},"requestedBy":{"type":"string","format":"uuid"},"requestedAt":{"type":"string","format":"date-time"},"route":{"type":"string","description":"METHOD and route pattern"},"requestId":{"type":["string","null"]},"requiredApprovals":{"type":"integer"},"approvals":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"executedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"],"description":"The HTTP status the approved action answered"},"secretAnswer":{"type":"boolean","description":"The answer carries a new secret: only the requester reads it, once"},"resultAvailable":{"type":"boolean","description":"The answer waits for its requester (POST …/result)"},"resultReadAt":{"type":["string","null"],"format":"date-time"},"error":{"type":["object","null"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"decisions":{"type":"array","items":{"type":"object","properties":{"adminId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject","cancel"]},"reason":{"type":["string","null"]},"decidedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests/{id}/reject":{"post":{"summary":"Reject another administrator's request","tags":["quorum"],"description":"With the rejecting administrator's password. Nothing runs; the held input is deleted.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["password"],"properties":{"password":{"type":"string","minLength":1,"maxLength":200,"description":"The deciding administrator's own password"},"reason":{"type":"string","maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string","description":"The action key, e.g. users.role.change"},"group":{"type":["string","null"],"description":"users_and_roles, credentials_and_secrets or policy_and_custody"},"state":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"mode":{"type":"string","enum":["log","enforce"],"description":"The quorum's mode when it was asked: log (observed) or enforce (held for another administrator's approval); enforce with observed: no other active administrator could approve it, so it ran as observed"},"target":{"type":"object","properties":{"tenantId":{"type":["string","null"]},"userId":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"resourceId":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"What the action changes, by name (never a secret)"},"requestedBy":{"type":"string","format":"uuid"},"requestedAt":{"type":"string","format":"date-time"},"route":{"type":"string","description":"METHOD and route pattern"},"requestId":{"type":["string","null"]},"requiredApprovals":{"type":"integer"},"approvals":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"executedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"],"description":"The HTTP status the approved action answered"},"secretAnswer":{"type":"boolean","description":"The answer carries a new secret: only the requester reads it, once"},"resultAvailable":{"type":"boolean","description":"The answer waits for its requester (POST …/result)"},"resultReadAt":{"type":["string","null"],"format":"date-time"},"error":{"type":["object","null"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"decisions":{"type":"array","items":{"type":"object","properties":{"adminId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject","cancel"]},"reason":{"type":["string","null"]},"decidedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests/{id}/cancel":{"post":{"summary":"Cancel one's own request","tags":["quorum"],"description":"The requester only. Nothing runs; the held input is deleted.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"reason":{"type":"string","maxLength":500}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string","description":"The action key, e.g. users.role.change"},"group":{"type":["string","null"],"description":"users_and_roles, credentials_and_secrets or policy_and_custody"},"state":{"type":"string","enum":["observed","awaiting_quorum","approved","rejected","expired","executed","failed","cancelled"]},"mode":{"type":"string","enum":["log","enforce"],"description":"The quorum's mode when it was asked: log (observed) or enforce (held for another administrator's approval); enforce with observed: no other active administrator could approve it, so it ran as observed"},"target":{"type":"object","properties":{"tenantId":{"type":["string","null"]},"userId":{"type":["string","null"]},"resourceType":{"type":["string","null"]},"resourceId":{"type":["string","null"]}}},"details":{"type":"object","additionalProperties":true,"description":"What the action changes, by name (never a secret)"},"requestedBy":{"type":"string","format":"uuid"},"requestedAt":{"type":"string","format":"date-time"},"route":{"type":"string","description":"METHOD and route pattern"},"requestId":{"type":["string","null"]},"requiredApprovals":{"type":"integer"},"approvals":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"executedAt":{"type":["string","null"],"format":"date-time"},"resultStatus":{"type":["integer","null"],"description":"The HTTP status the approved action answered"},"secretAnswer":{"type":"boolean","description":"The answer carries a new secret: only the requester reads it, once"},"resultAvailable":{"type":"boolean","description":"The answer waits for its requester (POST …/result)"},"resultReadAt":{"type":["string","null"],"format":"date-time"},"error":{"type":["object","null"],"properties":{"code":{"type":["string","null"]},"message":{"type":["string","null"]}}},"decisions":{"type":"array","items":{"type":"object","properties":{"adminId":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["approve","reject","cancel"]},"reason":{"type":["string","null"]},"decidedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/quorum/requests/{id}/result":{"post":{"summary":"Read once the answer of one's own approved request","tags":["quorum"],"description":"The requester only: the status and the body the action answered when it ran after the approval — a new API key or secret, a webhook's secret — deleted as it is read. A second read answers 404.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer"},"body":{}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/quotes":{"get":{"summary":"The price of the pairs the tenant offers","tags":["card-onramp"],"description":"An estimate, before the widget opens: for each pair offered (or the one named), how much crypto the amount buys, the transaction fee and the network fee, all as the payment provider writes them. The widget may show a slightly different price if the quote expires first. Only the pairs sold in sourceCurrency (or the tenant's default currency) are quoted: the rest could not be bought in that currency. 403 CARD_ONRAMP_OFF where the tenant does not offer the onramp; 400 CARD_ONRAMP_PAIR_UNAVAILABLE, CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY (for the pair named), CARD_ONRAMP_AMOUNT_INVALID.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string"},"in":"query","name":"pair","required":false},{"schema":{"type":"string","enum":["eur","usd"]},"in":"query","name":"sourceCurrency","required":false},{"schema":{"type":"string"},"in":"query","name":"sourceAmount","required":false,"description":"Fiat, at most 2 decimals; 100 when omitted"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","sourceCurrency","sourceAmount","quotes"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"quotes":{"type":"array","items":{"type":"object","required":["pair","destinationCurrency","destinationNetwork","destinationAmount","networkFee","transactionFee","sourceTotalAmount"],"properties":{"pair":{"type":"string"},"destinationCurrency":{"type":"string"},"destinationNetwork":{"type":"string"},"destinationAmount":{"type":"string"},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]},"sourceTotalAmount":{"type":"string"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/sessions":{"post":{"summary":"Open a card onramp session for one of the user's wallets, or an address they proved","tags":["card-onramp"],"description":"Creates a card onramp session that delivers pair's crypto to the destination named — walletId, one of the user's Aurea wallets whose key the Hub holds or has seen proven (a watch-only import is refused), or addressId, an address the user proved they control (POST /v1/ramp/card/addresses/verify) where the tenant allows it; exactly one of the two (400 CARD_ONRAMP_DESTINATION_INVALID otherwise). An EVM destination for an EVM network, a Solana one for Solana. The session is locked to that address and that network: the user cannot change either in the widget. sourceAmount (fiat, at most 2 decimals) or destinationAmount (crypto): in the first payment provider's widget only a suggestion the user can change, with the currency; in the second's (sessions that open only in the hosted page) the currency and a sourceAmount are fixed. The payment provider checks the user's country from the request's IP address and does the KYC, the payment and the delivery. Answers 201 with the session, the client secret and the publishable key to open the widget with — null where the payment provider's widget opens only in the hosted page (POST /v1/ramp/card/sessions/{id}/hosted-link). 403 CARD_ONRAMP_OFF where the tenant does not offer the onramp in that environment; 400 CARD_ONRAMP_PAIR_UNAVAILABLE (with details.available), CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY when the pair is not sold in sourceCurrency (or the tenant's default currency) in that environment — each pair's sourceCurrencies in GET /config says where it is, with details.sourceCurrencies — CARD_ONRAMP_DESTINATION_NOT_ALLOWED, CARD_ONRAMP_AMOUNT_INVALID; 404 CARD_ONRAMP_WALLET_NOT_FOUND or CARD_ONRAMP_ADDRESS_NOT_FOUND; 403 CARD_ONRAMP_PROVEN_ADDRESSES_OFF for an addressId where the tenant does not allow proven addresses; and the payment provider's own refusals: 403 CARD_ONRAMP_CUSTOMER_UNSUPPORTED (this user's country cannot be served), 400 CARD_ONRAMP_INVALID_REQUEST, 503 CARD_ONRAMP_DISABLED / CARD_ONRAMP_MERCHANT_NOT_SET_UP / CARD_ONRAMP_AUTHENTICATION_FAILED, 502 when the payment provider cannot be reached.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["pair"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"walletId":{"type":"string","format":"uuid","description":"One of the user's Aurea wallets — or addressId instead"},"addressId":{"type":"string","format":"uuid","description":"An address the user proved — or walletId instead"},"pair":{"type":"string","description":"currency/network, one of GET /v1/ramp/card/config's pairs"},"sourceCurrency":{"type":"string","enum":["eur","usd"]},"sourceAmount":{"type":"string","description":"Fiat, for example 50.00"},"destinationAmount":{"type":"string","description":"Crypto, for example 25.5"}}}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the session it made, with a fresh client secret and idempotency-replayed: true, and the payment provider is not asked for a second one. The same key with a different request answers 409 IDEMPOTENCY_KEY_REUSED; a key whose session the payment provider refused, 409 CARD_ONRAMP_SESSION_FAILED; a key that is not one, 400 IDEMPOTENCY_KEY_INVALID. Every other check is made before a key is replayed."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"The user's onramp sessions in one environment","tags":["card-onramp"],"description":"Newest first, as stored — the payment provider is not asked; read one session to refresh it. No client secret is answered here.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["sessions","total"],"properties":{"sessions":{"type":"array","items":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/sessions/{id}":{"get":{"summary":"One of the user's onramp sessions, as it stands now","tags":["card-onramp"],"description":"The session, read again from the payment provider while it is not final (its status only moves forward). While it is initialized or requires_payment the answer carries the client secret and publishable key, so the app can open the widget again where the user left it. 404 CARD_ONRAMP_SESSION_NOT_FOUND for a session that is not the user's.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/config":{"get":{"summary":"What the app needs to offer the card onramp","tags":["card-onramp"],"description":"Whether the user's tenant offers the card-to-crypto onramp in the environment isTestnet names, and with what: the publishable key the payment widget is loaded with (StripeOnramp(publishableKey), from the provider's script https://crypto-js.stripe.com/crypto-onramp-outer.js), the fiat currency it opens with and the pairs offered, each with the Hub's name of its network so the app can pick the user's wallet, and provenAddresses: whether the user may also receive at an address they proved (S7). When switchedOn is false the app hides the onramp; publishableKey is then null, pairs empty and provenAddresses false. 403 for a token without a tenant.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"true for the sandbox"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","switchedOn","publishableKey","defaultSourceCurrency","pairs","provenAddresses"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"switchedOn":{"type":"boolean"},"provenAddresses":{"type":"boolean"},"publishableKey":{"type":["string","null"]},"defaultSourceCurrency":{"type":["string","null"],"enum":["eur","usd",null]},"pairs":{"type":"array","items":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/sessions/{id}/hosted-link":{"post":{"summary":"A link to the hosted page for one of the user's open sessions","tags":["card-onramp"],"description":"For an app without a web page of its own: open the answered `url` in a browser or an in-app browser. It shows the payment widget for the session with the tenant's name and logo, and after the session is paid, delivered or refused sends the browser to `returnUrl` with `onrampSession` and `status` added to its query. The link works for 30 minutes; its token is in the URL's fragment. `returnUrl` must be one of the tenant's allowed return URLs (400 RETURN_URL_NOT_ALLOWED otherwise, and always while the tenant allows none); without it, the page tells the user to close it. 409 CARD_ONRAMP_SESSION_CLOSED when the session is no longer initialized or requires_payment; 404 CARD_ONRAMP_SESSION_NOT_FOUND for another user's session; 400 CARD_ONRAMP_HOSTED_LINK_INVALID (with details.field) for a body with an unknown field, locale or theme.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"returnUrl":{"type":"string","minLength":1,"maxLength":2048,"description":"Where to send the browser back: a deep link or an https URL the tenant allows"},"locale":{"type":"string","enum":["en","it"],"default":"en"},"theme":{"type":"string","enum":["light","dark"],"default":"light"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["url","expiresAt"],"properties":{"url":{"type":"string","description":"The hosted page, with the link's token in the fragment"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/hosted/session":{"post":{"summary":"What the hosted page needs, for the link's token","tags":["card-onramp"],"description":"Called by the hosted page itself, with the token of its link: the session's status, read again from the payment provider while it is not final, with what the user buys, for how much and where it goes (never an internal id); the client secret and publishable key while it can still be paid in the first provider's widget, or — with widget true — the URL of the second provider's widget, made for the address the request came from (single use, five minutes); where to send the browser back; the page's language and theme; the tenant's name and logo. 404 CARD_ONRAMP_LINK_NOT_FOUND for a token no link has, 410 CARD_ONRAMP_LINK_EXPIRED after 30 minutes, 403 CARD_ONRAMP_ORIGIN_NOT_ALLOWED for a request a browser sends from another site, 400 CARD_ONRAMP_CUSTOMER_IP_REQUIRED when a widget is asked from no public address. At most 30 a minute per address.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["token"],"additionalProperties":false,"properties":{"token":{"type":"string","maxLength":64},"widget":{"type":"boolean","description":"true on the page's first read: makes the second provider's widget when the session is its and can be paid"}}}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey","widgetUrl","poweredBy","returnUrl","locale","theme","tenant"],"properties":{"session":{"type":"object","description":"What the page shows the user — what they buy, for how much, where it goes — and never an internal id","required":["id","status","environment","pair","destination","requested","amounts","transactionId"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"]},"environment":{"type":"string","enum":["production","sandbox"]},"pair":{"type":"object","required":["currency","network","networkName","explorerTx"],"properties":{"currency":{"type":"string"},"network":{"type":"string"},"networkName":{"type":"string","description":"The network as the page names it"},"explorerTx":{"type":["null","string"],"description":"Where the page links a delivery: the explorer's transaction page, before the hash; null in the sandbox and for a network without one"}}},"destination":{"type":"object","required":["kind","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"]},"address":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["null","string"]},"sourceAmount":{"type":["null","string"]},"destinationAmount":{"type":["null","string"]}}},"amounts":{"type":"object","description":"As the payment provider reports them; sourceCurrency is the currency charged, which the user can switch in the widget","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["null","string"]},"sourceAmount":{"type":["null","string"]},"destinationAmount":{"type":["null","string"]}}},"transactionId":{"type":["null","string"]}}},"clientSecret":{"type":["null","string"]},"publishableKey":{"type":["null","string"]},"widgetUrl":{"type":["null","string"],"description":"The second provider's widget, when widget was true and the session is its and can be paid; single use, valid five minutes"},"poweredBy":{"type":"string","enum":["Stripe","Transak"],"description":"The card provider the page names in its footer"},"returnUrl":{"type":["null","string"]},"locale":{"type":"string","enum":["en","it"]},"theme":{"type":"string","enum":["light","dark"]},"tenant":{"type":"object","required":["name","logoUrl","primaryColor"],"properties":{"name":{"type":"string"},"logoUrl":{"type":["null","string"]},"primaryColor":{"type":["null","string"],"description":"The tenant's primary colour (#RRGGBB) the page paints with; null for Aurea's"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/addresses/challenge":{"post":{"summary":"A challenge for proving one address the onramp may deliver to","tags":["card-onramp"],"description":"Where the tenant allows it (GET /v1/ramp/card/config answers provenAddresses: true), a user may receive the crypto they buy at an address of their own wallet rather than an Aurea wallet — after proving they control it: ask for a challenge for the address, sign its message with the address's key (EIP-191 personal_sign on EVM, where the key controls the address on every EVM chain; ed25519 on Solana, the signature in base58), and send the signature to verify. A challenge lasts ten minutes, is used once, and is burnt after five wrong signatures; a user holds at most five open challenges. Answers 201 with the exact message to sign. 403 CARD_ONRAMP_OFF where the tenant does not offer the onramp, 403 CARD_ONRAMP_PROVEN_ADDRESSES_OFF where it does not allow proven addresses; 400 CARD_ONRAMP_ADDRESS_INVALID (a mixed-case EVM address with a wrong checksum, the zero address, a Solana address that is not 32 bytes in base58); 409 CARD_ONRAMP_ADDRESS_CHALLENGE_LIMIT with details.limit.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["family","address"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","maxLength":100}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["challengeId","family","address","environment","message","issuedAt","expiresAt"],"properties":{"challengeId":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string"},"environment":{"type":"string","enum":["production","sandbox"]},"message":{"type":"string","description":"Sign exactly this text, line breaks included"},"issuedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/addresses/verify":{"post":{"summary":"Keep the address a signed challenge proves","tags":["card-onramp"],"description":"201 with the proven address; 200 with it when the user already held it. 400 CARD_ONRAMP_ADDRESS_SIGNATURE_INVALID (details.reason malformed or wrong_signer, details.attemptsLeft), CARD_ONRAMP_ADDRESS_CHALLENGE_BURNT, CARD_ONRAMP_ADDRESS_CHALLENGE_EXPIRED; 409 CARD_ONRAMP_ADDRESS_CHALLENGE_USED; 404 CARD_ONRAMP_ADDRESS_CHALLENGE_NOT_FOUND for a challenge that is not the user's; 403 CARD_ONRAMP_OFF or CARD_ONRAMP_PROVEN_ADDRESSES_OFF in the challenge's environment. label is the user's name for the address, up to 100 characters.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["challengeId","signature"],"additionalProperties":false,"properties":{"challengeId":{"type":"string","format":"uuid"},"signature":{"type":"string","maxLength":200},"label":{"type":["string","null"],"maxLength":100}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"As stored: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"As stored: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/addresses/":{"get":{"summary":"The addresses the user proved in one environment","tags":["card-onramp"],"description":"The addresses the user proved and still holds, oldest first — whatever the tenant's settings, so a user always sees, and can revoke, what they proved.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["environment","addresses"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"addresses":{"type":"array","items":{"type":"object","required":["id","family","address","label","proof","environment","verifiedAt"],"properties":{"id":{"type":"string","format":"uuid"},"family":{"type":"string","enum":["evm","solana"]},"address":{"type":"string","description":"As stored: an EVM address with its checksum, a Solana address in base58"},"label":{"type":["string","null"]},"proof":{"type":"string","enum":["eip191","solana_ed25519"]},"environment":{"type":"string","enum":["production","sandbox"]},"verifiedAt":{"type":"string","format":"date-time"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/addresses/{id}":{"delete":{"summary":"Stop using an address the user proved","tags":["card-onramp"],"description":"204. New sessions can no longer deliver to it; a session already opened for it is locked to it at the payment provider and still delivers there. 404 CARD_ONRAMP_ADDRESS_NOT_FOUND when the user holds no such live address. To use it again, prove it again.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response"},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/customers/{externalId}":{"put":{"summary":"Make, or read, the tenant's end user by its own id","tags":["card-onramp-customers"],"description":"For a tenant that holds its users' wallets and offers only the card onramp: its server names each end user by its own id (externalId: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens), attests the wallet the crypto goes to, and opens a session with the end user's IP address. The tenant's signed call is its statement that the wallet serves that user: no signature of the user is asked for. An end user needs no account: the first call that names an externalId makes it. 403 CARD_ONRAMP_TENANT_WALLETS_OFF until an Aurea administrator switched this on for the tenant in the environment, 403 CARD_ONRAMP_OFF where the card onramp is off; 401 for a missing, wrong, expired or replayed signature. Answers 201 the first time an externalId is named, 200 afterwards, with its wallets. Naming an end user is optional: the wallet and session calls make it too.","parameters":[{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["customer"],"properties":{"customer":{"type":"object","required":["externalId","createdAt","wallets"],"properties":{"externalId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"wallets":{"type":"array","items":{"type":"object","required":["environment","family","address","isDefault","label","attestedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"family":{"type":"string","enum":["evm","solana"],"description":"evm: one address for every EVM network (Ethereum, Base, Polygon, Avalanche, Celo); solana: Solana"},"address":{"type":"string"},"isDefault":{"type":"boolean","description":"The wallet a session of this family and environment uses when the call names no address"},"label":{"type":["string","null"]},"attestedAt":{"type":"string","format":"date-time"}}},"description":"The wallets the tenant attested and did not revoke, both environments"}}}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["customer"],"properties":{"customer":{"type":"object","required":["externalId","createdAt","wallets"],"properties":{"externalId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"wallets":{"type":"array","items":{"type":"object","required":["environment","family","address","isDefault","label","attestedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"family":{"type":"string","enum":["evm","solana"],"description":"evm: one address for every EVM network (Ethereum, Base, Polygon, Avalanche, Celo); solana: Solana"},"address":{"type":"string"},"isDefault":{"type":"boolean","description":"The wallet a session of this family and environment uses when the call names no address"},"label":{"type":["string","null"]},"attestedAt":{"type":"string","format":"date-time"}}},"description":"The wallets the tenant attested and did not revoke, both environments"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"The tenant's end user and its wallets","tags":["card-onramp-customers"],"description":"404 CARD_ONRAMP_CUSTOMER_NOT_FOUND for an externalId no call has named.","parameters":[{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["customer"],"properties":{"customer":{"type":"object","required":["externalId","createdAt","wallets"],"properties":{"externalId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"wallets":{"type":"array","items":{"type":"object","required":["environment","family","address","isDefault","label","attestedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"family":{"type":"string","enum":["evm","solana"],"description":"evm: one address for every EVM network (Ethereum, Base, Polygon, Avalanche, Celo); solana: Solana"},"address":{"type":"string"},"isDefault":{"type":"boolean","description":"The wallet a session of this family and environment uses when the call names no address"},"label":{"type":["string","null"]},"attestedAt":{"type":"string","format":"date-time"}}},"description":"The wallets the tenant attested and did not revoke, both environments"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/customers/{externalId}/wallets/{family}":{"put":{"summary":"Attest the end user's default wallet of one family","tags":["card-onramp-customers"],"description":"Makes address the wallet a session uses when it names none: for family evm, every EVM pair; for solana, the Solana pairs; in the environment isTestnet names. The wallet it replaces stays attested, no longer the default. The same address again changes nothing (200, changed: false) but a new label. An EVM address must carry a valid checksum when it is mixed-case and cannot be the zero address. 400 CARD_ONRAMP_ADDRESS_INVALID, CARD_ONRAMP_CUSTOMER_ID_INVALID. For a tenant that holds its users' wallets and offers only the card onramp: its server names each end user by its own id (externalId: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens), attests the wallet the crypto goes to, and opens a session with the end user's IP address. The tenant's signed call is its statement that the wallet serves that user: no signature of the user is asked for. An end user needs no account: the first call that names an externalId makes it. 403 CARD_ONRAMP_TENANT_WALLETS_OFF until an Aurea administrator switched this on for the tenant in the environment, 403 CARD_ONRAMP_OFF where the card onramp is off; 401 for a missing, wrong, expired or replayed signature.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["address"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"address":{"type":"string","minLength":1,"maxLength":100},"label":{"type":"string","maxLength":100,"description":"For the operator, for example the tenant's name of the wallet; kept when omitted"}}}}},"required":true},"parameters":[{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string","enum":["evm","solana"]},"in":"path","name":"family","required":true},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["wallet","changed"],"properties":{"wallet":{"type":"object","required":["environment","family","address","isDefault","label","attestedAt"],"properties":{"environment":{"type":"string","enum":["production","sandbox"]},"family":{"type":"string","enum":["evm","solana"],"description":"evm: one address for every EVM network (Ethereum, Base, Polygon, Avalanche, Celo); solana: Solana"},"address":{"type":"string"},"isDefault":{"type":"boolean","description":"The wallet a session of this family and environment uses when the call names no address"},"label":{"type":["string","null"]},"attestedAt":{"type":"string","format":"date-time"}}},"changed":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"delete":{"summary":"Stop using the end user's default wallet of one family","tags":["card-onramp-customers"],"description":"204. A session already opened for it is locked to it and still delivers there; a new session then needs an address. 404 CARD_ONRAMP_WALLET_NOT_FOUND when there is no default wallet of that family in that environment.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string","enum":["evm","solana"]},"in":"path","name":"family","required":true},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"204":{"description":"Revoked"},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/customers/{externalId}/sessions":{"post":{"summary":"Open a card purchase for the tenant's end user","tags":["card-onramp-customers"],"description":"Opens a session that delivers pair's crypto to the wallet named by address — attested by this call and kept as one of the end user's wallets — or, without address, to the end user's default wallet of the pair's family (PUT …/wallets/{family}); 409 CARD_ONRAMP_WALLET_MISSING when there is none. customerIp is the end user's public IP address: the payment provider decides from it whether it can serve the user (400 CARD_ONRAMP_CUSTOMER_IP_INVALID for a private, reserved or malformed one; 403 CARD_ONRAMP_CUSTOMER_UNSUPPORTED for a country it cannot serve). sourceAmount (fiat, at most 2 decimals) or destinationAmount: in the first payment provider's widget only a suggestion the user can change, with the currency; in the second's (sessions that open only in the hosted page) the currency and a sourceAmount are fixed. The session is locked to that wallet and that network. Answers 201 with the session, a hosted link to send the user to, and the client secret and publishable key to embed the widget instead (null where the payment provider's widget opens only in the hosted page); a replayed Idempotency-Key answers 200 with the same session and a fresh link. A return URL must be one the tenant allows (400 RETURN_URL_NOT_ALLOWED); the page sends the user there once the purchase is paid, delivered or refused, with from=onramp, onrampSession and status added. Also 400 CARD_ONRAMP_PAIR_UNAVAILABLE, CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY (the pair is not sold in sourceCurrency, or the tenant's default currency, in that environment: details.sourceCurrencies names where it is), CARD_ONRAMP_AMOUNT_INVALID, CARD_ONRAMP_ADDRESS_INVALID, CARD_ONRAMP_CUSTOMER_ID_INVALID. For a tenant that holds its users' wallets and offers only the card onramp: its server names each end user by its own id (externalId: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens), attests the wallet the crypto goes to, and opens a session with the end user's IP address. The tenant's signed call is its statement that the wallet serves that user: no signature of the user is asked for. An end user needs no account: the first call that names an externalId makes it. 403 CARD_ONRAMP_TENANT_WALLETS_OFF until an Aurea administrator switched this on for the tenant in the environment, 403 CARD_ONRAMP_OFF where the card onramp is off; 401 for a missing, wrong, expired or replayed signature.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["pair","customerIp"],"additionalProperties":false,"properties":{"isTestnet":{"type":"boolean","default":false},"pair":{"type":"string","maxLength":40,"description":"currency/network, one of the pairs the tenant offers in the environment (otherwise 400 CARD_ONRAMP_PAIR_UNAVAILABLE, whose details.available names them)"},"customerIp":{"type":"string","maxLength":45,"description":"The end user's public IPv4 or IPv6 address, as your server saw it"},"address":{"type":"string","maxLength":100,"description":"The wallet for this purchase; the end user's default wallet of the pair's family when omitted"},"sourceCurrency":{"type":"string","enum":["eur","usd"]},"sourceAmount":{"type":"string","description":"Fiat, for example 50.00"},"destinationAmount":{"type":"string","description":"Crypto, for example 25.5"},"returnUrl":{"type":"string","maxLength":2048,"description":"Where the hosted page sends the user back"},"locale":{"type":"string","enum":["en","it"],"default":"en"},"theme":{"type":"string","enum":["light","dark"],"default":"light"}}}}},"required":true},"parameters":[{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the session it made, with a fresh client secret and idempotency-replayed: true, and the payment provider is not asked for a second one. The same key with a different request answers 409 IDEMPOTENCY_KEY_REUSED; a key whose session the payment provider refused, 409 CARD_ONRAMP_SESSION_FAILED; a key that is not one, 400 IDEMPOTENCY_KEY_INVALID. Every other check is made before a key is replayed."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey","hostedLink"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"},"hostedLink":{"type":["object","null"],"required":["url","expiresAt"],"description":"A page on the Hub's domain that opens the payment for the session, in the tenant's name and colours: send the end user there when you do not embed the widget. Valid 30 minutes; the token after # is the link's only key — never log it. null when the session can no longer be paid.","properties":{"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey","hostedLink"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"},"hostedLink":{"type":["object","null"],"required":["url","expiresAt"],"description":"A page on the Hub's domain that opens the payment for the session, in the tenant's name and colours: send the end user there when you do not embed the widget. Valid 30 minutes; the token after # is the link's only key — never log it. null when the session can no longer be paid.","properties":{"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"The end user's card purchases in one environment","tags":["card-onramp-customers"],"description":"Newest first, as stored — the payment provider is not asked; read one to refresh it. No client secret is answered here. 404 CARD_ONRAMP_CUSTOMER_NOT_FOUND for an externalId no call has named.","parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["sessions","total"],"properties":{"sessions":{"type":"array","items":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"integer"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/ramp/card/customers/{externalId}/sessions/{id}":{"get":{"summary":"One of the end user's card purchases, as it stands now","tags":["card-onramp-customers"],"description":"Read again from the payment provider while it is not final; its status only moves forward. While it is initialized or requires_payment the answer carries the client secret and publishable key. 404 CARD_ONRAMP_CUSTOMER_NOT_FOUND, or CARD_ONRAMP_SESSION_NOT_FOUND for a session that is not this end user's.","parameters":[{"schema":{"type":"string","maxLength":100},"in":"path","name":"externalId","required":true,"description":"The tenant's own id of its end user: 1 to 100 letters, digits, dots, underscores, colons, @ or hyphens"},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"x-timestamp","required":false,"description":"Unix time in seconds; a call more than 300 seconds from the Hub's clock is refused"},{"schema":{"type":"string"},"in":"header","name":"x-signature","required":false,"description":"hex HMAC-SHA256 with the tenant's API secret of METHOD + \\n + PATH (with its query) + \\n + x-timestamp + \\n + hex SHA-256 of the exact body (of an empty body without one). A signature is accepted once."}],"security":[{"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["session","clientSecret","publishableKey"],"properties":{"session":{"type":"object","required":["id","environment","status","providerStatus","providerSessionId","pair","destination","customer","requested","amounts","transactionId","failureCode","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"environment":{"type":"string","enum":["production","sandbox"]},"status":{"type":"string","enum":["creating","failed","initialized","requires_payment","fulfillment_processing","fulfillment_complete","rejected","refunded"],"description":"creating: the payment provider has not answered yet; failed: it refused to create it (see failureCode); initialized: the widget can open; requires_payment: the user passed KYC and reached the payment; fulfillment_processing: paid, the crypto is on its way; fulfillment_complete: delivered (see transactionId); rejected: the payment provider turned the user away (KYC, sanctions or fraud); refunded: the payment provider took the payment and gave it back to the card, as it could not deliver the crypto. A status only moves forward; fulfillment_complete, rejected, failed and refunded are final."},"providerStatus":{"type":["string","null"],"description":"The session's status as the card payment provider wrote it; it can name a status added after this API was written"},"providerSessionId":{"type":["string","null"],"description":"The card payment provider's own id for the session, to quote to support; null until the provider answered"},"pair":{"type":"object","required":["name","currency","network","aureaChain","family","aureaWallets","sourceCurrencies"],"properties":{"name":{"type":"string","enum":["usdc/ethereum","usdt/ethereum","eth/ethereum","usdc/base","eth/base","usdc/polygon","matic/polygon","usdc/avalanche","avax/avalanche","usdc/celo","usdc/solana","sol/solana","bnb/bsc","usdt/bsc","musd/ethereum","usdt/polygon","usdc/bsc","mon/monad","eurcv/ethereum","usdcv/ethereum","usat/ethereum","eth/arbitrum","eth/optimism","eth/zksync","eth/linea","eth/immutable-zkevm","eth/b3","eth/unichain","eth/soneium","usdt/solana","usdt/celo","uni/ethereum","usdc/arbitrum","usdc/linea","usdc/skale-europa","usdc/immutable-zkevm","usdc/ronin","usdc/etherlink","usdc/unichain","link/ethereum","wbtc/ethereum","shib/ethereum","dai/ethereum","dai/polygon","aave/ethereum","cro/cronos","usde/ethereum","ape/ethereum","mnt/mantle","xtz/etherlink","fdusd/ethereum","fdusd/bsc","wxtz/etherlink","mana/ethereum","bonk/solana","xdc/xdc","chz/ethereum","beam/beam","imx/immutable-zkevm","xaut/ethereum","ron/ronin","glmr/moonbeam","usdg/ethereum","rlusd/ethereum","twt/bsc","aurora/ethereum","aurora/aurora","pyusd/ethereum","slp/ronin","arkm/ethereum","ausd/ethereum","ausd/avalanche","cusd/celo","eurc/ethereum","eurc/base","nxpc/henesys","defi/ethereum","weth/polygon","weth/ronin","pbx/bsc","strx/bsc","eurau/ethereum","eurau/base","musd/linea","musd/monad"],"description":"currency/network"},"currency":{"type":"string"},"network":{"type":"string","description":"The Hub's name of the network, lower case"},"aureaChain":{"type":"string","description":"The Hub's name of the network, as wallets and /v1/tokens/meta/chains name it"},"family":{"type":"string","enum":["evm","solana"]},"aureaWallets":{"type":"boolean","description":"Whether Aurea wallets live on this network: a session to one of the user's Aurea wallets is refused elsewhere (400 CARD_ONRAMP_DESTINATION_NOT_ALLOWED), and the crypto goes to an address the user proved or a wallet the tenant attests"},"sourceCurrencies":{"type":"array","items":{"type":"string","enum":["eur","usd"]},"description":"The fiat currencies the card onramp sells this pair in, in this environment. A session in another currency is refused (400 CARD_ONRAMP_PAIR_NOT_SOLD_IN_CURRENCY); an empty list means the pair is not sold now."}}},"destination":{"type":"object","required":["kind","walletId","addressId","address"],"properties":{"kind":{"type":"string","enum":["aurea_wallet","proven_address","tenant_wallet"],"description":"aurea_wallet: one of the user's Aurea wallets; proven_address: an address the user proved they control; tenant_wallet: a wallet the tenant attested for its end user, from its server"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet of an aurea_wallet session; null for the other kinds, and once the wallet was removed (the address stays)"},"addressId":{"type":["string","null"],"format":"uuid","description":"The proven address of a proven_address session; null for the other kinds"},"address":{"type":"string"}}},"customer":{"type":["object","null"],"required":["externalId"],"description":"The tenant's end user of a tenant_wallet session, by the id the tenant gave it; null for the other kinds","properties":{"externalId":{"type":"string"}}},"requested":{"type":"object","required":["sourceCurrency","sourceAmount","destinationAmount"],"properties":{"sourceCurrency":{"type":["string","null"]},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]}}},"amounts":{"type":"object","description":"What the payment provider reports, as it writes it (decimal strings); null until it reports it","required":["sourceCurrency","sourceAmount","destinationAmount","networkFee","transactionFee"],"properties":{"sourceCurrency":{"type":["string","null"],"description":"The fiat currency of sourceAmount and the fees, as the payment provider reports it (lowercase). In the first payment provider's widget the user can switch currency, so it can differ from requested.sourceCurrency; it is requested.sourceCurrency until the payment provider has answered"},"sourceAmount":{"type":["string","null"]},"destinationAmount":{"type":["string","null"]},"networkFee":{"type":["string","null"]},"transactionFee":{"type":["string","null"]}}},"transactionId":{"type":["string","null"],"description":"The on-chain hash of the delivery, once delivered"},"failureCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"clientSecret":{"type":["string","null"],"description":"What the widget is opened with — stripeOnramp.createSession({ clientSecret }).mount(...) — while the session is initialized or requires_payment; null otherwise. It exposes the wallet address: never log it, never put it in a URL."},"publishableKey":{"type":["string","null"],"description":"The publishable key to load the payment widget with (StripeOnramp); null when clientSecret is"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/webhooks/jwks.json":{"get":{"summary":"The keys that sign webhook deliveries","tags":["webhooks"],"description":"The public keys (JWKS, RFC 7517) that verify the `x-webhook-jws` header of the deliveries to a tenant's webhooks: the key in use first, then the next one, published before it signs anything. Match a delivery's `kid` to a key; fetch this again when a `kid` is unknown. Empty while Aurea signs with the HMAC header alone. No authentication; cacheable for 5 minutes.","responses":{"200":{"description":"The public keys that sign the x-webhook-jws header of the Hub's webhook deliveries (RFC 7517): the key in use first, then the next one, published before it signs anything.","content":{"application/json":{"schema":{"type":"object","required":["keys"],"description":"The public keys that sign the x-webhook-jws header of the Hub's webhook deliveries (RFC 7517): the key in use first, then the next one, published before it signs anything.","properties":{"keys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid","use","alg"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string","description":"The key's RFC 7638 SHA-256 thumbprint"},"use":{"type":"string","enum":["sig"]},"alg":{"type":"string","enum":["ES256"]}}}}}}}}}}}},"/v1/webhooks/client-certificate":{"get":{"summary":"The client certificate of mutual TLS on webhook deliveries","tags":["webhooks"],"description":"The X.509 certificate (PEM) Aurea presents on the TLS connection of every delivery to an endpoint with `mtls`: let the endpoint's server require and trust it (or its issuer), and match its SHA-256 fingerprint. 404 WEBHOOK_MTLS_UNAVAILABLE while Aurea does not offer mutual TLS. No authentication; cacheable for 5 minutes.","responses":{"200":{"description":"The client certificate the Hub presents on deliveries to an endpoint with `mtls`: trust it (or its issuer) on the endpoint's server","content":{"application/json":{"schema":{"type":"object","required":["certificate","sha256Fingerprint","subject","issuer","validFrom","validTo"],"description":"The client certificate the Hub presents on deliveries to an endpoint with `mtls`: trust it (or its issuer) on the endpoint's server","properties":{"certificate":{"type":"string","description":"X.509, in PEM"},"sha256Fingerprint":{"type":"string","description":"SHA-256 of the certificate, colon-separated hex"},"subject":{"type":"string"},"issuer":{"type":"string"},"validFrom":{"type":"string","format":"date-time"},"validTo":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/institution-callbacks/jwks.json":{"get":{"summary":"The keys that sign institution callback requests","tags":["webhooks"],"description":"The public keys (JWKS, RFC 7517) that verify the JWT Aurea sends a tenant's institution callback: the key in use first, then the next one, published before it signs anything. Match a request's `kid` to a key; fetch this again when a `kid` is unknown. Empty while none is configured. No authentication; cacheable for 5 minutes; 503 INSTITUTION_CALLBACK_KEYS_UNAVAILABLE when the keys cannot be read.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"type":"object","required":["kty","crv","x","y","kid","alg","use"],"properties":{"kty":{"type":"string","enum":["EC"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"kid":{"type":"string"},"alg":{"type":"string","enum":["ES256"]},"use":{"type":"string","enum":["sig"]}}}}}}}}}}}},"/v1/notifications/device-token":{"post":{"summary":"Register a device's push token for push notifications","tags":["notifications"],"description":"`pushToken` (`fcmToken`, its older name, is still accepted). 400 `PUSH_TOKEN_CONFLICT` when both names are sent and differ.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["platform"],"properties":{"pushToken":{"type":"string","minLength":1,"description":"The device's push notification token, as the device's push service gave it to your app. Required unless `fcmToken`, its older name, is sent."},"fcmToken":{"type":"string","minLength":1,"deprecated":true,"description":"The older name of `pushToken`, still accepted. Send one of the two (one is required); both only when equal (otherwise 400 `PUSH_TOKEN_CONFLICT`)."},"platform":{"type":"string","enum":["ios","android","web"],"description":"Device platform"}}}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}},"delete":{"summary":"Unregister a device's push token","tags":["notifications"],"description":"`pushToken` (`fcmToken`, its older name, is still accepted). 400 `PUSH_TOKEN_CONFLICT` when both names are sent and differ.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"pushToken":{"type":"string","minLength":1,"description":"The device's push notification token, as the device's push service gave it to your app. Required unless `fcmToken`, its older name, is sent."},"fcmToken":{"type":"string","minLength":1,"deprecated":true,"description":"The older name of `pushToken`, still accepted. Send one of the two (one is required); both only when equal (otherwise 400 `PUSH_TOKEN_CONFLICT`)."}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/v1/notifications/inbox":{"get":{"summary":"Get the notification inbox for the authenticated user","tags":["notifications"],"parameters":[{"schema":{"type":"number","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"skip","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"notifications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"campaign_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"body":{"type":"string"},"deep_link_screen":{"type":["string","null"]},"is_read":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}}}},"total":{"type":"number"}}}}}}}}},"/v1/notifications/inbox/read":{"patch":{"summary":"Mark inbox notifications as read (omit ids to mark all)","tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Omit to mark all unread notifications as read"}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"updated":{"type":"number"}}}}}}}}},"/v1/notifications/inbox/unread-count":{"get":{"summary":"Get the count of unread inbox notifications","tags":["notifications"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"}}}}}}}}},"/v1/admin/activity-logs/stats":{"get":{"summary":"Get activity statistics for last 7 days (admin/tenantadmin only)","tags":["admin"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Tenant to scope stats to. Required for admin users; ignored for tenantadmin users."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"newUsersLast7Days":{"type":"number"},"loginsLast7Days":{"type":"number"},"transactionsLast7Days":{"type":"number"},"swapsLast7Days":{"type":"number"},"totalLast7Days":{"type":"number"},"totalToday":{"type":"number"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/admin/activity-logs/":{"get":{"summary":"List activity logs (admin/tenantadmin only)","tags":["admin"],"parameters":[{"schema":{"type":"string","enum":["auth","wallet","transaction","user","system","swap"]},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"eventType","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"userId","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"dateFrom","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"dateTo","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Tenant to scope logs to. Required for admin users (who have no tenant in JWT); ignored for tenantadmin users (JWT tenant is used)."},{"schema":{"type":"number","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"boolean"},"in":"query","name":"isTestnet","required":false,"description":"Filter by network: true = testnet events + network-agnostic events, false = mainnet events + network-agnostic events. Omit to return all."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"username":{"type":["string","null"]},"eventType":{"type":"string"},"eventCategory":{"type":"string","enum":["auth","wallet","transaction","user","system","swap"]},"description":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"ipAddress":{"type":["string","null"]},"userAgent":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}},"pagination":{"type":"object","properties":{"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"},"hasMore":{"type":"boolean"}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}}}}}}}}},"/v1/admin/chains/":{"get":{"tags":["admin"],"description":"List all chains in the global registry (admin only)","parameters":[{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Filter by network type (true = testnet, false = mainnet)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"chains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isTestnet":{"type":"boolean"},"rpcUrl":{"type":"string"},"explorerUrl":{"type":["string","null"]},"nativeToken":{"type":["object","null"],"properties":{"symbol":{"type":"string","minLength":1,"maxLength":20},"name":{"type":"string","minLength":1,"maxLength":100},"decimals":{"type":"integer","minimum":0,"maximum":18}},"required":["symbol","name","decimals"]},"chainId":{"type":["integer","null"]},"aaveV3PoolAddress":{"type":["string","null"]},"aaveDataProviderAddress":{"type":["string","null"]},"lumenTokenAddress":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","isTestnet","rpcUrl","createdAt","updatedAt"]}}},"required":["chains"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}}}}},"/v1/admin/dapps/":{"get":{"tags":["admin"],"description":"List all dApps for a tenant (admin only)","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"tenantId","required":false,"description":"Required when caller is a platform admin (tenantId=null in JWT)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"dapps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"url":{"type":"string"},"iconUrl":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","name","url","sortOrder","isActive","createdAt","updatedAt"]}}},"required":["dapps"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}}}},"post":{"tags":["admin"],"description":"Create a new dApp for a tenant (admin only)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1,"maxLength":255},"url":{"type":"string","format":"uri","description":"Must be HTTPS"},"iconUrl":{"type":["string","null"],"format":"uri","description":"Must be HTTPS"},"description":{"type":["string","null"],"maxLength":2000},"category":{"type":["string","null"],"maxLength":100},"sortOrder":{"type":"integer","minimum":0},"isActive":{"type":"boolean"}},"required":["tenantId","name","url"]}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"url":{"type":"string"},"iconUrl":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","name","url","sortOrder","isActive","createdAt","updatedAt"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}}}}},"/v1/admin/dapps/{id}":{"patch":{"tags":["admin"],"description":"Update a dApp (admin only)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"url":{"type":"string","format":"uri","description":"Must be HTTPS"},"iconUrl":{"type":["string","null"],"format":"uri","description":"Must be HTTPS"},"description":{"type":["string","null"],"maxLength":2000},"category":{"type":["string","null"],"maxLength":100},"sortOrder":{"type":"integer","minimum":0},"isActive":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"url":{"type":"string"},"iconUrl":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","name","url","sortOrder","isActive","createdAt","updatedAt"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}}}},"delete":{"tags":["admin"],"description":"Delete a dApp (admin only)","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","description":"What the error is about. `code` is its stable error code, where the API answers one.","properties":{"code":{"type":"string","description":"The stable error code: match on it, never on the message."}},"additionalProperties":true}},"required":["error","message"]}}}}}}},"/v1/dapps/":{"get":{"tags":["dapps"],"description":"List active dApps available to the authenticated user's tenant","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"dapps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"url":{"type":"string"},"iconUrl":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"sortOrder":{"type":"integer"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","tenantId","name","url","sortOrder","isActive","createdAt","updatedAt"]}}},"required":["dapps"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/dapps/broadcast":{"post":{"tags":["dapps"],"description":"Broadcast a signed raw transaction to an EVM-compatible chain","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"Hex-encoded signed raw transaction"},"chainSlug":{"type":"string","minLength":1}},"required":["signedTransaction","chainSlug"]}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/dapps/nonce":{"get":{"tags":["dapps"],"description":"Get the next pending nonce for the authenticated user's wallet on a given chain. Pass the optional `address` param to fetch the nonce for a specific EVM address (e.g. when the dApp specifies a `from` address that differs from the primary wallet).","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"chainSlug","required":true},{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"query","name":"address","required":false,"description":"Optional EVM address for the nonce lookup. When omitted the caller's primary wallet for the chain is used."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"nonce":{"type":"integer"}},"required":["nonce"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/dapps/estimate-gas":{"get":{"tags":["dapps"],"description":"Estimate gas for a transaction on a given chain (adds 20% buffer)","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"chainSlug","required":true},{"schema":{"type":"string","minLength":1},"in":"query","name":"to","required":true},{"schema":{"type":"string"},"in":"query","name":"data","required":false},{"schema":{"type":"string"},"in":"query","name":"value","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"gasLimit":{"type":"string","description":"Hex-encoded gas limit with 20% buffer"}},"required":["gasLimit"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/dapps/sign-personal-message":{"post":{"tags":["dapps"],"description":"Sign a personal message (EIP-191 personal_sign) using the custodial wallet for the given chain. Pass the message as hex bytes (0x-prefixed) or as a plain UTF-8 string. A tenant whose message rules are enforced (an institutional tenant) signs only a message from one of its enabled dApps (`dappOrigin`) or one of the explicit rules of the app's own flows; anything else is answered 403 with `details.code` PERSONAL_SIGN_NOT_ALLOWED.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"description":"Hex-encoded message bytes (0x-prefixed) or plain UTF-8 string"},"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The wallet address to sign with (0x-prefixed, 42 chars)"},"dappOrigin":{"type":"string","description":"The origin (https://host) of the dApp asking for the signature, when a dApp asks. A tenant whose message rules are enforced signs a dApp's message only when its origin is one of the tenant's enabled dApps (403 PERSONAL_SIGN_NOT_ALLOWED otherwise); without it, only the explicit rules of the app's own flows apply."}},"required":["message","walletAddress"]}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","description":"65-byte EIP-191 signature, 0x-prefixed (custodial wallets)"},"requiresClientSigning":{"type":"boolean","description":"true for non-custodial/MPC wallets — the client must sign messageHash"},"messageHash":{"type":"string","description":"EIP-191 digest (0x, 32 bytes) for the client to sign (non-custodial/MPC)"},"message":{"type":"string","description":"Echo of the input message"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/v1/transactions/aggregated/{id}":{"get":{"summary":"Get aggregated transaction by ID","tags":["transactions"],"parameters":[{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"One item of the unified feed, by its type. The bank ramp's amounts are decimal strings; a blockchain `value` is in the smallest unit.","content":{"application/json":{"schema":{"description":"One item of the unified feed, by its type. The bank ramp's amounts are decimal strings; a blockchain `value` is in the smallest unit.","oneOf":[{"type":"object","title":"BlockchainTransactionItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["blockchain_send","blockchain_receive","blockchain_swap"]},"chain":{"type":"string"},"txHash":{"type":["string","null"]},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"fromUsername":{"type":["string","null"]},"toUsername":{"type":["string","null"]},"value":{"type":"string"},"isTestnet":{"type":"boolean"},"blockTimestamp":{"type":["string","null"],"format":"date-time"},"metadata":{"type":"object","additionalProperties":true,"description":"The transaction's metadata; a token transfer's carries tokenAddress, tokenSymbol and tokenDecimals"}}},{"type":"object","title":"BankDepositItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["noah_fiat_deposit"]},"typeNeutral":{"type":"string","enum":["bank_ramp_fiat_deposit"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"fiatAmount":{"type":"string"},"fiatCurrency":{"type":"string"},"senderName":{"type":["string","null"]},"noahDepositId":{"type":["string","null"]},"bankRampDepositId":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"depositDate":{"type":["string","null"],"format":"date-time"}}},{"type":"object","title":"BankPayinTransactionItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["noah_payin_transaction"]},"typeNeutral":{"type":"string","enum":["bank_ramp_payin_transaction"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"transactionType":{"type":"string"},"fiatAmount":{"type":["string","null"]},"fiatCurrency":{"type":["string","null"]},"cryptoAmount":{"type":["string","null"]},"cryptoCurrency":{"type":["string","null"]},"exchangeRate":{"type":["string","null"]},"blockchainTxHash":{"type":["string","null"]},"network":{"type":["string","null"]},"noahTransactionId":{"type":"string"},"bankRampTransactionId":{"type":"string","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."}}},{"type":"object","title":"BankPayoutItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["noah_payout"]},"typeNeutral":{"type":"string","enum":["bank_ramp_payout"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"fiatAmount":{"type":"string"},"fiatCurrency":{"type":"string"},"cryptoCurrency":{"type":"string"},"cryptoAuthorizedAmount":{"type":"string"},"exchangeRate":{"type":["string","null"]},"noahTransactionId":{"type":["string","null"]},"bankRampTransactionId":{"type":["string","null"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."}}},{"type":"object","title":"BankPayinCheckoutItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["noah_payin_checkout"]},"typeNeutral":{"type":"string","enum":["bank_ramp_payin_checkout"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"fiatAmount":{"type":["string","null"]},"fiatCurrency":{"type":["string","null"]},"cryptoCurrency":{"type":["string","null"]},"cryptoAmount":{"type":["string","null"]},"exchangeRate":{"type":["string","null"]},"externalId":{"type":"string"},"checkoutUrl":{"type":["string","null"]}}},{"type":"object","title":"CardOnrampPurchaseItem","required":["id","status","sortDate","createdAt","type"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["card_onramp_purchase"]},"fiatAmount":{"type":["string","null"]},"fiatCurrency":{"type":["string","null"]},"cryptoAmount":{"type":["string","null"]},"cryptoCurrency":{"type":"string"},"network":{"type":"string"},"chain":{"type":"string"},"toAddress":{"type":"string"},"blockchainTxHash":{"type":["string","null"]},"isTestnet":{"type":"boolean"}}}]}}}},"400":{"description":"The id is not a UUID","content":{"application/json":{"schema":{"type":"object","description":"The id is not a UUID","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"No transaction of the user's with that id on this network","content":{"application/json":{"schema":{"type":"object","description":"No transaction of the user's with that id on this network","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/transactions/aggregated/":{"get":{"summary":"Get unified transaction feed","tags":["aggregated-transactions"],"description":"Returns a paginated, time-sorted feed combining blockchain transactions, bank deposits, bank pay-in transactions, bank payouts, and the crypto bought by card (card_onramp_purchase: the card onramp sessions the user paid, whose id is the session's). Use the 'type' filter to narrow to a specific source. The 'isTestnet' flag applies only to blockchain transactions; bank ramp data is always included.","parameters":[{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["blockchain_send","blockchain_receive","blockchain_swap","noah_fiat_deposit","noah_payin_transaction","noah_payout","noah_payin_checkout","card_onramp_purchase"]},"in":"query","name":"type","required":false,"description":"Filter by a single transaction type (legacy, use 'types' for multi-value)"},{"schema":{"type":"string"},"in":"query","name":"types","required":false,"description":"Comma-separated list of item types to include (e.g. blockchain_send,noah_payout). Takes precedence over 'type'."},{"schema":{"type":"string"},"in":"query","name":"payinTransactionType","required":false,"description":"Sub-filter for noah_payin_transaction rows by transaction_type (purchase|withdrawal|refund). Non-payin rows are unaffected."},{"schema":{"type":"string"},"in":"query","name":"counterpartyAddress","required":false,"description":"Filter to blockchain transactions involving this wallet address as sender or receiver. When provided, only blockchain_send, blockchain_receive, and blockchain_swap results are returned; The bank ramp's transaction types are excluded as they have no counterparty wallet address."},{"schema":{"type":"string"},"in":"query","name":"counterpartyUsername","required":false,"description":"Filter to blockchain transactions where the sender or recipient username contains this value (case-insensitive, partial match). When provided, only blockchain_send, blockchain_receive, and blockchain_swap results are returned; The bank ramp's transaction types are excluded as they have no counterparty username."},{"schema":{"type":"boolean","default":false},"in":"query","name":"isTestnet","required":false,"description":"Include testnet blockchain transactions (bank ramp data always included)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","required":["id","type","status","sortDate","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["blockchain_send","blockchain_receive","blockchain_swap","noah_fiat_deposit","noah_payin_transaction","noah_payout","noah_payin_checkout","card_onramp_purchase"]},"typeNeutral":{"type":"string","enum":["bank_ramp_fiat_deposit","bank_ramp_payin_transaction","bank_ramp_payout","bank_ramp_payin_checkout"],"description":"The neutral name of the field before's value, answered next to it where neutral names are on for the tenant and that value carries a provider's name; absent otherwise."},"status":{"type":"string"},"sortDate":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"chain":{"type":["null","string"]},"txHash":{"type":["null","string"]},"fromAddress":{"type":["null","string"]},"toAddress":{"type":["null","string"]},"fromUsername":{"type":["null","string"]},"toUsername":{"type":["null","string"]},"value":{"type":["null","string"]},"isTestnet":{"type":["null","boolean"]},"blockTimestamp":{"type":["null","string"]},"metadata":{"type":["null","object"],"additionalProperties":true},"fiatAmount":{"type":["null","string"]},"fiatCurrency":{"type":["null","string"]},"senderName":{"type":["null","string"]},"noahDepositId":{"type":["null","string"]},"bankRampDepositId":{"type":["null","string"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"depositDate":{"type":["null","string"]},"transactionType":{"type":["null","string"]},"cryptoAmount":{"type":["null","string"]},"cryptoCurrency":{"type":["null","string"]},"exchangeRate":{"type":["null","string"]},"blockchainTxHash":{"type":["null","string"]},"network":{"type":["null","string"]},"noahTransactionId":{"type":["null","string"]},"bankRampTransactionId":{"type":["null","string"],"description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"cryptoAuthorizedAmount":{"type":["null","string"]},"externalId":{"type":["null","string"]},"checkoutUrl":{"type":["null","string"]}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"}}}}}}}}}}},"/v1/internal/system-alert/":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"minLength":1,"maxLength":255,"type":"string"},"body":{"minLength":1,"maxLength":1024,"type":"string"}},"required":["title","body"]}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"notified":{"type":"number"}},"required":["success","notified"]}}}}}}},"/v1/gnosis/auth/nonce":{"get":{"summary":"Get Gnosis Pay nonce for address","tags":["gnosis"],"description":"Retrieve a nonce for the given address to initiate the Gnosis Pay authentication challenge-response flow.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"address","required":true},{"schema":{"type":"string"},"in":"query","name":"web3AuthToken","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/auth/sign-in-message":{"get":{"summary":"Get the card program's sign-in message, ready to sign","tags":["gnosis"],"description":"The sign-in message (Sign-In with Ethereum, EIP-4361) the user's wallet signs to open its session with the card program, built by the API with a fresh nonce: the address in lower case, the nonce, the time it is issued at, and the card program's fixed texts. Sign `message` (its UTF-8 bytes; `messageHex` is the same bytes as 0x hex, for a custodial wallet's signing route) with personal_sign (EIP-191) by the wallet whose address it names, then send `message`, `signature` and `address` to POST /v1/gnosis/auth/challenge within a few minutes. 400: not an EVM address; 403: the card program is not available to the tenant; 503 `CARD_PROGRAM_NONCE_UNAVAILABLE`: the card program gave no nonce (retry).","parameters":[{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"query","name":"address","required":true,"description":"The EVM address the user signs in with (any case)."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["message","messageHex","address","nonce","issuedAt"],"properties":{"message":{"type":"string","description":"The message to sign, exactly as given: lines separated by \\n."},"messageHex":{"type":"string","description":"The message's UTF-8 bytes as 0x hex."},"address":{"type":"string","description":"The address the message names, in lower case."},"nonce":{"type":"string","description":"The card program's nonce."},"issuedAt":{"type":"string","format":"date-time","description":"When the message was issued (ISO 8601, UTC)."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/auth/challenge":{"post":{"summary":"Submit Gnosis Pay authentication challenge","tags":["gnosis"],"description":"Submit a signed challenge to obtain a Gnosis Pay bearer JWT. The JWT is encrypted and stored server-side.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1},"signature":{"type":"string","minLength":1},"address":{"type":"string","minLength":1},"web3AuthToken":{"type":"string"}},"required":["message","signature","address"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/auth/signup":{"post":{"summary":"Register user with Gnosis Pay","tags":["gnosis"],"description":"Register the authenticated user with Gnosis Pay.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/user":{"get":{"summary":"Get Gnosis Pay user profile","tags":["gnosis"],"description":"Fetch the authenticated user's Gnosis Pay profile.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/user/terms":{"get":{"summary":"Get terms acceptance status","tags":["gnosis"],"description":"Retrieve the Gnosis Pay terms of service acceptance status for the user.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"summary":"Accept Gnosis Pay terms of service","tags":["gnosis"],"description":"Accept the Gnosis Pay terms of service for the user.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean"}},"required":["accepted"],"additionalProperties":true}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/kyc/integration":{"get":{"summary":"Get KYC integration details","tags":["gnosis"],"description":"Retrieve KYC integration details (widget URL, session token) for the user.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/source-of-funds":{"get":{"summary":"Get source of funds status","tags":["gnosis"],"description":"Retrieve the user's source of funds declaration status.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"summary":"Submit source of funds declaration","tags":["gnosis"],"description":"Submit the user's source of funds declaration to Gnosis Pay.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"answers":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","minLength":1},"answer":{"type":"string","minLength":1}},"required":["question","answer"],"additionalProperties":false},"minItems":1}},"required":["answers"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/verification":{"post":{"summary":"Initiate verification","tags":["gnosis"],"description":"Initiate mobile phone or document verification.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phoneNumber":{"type":"string"},"documentType":{"type":"string"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/verification/check":{"post":{"summary":"Submit verification code","tags":["gnosis"],"description":"Submit the OTP or verification code to complete the verification step.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/safe-config":{"get":{"summary":"Get Gnosis Safe configuration","tags":["gnosis"],"description":"Retrieve the Gnosis Safe configuration for the user's account.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/safe/deploy":{"post":{"summary":"Deploy Gnosis Safe","tags":["gnosis"],"description":"Deploy the user's Gnosis Safe. On success, the deployed safe address is persisted.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"chainId":{"type":"integer","exclusiveMinimum":0}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/ibans/signing-message":{"get":{"summary":"Get IBAN signing message","tags":["gnosis"],"description":"Retrieve the message to be signed for IBAN activation with Monerium.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/integrations/monerium":{"post":{"summary":"Activate Monerium IBAN integration","tags":["gnosis"],"description":"Activate the Monerium IBAN integration for the user. On success the user status is updated to 'active'.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string"},"consentId":{"type":"string"},"codeVerifier":{"type":"string"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/integrations/eur-account":{"post":{"summary":"Activate the user's EUR account","tags":["gnosis"],"description":"Activates the user's EUR account with the consent the user gave (consentId: the code your app received at <redirectScheme>://eur-account-callback, with the codeVerifier of the authorization URL), or with a signature. On success the user's status is 'active'.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string"},"consentId":{"type":"string"},"codeVerifier":{"type":"string"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/payout/message":{"get":{"summary":"Get Monerium payout EIP-191 message to sign","tags":["gnosis"],"description":"Resolves the destination IBAN (auto-detected when omitted) and builds the EIP-191 order message that the mobile must sign with EvmSigningService before calling POST /payout. Credentials must be configured in the admin panel (service: monerium).","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"amount","required":true},{"schema":{"type":"string"},"in":"query","name":"destinationIban","required":false},{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"resolvedIban":{"type":"string"},"gnosisAddress":{"type":"string"}},"required":["message","resolvedIban","gnosisAddress"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/payout":{"post":{"summary":"Submit signed Monerium EURe payout order","tags":["gnosis"],"description":"Submits a pre-signed Monerium redemption order to the Monerium API. The mobile must first call GET /payout/message to obtain the EIP-191 message, sign it with EvmSigningService.signPersonalChallenge(), then POST the result here. The order triggers an EURe transfer from the Gnosis Safe followed by a SEPA EUR transfer to the destination bank account. Credentials must be configured in the admin panel (service: monerium).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"string","minLength":1},"destinationIban":{"type":"string","minLength":1},"message":{"type":"string","minLength":1},"signature":{"type":"string","minLength":1},"isTestnet":{"type":"boolean"},"recipientFirstName":{"type":"string","minLength":1},"recipientLastName":{"type":"string","minLength":1},"memo":{"type":"string","minLength":1,"maxLength":140}},"required":["amount","destinationIban","message","signature"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"orderId":{"type":"string"},"status":{"type":"string"},"amount":{"type":"string"},"destinationIban":{"type":"string"}},"required":["orderId","status","amount","destinationIban"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/session":{"delete":{"summary":"Clear Gnosis Pay session (force re-SIWE)","tags":["gnosis"],"responses":{"204":{"description":"Default Response"}}}},"/v1/gnosis/local-status":{"get":{"summary":"Get local Gnosis Pay session status (DB only, no external API call)","tags":["gnosis"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasSession":{"type":"boolean"},"status":{"type":["string","null"]},"gnosisAddress":{"type":["string","null"]},"moneriumLinked":{"type":"boolean"},"eurAccountLinked":{"type":"boolean","description":"The field before, under a neutral name: the same value, answered where neutral names are on for the tenant."},"metadata":{"type":"object","additionalProperties":true}},"required":["hasSession"]}}}}}}},"/v1/gnosis/monerium/authorize-url":{"get":{"summary":"Get Monerium OAuth2 authorization URL for the current user","tags":["gnosis"],"description":"Two-phase SIWE flow. Phase 1 (no siweSignature): returns { authUrl (standard fallback), siweMessage, safeMessageHash, redirectUri, codeVerifier }. The mobile signs siweMessage with the wallet EOA, then calls again with siweSignature. If safeMessageHash is present, the mobile also signs it and sends it back as safeLinkSignature. Phase 2 (siweSignature present): returns { authUrl (SIWE-authenticated), redirectUri, codeVerifier }.","parameters":[{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string"},"in":"query","name":"redirectScheme","required":false},{"schema":{"type":"string"},"in":"query","name":"signature","required":false},{"schema":{"type":"string"},"in":"query","name":"siweSignature","required":false},{"schema":{"type":"string"},"in":"query","name":"safeLinkSignature","required":false},{"schema":{"type":"string"},"in":"query","name":"linkMessageTxHash","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"authUrl":{"type":"string"},"redirectUri":{"type":"string"},"codeVerifier":{"type":"string"},"siweMessage":{"type":"string"},"safeMessageHash":{"type":"string"},"delayModuleAddress":{"type":"string"},"linkMessageQueueCalldata":{"type":"string"}},"required":["authUrl","redirectUri","codeVerifier"]}}}}}}},"/v1/gnosis/eur-account/authorize-url":{"get":{"summary":"Get the EUR account authorization URL for the current user","tags":["gnosis"],"description":"Two phases. Phase 1 (no siweSignature): returns authUrl (a fallback), siweMessage, safeMessageHash, redirectUri and codeVerifier; the app signs siweMessage with the user's wallet, and safeMessageHash when present (sent back as safeLinkSignature). Phase 2 (siweSignature present): returns the signed-in authUrl, redirectUri and codeVerifier. Open authUrl in a browser view: after the user's consent the browser comes back to <redirectScheme>://eur-account-callback with code and state, or with error.","parameters":[{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false},{"schema":{"type":"string"},"in":"query","name":"redirectScheme","required":false},{"schema":{"type":"string"},"in":"query","name":"signature","required":false},{"schema":{"type":"string"},"in":"query","name":"siweSignature","required":false},{"schema":{"type":"string"},"in":"query","name":"safeLinkSignature","required":false},{"schema":{"type":"string"},"in":"query","name":"linkMessageTxHash","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"authUrl":{"type":"string"},"redirectUri":{"type":"string"},"codeVerifier":{"type":"string"},"siweMessage":{"type":"string"},"safeMessageHash":{"type":"string"},"delayModuleAddress":{"type":"string"},"linkMessageQueueCalldata":{"type":"string"}},"required":["authUrl","redirectUri","codeVerifier"]}}}}}}},"/v1/gnosis/monerium/callback":{"get":{"summary":"Monerium OAuth2 callback (server-side redirect to mobile deep link)","tags":["gnosis"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"code","required":false},{"schema":{"type":"string"},"in":"query","name":"state","required":false},{"schema":{"type":"string"},"in":"query","name":"error","required":false},{"schema":{"type":"string"},"in":"query","name":"error_description","required":false}],"responses":{"302":{"description":"Redirect to mobile deep link"}}}},"/v1/gnosis/eur-account/callback":{"get":{"summary":"Where the EUR account's authorization comes back (redirects to the app's deep link)","tags":["gnosis"],"description":"Not called by your app: the browser comes back here after the user's consent and is redirected to <redirectScheme>://eur-account-callback with code and state, or with error.","parameters":[{"schema":{"type":"string"},"in":"query","name":"code","required":false},{"schema":{"type":"string"},"in":"query","name":"state","required":false},{"schema":{"type":"string"},"in":"query","name":"error","required":false},{"schema":{"type":"string"},"in":"query","name":"error_description","required":false}],"responses":{"302":{"description":"Redirect to the app's deep link"}}}},"/v1/gnosis/monerium/link-message":{"get":{"summary":"Get the Monerium LINK_MESSAGE for address registration","tags":["gnosis"],"description":"Returns the constant EIP-191 message the mobile must sign with personal_sign before calling POST /monerium/link-safe to register the Safe address with Monerium.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"signingHash":{"type":"string"}},"required":["message","signingHash"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/eur-account/link-message":{"get":{"summary":"Get the message that links the user's address to the EUR account","tags":["gnosis"],"description":"Returns the constant EIP-191 message the app signs with personal_sign before calling POST /v1/gnosis/eur-account/link-safe.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"signingHash":{"type":"string"}},"required":["message","signingHash"]}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/monerium/link-safe":{"post":{"summary":"Register Safe address with Monerium","tags":["gnosis"],"description":"Registers the user's Gnosis Safe address with Monerium using an EIP-191 personal_sign signature of the LINK_MESSAGE. Call GET /monerium/link-message first to obtain the message. Required before POST /payout will succeed if the address was not registered during onboarding.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","minLength":1}},"required":["signature"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/eur-account/link-safe":{"post":{"summary":"Link the user's smart account to the EUR account","tags":["gnosis"],"description":"Links the user's smart account to the EUR account with an EIP-191 personal_sign signature of the message from GET /v1/gnosis/eur-account/link-message. Needed before a payout when the address was not linked during onboarding.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signature":{"type":"string","minLength":1}},"required":["signature"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/webhook":{"post":{"summary":"Gnosis Pay webhook receiver","tags":["gnosis"],"description":"Receives Gnosis Pay webhook events. Signature verification is applied when the x-gnosis-signature header is present.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}},"/v1/gnosis/cards/virtual":{"post":{"tags":["gnosis"],"responses":{"201":{"description":"The new virtual card","content":{"application/json":{"schema":{"type":"object","description":"The new virtual card","properties":{"id":{"type":"string"},"token":{"type":"string"},"lastFour":{"type":"string"},"isVirtual":{"type":"boolean"},"statusCode":{"type":"integer","description":"Gnosis Pay's status code (1000 active, 1001 not activated, 1005 frozen)"},"statusName":{"type":"string"},"isFrozen":{"type":"boolean"},"activatedAt":{"type":["string","null"]}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"As for every card route, or the Monavate card terms are not accepted (details.code GNOSIS_CARD_TOS_REQUIRED)","content":{"application/json":{"schema":{"type":"object","description":"As for every card route, or the Monavate card terms are not accepted (details.code GNOSIS_CARD_TOS_REQUIRED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards":{"get":{"tags":["gnosis"],"responses":{"200":{"description":"The user's cards","content":{"application/json":{"schema":{"type":"array","description":"The user's cards","items":{"type":"object","description":"A Gnosis Pay card. Fields Gnosis Pay leaves out get defaults: token \"\", lastFour \"????\", isVirtual true, statusCode 0, statusName \"\", activatedAt null","properties":{"id":{"type":"string"},"token":{"type":"string"},"lastFour":{"type":"string"},"isVirtual":{"type":"boolean"},"statusCode":{"type":"integer","description":"Gnosis Pay's status code (1000 active, 1001 not activated, 1005 frozen)"},"statusName":{"type":"string"},"isFrozen":{"type":"boolean"},"activatedAt":{"type":["string","null"]}}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/transactions":{"get":{"tags":["gnosis"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"before","required":false},{"schema":{"type":"string"},"in":"query","name":"after","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false},{"schema":{"type":"string"},"in":"query","name":"mcc","required":false},{"schema":{"type":"string"},"in":"query","name":"type","required":false}],"responses":{"200":{"description":"The card transactions, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"The card transactions, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/ephemeral-token":{"get":{"tags":["gnosis"],"responses":{"200":{"description":"What the card-reveal SDK needs: the reveal service's ephemeral token, its expiry, the app id and the user's Gnosis Pay session token","content":{"application/json":{"schema":{"type":"object","description":"What the card-reveal SDK needs: the reveal service's ephemeral token, its expiry, the app id and the user's Gnosis Pay session token","properties":{"token":{"type":"string"},"expiresAt":{"type":"string"},"appId":{"type":"string"},"gnosisJwt":{"type":"string"}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"500":{"description":"The card-reveal service answered something that is not JSON","content":{"application/json":{"schema":{"type":"object","description":"The card-reveal service answered something that is not JSON","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The card-reveal certificates are not configured (details.code GNOSIS_PSE_NOT_CONFIGURED), or the card-reveal service failed","content":{"application/json":{"schema":{"type":"object","description":"The card-reveal certificates are not configured (details.code GNOSIS_PSE_NOT_CONFIGURED), or the card-reveal service failed","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/{cardId}/activate":{"post":{"tags":["gnosis"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Activation of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Activation of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/{cardId}/freeze":{"post":{"tags":["gnosis"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Freezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Freezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/{cardId}/unfreeze":{"post":{"tags":["gnosis"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Unfreezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Unfreezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/gnosis/cards/{cardId}/void":{"post":{"tags":["gnosis"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Voiding of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Voiding of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/aave/positions":{"get":{"summary":"Get user's Lumen yield positions","tags":["aave"],"description":"Returns the user's current EUR.e supply positions on Aave across all supported chains. Auto-resolves chain and wallet — the caller only needs to specify the network type (mainnet/testnet). Uses all EVM wallets (custodial and non-custodial). Returns an empty positions array when no deposits are found.","parameters":[{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"positions":{"type":"array","items":{"type":"object","properties":{"chainSlug":{"type":"string"},"chainId":{"type":"number"},"tokenSymbol":{"type":"string"},"tokenAddress":{"type":"string"},"depositedWei":{"type":"string"},"accruedYieldWei":{"type":"string"},"apy":{"type":"number"},"tokenDecimals":{"type":"number"}},"required":["chainSlug","chainId","tokenSymbol","tokenAddress","depositedWei","accruedYieldWei","apy","tokenDecimals"]}},"totalDepositedWei":{"type":"string"},"totalAccruedYieldWei":{"type":"string"},"hasDeposit":{"type":"boolean"},"walletBalanceWei":{"type":"string"}},"required":["positions","totalDepositedWei","totalAccruedYieldWei","hasDeposit","walletBalanceWei"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/rate-history":{"get":{"summary":"Get 90-day APY history for the Lumen token (EUR.e on Aave)","tags":["aave"],"description":"Queries the Aave v3 subgraph for the last 90 days of liquidityRate history for EUR.e on the highest-priority Lumen-enabled chain (Gnosis mainnet preferred). Returns an array of up to 90 daily data points, each with a Unix timestamp and a compounded APY percentage rounded to 2 decimal places. Returns an empty array when no subgraph data is available or the tenant has no Lumen chains configured. Requires the tenant to have lumenEnabled = true in its configuration.","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"number"},"apy":{"type":"number"}},"required":["timestamp","apy"]}}},"required":["history"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/supply":{"post":{"summary":"Supply EUR.e to Aave (Lumen deposit — custodial wallets only)","tags":["aave"],"description":"Supplies the specified wei amount of EUR.e into Aave's lending pool on behalf of the user. The chain and wallet are resolved automatically. Requires the tenant to have lumenEnabled = true in its configuration. Only custodial (server-managed) wallets are eligible. For non-custodial wallets, use POST /v1/aave/prepare-supply instead. Amounts must be passed in wei (18 decimals for EUR.e). The operation may take up to 60 seconds; a 504 is returned on timeout.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/withdraw":{"post":{"summary":"Withdraw EUR.e from Aave (Lumen withdrawal — custodial wallets only)","tags":["aave"],"description":"Withdraws EUR.e from Aave's lending pool. Pass the wei amount to withdraw a specific quantity, or the string \"max\" to withdraw the entire deposited balance (including accrued yield). Requires the tenant to have lumenEnabled = true in its configuration. Only custodial wallets are eligible. For non-custodial wallets, use POST /v1/aave/prepare-withdraw instead.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"string","enum":["max"]}]},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/prepare-supply":{"post":{"summary":"Prepare unsigned supply transaction(s) for non-custodial wallets","tags":["aave"],"description":"Builds one or more unsigned EIP-1559 transactions for an Aave EUR.e supply operation. Returns the steps array and the wallet address the client must sign from. Each step contains the txHashToSign that must be signed with the wallet's private key. Submit the steps + signatures to POST /v1/aave/broadcast to complete the operation. Requires the tenant to have lumenEnabled = true in its configuration. Amounts must be passed in wei (18 decimals for EUR.e).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"]}},"walletAddress":{"type":"string"}},"required":["steps","walletAddress"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/prepare-withdraw":{"post":{"summary":"Prepare unsigned withdraw transaction(s) for non-custodial wallets","tags":["aave"],"description":"Builds one or more unsigned EIP-1559 transactions for an Aave EUR.e withdrawal. Pass the wei amount to withdraw a specific quantity, or \"max\" to withdraw everything. Returns the steps array and the wallet address the client must sign from. Each step contains the txHashToSign that must be signed with the wallet's private key. Submit the steps + signatures to POST /v1/aave/broadcast to complete the operation. Requires the tenant to have lumenEnabled = true in its configuration.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"string","enum":["max"]}]},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"]}},"walletAddress":{"type":"string"}},"required":["steps","walletAddress"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/aave/broadcast":{"post":{"summary":"Broadcast client-signed Aave transactions","tags":["aave"],"description":"Accepts the steps array (returned from prepare-supply or prepare-withdraw) plus the matching array of signatures (v, r, s) produced by signing each step's txHashToSign with the wallet's private key. Executes the steps sequentially on-chain. Returns the transaction hash of the final step. Requires the tenant to have lumenEnabled = true in its configuration.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}},"signatures":{"type":"array","items":{"type":"object","properties":{"v":{"type":"string"},"r":{"type":"string"},"s":{"type":"string"}},"required":["v","r","s"],"additionalProperties":false}},"isTestnet":{"type":"boolean"}},"required":["steps","signatures","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/positions":{"get":{"summary":"Get the user's lending positions","tags":["lending"],"description":"The user's EUR.e lending positions on every supported chain of the network asked (isTestnet), from all the user's EVM wallets (custodial and not). An empty positions array when there is none. The same route as before under a neutral name.","parameters":[{"schema":{"type":"string"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"positions":{"type":"array","items":{"type":"object","properties":{"chainSlug":{"type":"string"},"chainId":{"type":"number"},"tokenSymbol":{"type":"string"},"tokenAddress":{"type":"string"},"depositedWei":{"type":"string"},"accruedYieldWei":{"type":"string"},"apy":{"type":"number"},"tokenDecimals":{"type":"number"}},"required":["chainSlug","chainId","tokenSymbol","tokenAddress","depositedWei","accruedYieldWei","apy","tokenDecimals"]}},"totalDepositedWei":{"type":"string"},"totalAccruedYieldWei":{"type":"string"},"hasDeposit":{"type":"boolean"},"walletBalanceWei":{"type":"string"}},"required":["positions","totalDepositedWei","totalAccruedYieldWei","hasDeposit","walletBalanceWei"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/rate-history":{"get":{"summary":"Get the lending rate history","tags":["lending"],"description":"Up to 90 daily points of the lending pool's rate for EUR.e on the tenant's first lending chain, each with a Unix timestamp. An empty array when there is no data or the tenant has no lending chain. Requires lending to be on for the tenant.","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"number"},"apy":{"type":"number"}},"required":["timestamp","apy"]}}},"required":["history"]}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/supply":{"post":{"summary":"Supply EUR.e to the lending pool (custodial wallets)","tags":["lending"],"description":"Supplies the wei amount of EUR.e to the lending pool from the user's custodial wallet; chain and wallet are resolved. For a wallet whose key the platform does not hold for your tenant, use POST /v1/lending/prepare-supply. Amounts in wei (18 decimals). Requires lending to be on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/withdraw":{"post":{"summary":"Withdraw EUR.e from the lending pool (custodial wallets)","tags":["lending"],"description":"Withdraws EUR.e from the lending pool to the user's custodial wallet: a wei amount, or \"max\" for the whole position. For a wallet whose key the platform does not hold for your tenant, use POST /v1/lending/prepare-withdraw. Requires lending to be on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"string","enum":["max"]}]},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"202":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","content":{"application/json":{"schema":{"description":"Only for an institutional tenant whose policy holds the operation for approval (REQUIRE_APPROVAL), or a tenant whose screening is enforced when the operation needs its compliance review (PENDING_SCREENING `under_review`), or an institutional tenant whose institution callback answered RETRY (PENDING_AUTHORIZATION `awaiting_callback`, with `callback`): nothing was signed or sent. Follow the operation (`GET /v1/operations/{id}`, the `operation.*` events; for an approval `GET /v1/operations/{id}/approval`, for the callback `GET /v1/operations/{id}/callback`); once approved, or released by the review, or approved by the callback, it goes on server-side — for a client-side or MPC wallet, prepared: those two reads hand you what it signs (`result`) — and a review that confirms the match ends it REJECTED. The request's Idempotency-Key answers this again.","type":"object","required":["operationId","state","subState"],"properties":{"operationId":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["PENDING_AUTHORIZATION","PENDING_SCREENING"]},"subState":{"type":"string","enum":["awaiting_approval","under_review","awaiting_callback"]},"approval":{"description":"The approval it waits for: a hold for approval only.","type":"object","required":["id","ruleId","ruleName","threshold","expiresAt"],"properties":{"id":{"type":"string","format":"uuid"},"ruleId":{"type":"string","format":"uuid"},"ruleName":{"type":"string"},"threshold":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"}}},"callback":{"description":"awaiting_callback: the institution callback's request — asked again from `nextPollAt` until `deadlineAt` (48 hours at most); the operation goes on once it approves (what it answered then, for a client-side or MPC wallet the preparation to sign: `GET /v1/operations/{id}/callback`), and fails (callback_expired) past the deadline.","type":"object","required":["requestId","nextPollAt","deadlineAt"],"properties":{"requestId":{"type":"string","format":"uuid"},"nextPollAt":{"type":"string","format":"date-time"},"deadlineAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/prepare-supply":{"post":{"summary":"Prepare a lending supply for the user's device to sign","tags":["lending"],"description":"Builds the unsigned EIP-1559 transactions of a EUR.e supply and the address to sign from; each step's txHashToSign is signed with the wallet's key and the steps and signatures go to POST /v1/lending/broadcast. Amounts in wei (18 decimals). Requires lending to be on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"type":"string","pattern":"^\\d+$"},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"]}},"walletAddress":{"type":"string"}},"required":["steps","walletAddress"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/prepare-withdraw":{"post":{"summary":"Prepare a lending withdrawal for the user's device to sign","tags":["lending"],"description":"Builds the unsigned EIP-1559 transactions of a EUR.e withdrawal (a wei amount, or \"max\") and the address to sign from; the steps and signatures go to POST /v1/lending/broadcast. Requires lending to be on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"weiAmount":{"anyOf":[{"type":"string","pattern":"^\\d+$"},{"type":"string","enum":["max"]}]},"isTestnet":{"type":"boolean"}},"required":["weiAmount","isTestnet"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"]}},"walletAddress":{"type":"string"}},"required":["steps","walletAddress"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/lending/broadcast":{"post":{"summary":"Broadcast the signed lending transactions","tags":["lending"],"description":"Takes the steps of a prepared supply or withdrawal and one signature (v, r, s) per step's txHashToSign, sends them in order and answers the last transaction's hash. Requires lending to be on for the tenant.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"number"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"number"},"nonce":{"type":"number"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}},"signatures":{"type":"array","items":{"type":"object","properties":{"v":{"type":"string"},"r":{"type":"string"},"s":{"type":"string"}},"required":["v","r","s"],"additionalProperties":false}},"isTestnet":{"type":"boolean"}},"required":["steps","signatures","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"txHash":{"type":"string"}},"required":["txHash"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{},"timestamp":{"type":"string"},"path":{"type":"string"}}}}}}}}},"/v1/cards/virtual":{"post":{"summary":"Create a virtual card","tags":["cards"],"description":"Issues a virtual card to the user, once the card terms (card-issuer-tos) are accepted (403 CARD_TERMS_REQUIRED otherwise, with neutral names on).","responses":{"201":{"description":"The new virtual card","content":{"application/json":{"schema":{"type":"object","description":"The new virtual card","properties":{"id":{"type":"string"},"token":{"type":"string"},"lastFour":{"type":"string"},"isVirtual":{"type":"boolean"},"statusCode":{"type":"integer","description":"Gnosis Pay's status code (1000 active, 1001 not activated, 1005 frozen)"},"statusName":{"type":"string"},"isFrozen":{"type":"boolean"},"activatedAt":{"type":["string","null"]}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"As for every card route, or the Monavate card terms are not accepted (details.code GNOSIS_CARD_TOS_REQUIRED)","content":{"application/json":{"schema":{"type":"object","description":"As for every card route, or the Monavate card terms are not accepted (details.code GNOSIS_CARD_TOS_REQUIRED)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards":{"get":{"summary":"List the user's cards","tags":["cards"],"description":"The user's cards as the card program answers them.","responses":{"200":{"description":"The user's cards","content":{"application/json":{"schema":{"type":"array","description":"The user's cards","items":{"type":"object","description":"A Gnosis Pay card. Fields Gnosis Pay leaves out get defaults: token \"\", lastFour \"????\", isVirtual true, statusCode 0, statusName \"\", activatedAt null","properties":{"id":{"type":"string"},"token":{"type":"string"},"lastFour":{"type":"string"},"isVirtual":{"type":"boolean"},"statusCode":{"type":"integer","description":"Gnosis Pay's status code (1000 active, 1001 not activated, 1005 frozen)"},"statusName":{"type":"string"},"isFrozen":{"type":"boolean"},"activatedAt":{"type":["string","null"]}}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/transactions":{"get":{"summary":"List the user's card transactions","tags":["cards"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"before","required":false},{"schema":{"type":"string"},"in":"query","name":"after","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false},{"schema":{"type":"string"},"in":"query","name":"mcc","required":false},{"schema":{"type":"string"},"in":"query","name":"type","required":false}],"responses":{"200":{"description":"The card transactions, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"The card transactions, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/ephemeral-token":{"get":{"summary":"Get a card reveal token","tags":["cards"],"description":"A short-lived token to show the card's number and code in the card program's secure view.","responses":{"200":{"description":"What the card-reveal SDK needs: the reveal service's ephemeral token, its expiry, the app id and the user's Gnosis Pay session token","content":{"application/json":{"schema":{"type":"object","description":"What the card-reveal SDK needs: the reveal service's ephemeral token, its expiry, the app id and the user's Gnosis Pay session token","properties":{"token":{"type":"string"},"expiresAt":{"type":"string"},"appId":{"type":"string"},"gnosisJwt":{"type":"string"}}}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"500":{"description":"The card-reveal service answered something that is not JSON","content":{"application/json":{"schema":{"type":"object","description":"The card-reveal service answered something that is not JSON","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The card-reveal certificates are not configured (details.code GNOSIS_PSE_NOT_CONFIGURED), or the card-reveal service failed","content":{"application/json":{"schema":{"type":"object","description":"The card-reveal certificates are not configured (details.code GNOSIS_PSE_NOT_CONFIGURED), or the card-reveal service failed","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/{cardId}/activate":{"post":{"summary":"Activate a card","tags":["cards"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Activation of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Activation of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/{cardId}/freeze":{"post":{"summary":"Freeze a card","tags":["cards"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Freezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Freezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/{cardId}/unfreeze":{"post":{"summary":"Unfreeze a card","tags":["cards"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Unfreezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Unfreezing of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/cards/{cardId}/void":{"post":{"summary":"Void a card","tags":["cards"],"description":"Voids the card for good.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"cardId","required":true}],"responses":{"200":{"description":"Voiding of the card, as Gnosis Pay answered it (an empty object when it answered no body)","content":{"application/json":{"schema":{"description":"Voiding of the card, as Gnosis Pay answered it (an empty object when it answered no body)"}}}},"400":{"description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay refused the request or does not know the card, or the tenant has no Gnosis Pay credentials","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is not the tenant's banking provider, the user's Gnosis Pay session is missing or expired (details.code GNOSIS_SESSION_EXPIRED), or Gnosis Pay refused it","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"Gnosis Pay is unreachable, timed out or rate-limited the call","content":{"application/json":{"schema":{"type":"object","description":"Gnosis Pay is unreachable, timed out or rate-limited the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/earn/products":{"get":{"summary":"The earn products the tenant offers","tags":["earn"],"description":"The products the tenant switched on for the network, each with its state and rate on every chain it is on, read now: `observedAt` is when they were true and `fresh` whether a deposit or a withdrawal may be decided on them. A product not switched on is not listed.","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The network: `true` testnet, `false` (the default) mainnet."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"products":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["active","paused","retired"]},"acceptsDeposits":{"type":"boolean"},"asset":{"type":"object","properties":{"symbol":{"type":"string"}},"required":["symbol"],"additionalProperties":false},"disclosureVersion":{"anyOf":[{"type":"integer"},{"type":"null"}]},"limits":{"type":"object","properties":{"depositMinAmount":{"type":["null","string"]},"depositMaxAmount":{"type":["null","string"]}},"required":["depositMinAmount","depositMaxAmount"],"additionalProperties":false},"venues":{"type":"array","items":{"type":"object","properties":{"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"readable":{"type":"boolean","description":"False when the chain could not be read."},"state":{"anyOf":[{"type":"string","enum":["active","frozen","paused","inactive"]},{"type":"null"}],"description":"The product's state on chain: active; frozen (withdrawals only); paused or inactive (nothing)."},"apy":{"type":["null","number"],"description":"Annual percentage yield, in percent."},"apyBasisPoints":{"anyOf":[{"type":"integer"},{"type":"null"}]},"rateSource":{"anyOf":[{"type":"string","enum":["onchain","provider_api"]},{"type":"null"}]},"observedAt":{"type":["null","string"],"description":"When the state and the rate were true (the block's time)."},"fresh":{"type":"boolean","description":"Whether the reading is recent enough for a deposit or a withdrawal to be decided on it."},"assetDecimals":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["chain","chainId","assetAddress","readable","state","apy","apyBasisPoints","rateSource","observedAt","fresh","assetDecimals"],"additionalProperties":false}}},"required":["productId","name","status","acceptsDeposits","asset","disclosureVersion","limits","venues"],"additionalProperties":false}}},"required":["isTestnet","products"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/products/{productId}/disclosure":{"get":{"summary":"A product's disclosure, before the first deposit","tags":["earn"],"description":"The product's current disclosure — its risks, and that its yield is variable and read at the time stated with the product — and whether the user accepted it. A deposit needs the current version accepted (409 `EARN_DISCLOSURE_NOT_ACCEPTED`); a product whose disclosure is not published takes no deposit (409 `EARN_DISCLOSURE_NOT_PUBLISHED`).","parameters":[{"schema":{"type":"string","pattern":"^[a-z]{2}$","default":"en"},"in":"query","name":"language","required":false,"description":"Two-letter language code; the English text when there is none in this language."},{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},"in":"path","name":"productId","required":true,"description":"The product's identifier, for example `lumen` or `stablecoin-savings-usdc`."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string"},"version":{"type":"integer"},"language":{"type":"string"},"title":{"type":"string"},"body":{"type":"string","description":"The disclosure, in Markdown."},"sha256":{"type":"string","description":"SHA-256 of `body`: send it back with the acceptance."},"publishedAt":{"type":"string"},"accepted":{"type":"boolean","description":"Whether the user accepted this version."}},"required":["productId","version","language","title","body","sha256","publishedAt","accepted"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/products/{productId}/disclosure/acceptances":{"post":{"summary":"Accept a product's disclosure","tags":["earn"],"description":"Records that the user accepted the disclosure they were shown: its version, language and the `sha256` the disclosure route answered. Not the current text: 409 `EARN_DISCLOSURE_VERSION_MISMATCH`. Accepting again answers the first acceptance (200).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"description":"The version the user read."},"language":{"type":"string","pattern":"^[a-z]{2}$","description":"Two-letter language code; the English text when there is none in this language."},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"The `sha256` of the text the user read, as the disclosure route answered it."}},"required":["version","language","sha256"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},"in":"path","name":"productId","required":true,"description":"The product's identifier, for example `lumen` or `stablecoin-savings-usdc`."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string"},"version":{"type":"integer"},"language":{"type":"string"},"acceptedAt":{"type":"string"}},"required":["productId","version","language","acceptedAt"],"additionalProperties":false}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string"},"version":{"type":"integer"},"language":{"type":"string"},"acceptedAt":{"type":"string"}},"required":["productId","version","language","acceptedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/positions":{"get":{"summary":"What the user holds in the earn products","tags":["earn"],"description":"For every product the tenant offers on the network and every EVM wallet of the user somebody can sign for: the position's value, principal and yield together, read from the chain. Positions of zero are left out.","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The network: `true` testnet, `false` (the default) mainnet."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"positions":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"name":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"assetSymbol":{"type":"string"},"assetDecimals":{"type":"integer"},"walletId":{"type":"string"},"walletAddress":{"type":"string"},"balance":{"type":"string","description":"What the position is worth now, principal and yield, in the smallest unit."},"shares":{"type":"string","description":"A vault product: the share tokens the position is made of, valued in `balance` at the product's exit price."}},"required":["productId","name","chain","chainId","assetAddress","assetSymbol","assetDecimals","walletId","walletAddress","balance"],"additionalProperties":false}},"incomplete":{"type":"boolean","description":"True when a chain could not be read: the list may miss a position."}},"required":["isTestnet","positions","incomplete"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/quote":{"get":{"summary":"What a deposit or a withdrawal would do","tags":["earn"],"description":"The same checks as the write, then what it would do: the route, who signs, the wallet, the amount expected, the fee, what the wallet or the position holds and the exact approval a deposit needs first. The reading's age and the chain's state are answered, not refused. The tenant must offer the product on the network (403 `EARN_PRODUCT_OFF`; an unknown product is 404 `EARN_PRODUCT_NOT_FOUND`). A product the tenant switched off, or that is paused, takes no new deposit; a withdrawal of a position goes on.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},"in":"query","name":"productId","required":true,"description":"The product's identifier, for example `lumen` or `stablecoin-savings-usdc`."},{"schema":{"type":"string","enum":["deposit","withdrawal"]},"in":"query","name":"side","required":true},{"schema":{"type":"string","pattern":"^([0-9]{1,78}|max)$"},"in":"query","name":"amount","required":true,"description":"In the smallest unit; a withdrawal may say \"max\"."},{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The network: `true` testnet, `false` (the default) mainnet."},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":false},{"schema":{"type":"string","enum":["direct","bridge","secondary_market"]},"in":"query","name":"route","required":false,"description":"The route to quote; without it, the first open to the wallet."},{"schema":{"type":"integer","exclusiveMinimum":0},"in":"query","name":"chainId","required":false,"description":"The chain to quote on; without it, the one the wallet is on."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string"},"side":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"],"description":"Who signs: the Hub (custodial wallet) or the client (device or MPC)."},"walletId":{"type":"string"},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"],"description":"Null: the whole position."},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"available":{"type":"string","description":"The wallet's balance of the asset (deposit) or the position (withdrawal)."},"approvalAmount":{"type":["null","string"],"description":"The exact approval a deposit needs first, or null."},"reading":{"type":"object","properties":{"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"readable":{"type":"boolean","description":"False when the chain could not be read."},"state":{"anyOf":[{"type":"string","enum":["active","frozen","paused","inactive"]},{"type":"null"}],"description":"The product's state on chain: active; frozen (withdrawals only); paused or inactive (nothing)."},"apy":{"type":["null","number"],"description":"Annual percentage yield, in percent."},"apyBasisPoints":{"anyOf":[{"type":"integer"},{"type":"null"}]},"rateSource":{"anyOf":[{"type":"string","enum":["onchain","provider_api"]},{"type":"null"}]},"observedAt":{"type":["null","string"],"description":"When the state and the rate were true (the block's time)."},"fresh":{"type":"boolean","description":"Whether the reading is recent enough for a deposit or a withdrawal to be decided on it."},"assetDecimals":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["chain","chainId","assetAddress","readable","state","apy","apyBasisPoints","rateSource","observedAt","fresh","assetDecimals"],"additionalProperties":false},"shares":{"type":"string","description":"A vault product: the share tokens the operation adds (deposit) or takes (withdrawal)."},"nativeFee":{"type":"string","description":"The bridge route: the fee paid with the transaction, in the chain's native token's smallest unit (the router keeps all of it)."}},"required":["productId","side","route","signer","walletId","walletAddress","chain","chainId","assetAddress","amount","expectedAmount","fee","available","approvalAmount","reading"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/deposits":{"post":{"summary":"Deposit into an earn product","tags":["earn"],"description":"Deposits `amount` of the product's asset from one of the user's wallets. The approval, when one is needed, is of exactly the amount, never more. The tenant's limits apply (400 `EARN_AMOUNT_OUT_OF_LIMITS`), the product must take deposits (409 `EARN_PRODUCT_PAUSED`) and the wallet hold the amount (400 `EARN_INSUFFICIENT_BALANCE`). The user must have accepted the product's current disclosure: 409 `EARN_DISCLOSURE_NOT_PUBLISHED` while none is published, 409 `EARN_DISCLOSURE_NOT_ACCEPTED` (with its `version`) until then — read it with GET /v1/earn/products/{productId}/disclosure and accept it with POST /v1/earn/products/{productId}/disclosure/acceptances; a withdrawal never waits for it. The tenant must offer the product on the network (403 `EARN_PRODUCT_OFF`; an unknown product is 404 `EARN_PRODUCT_NOT_FOUND`). A product the tenant switched off, or that is paused, takes no new deposit; a withdrawal of a position goes on. A custodial wallet: the Hub signs and sends the steps at once and answers the operation completed, failed, or broadcast when a receipt is late. A client-side or MPC wallet: the operation is answered submitted with `signing.steps`; sign each `txHashToSign` and send the signatures to POST /v1/earn/operations/{operationId}/broadcast. Before anything is built, the product's state and rate are read again: older than the Hub's limit, 503 `EARN_READING_STALE`; not taking the operation on chain, 409 `EARN_PRODUCT_NOT_ACCEPTING`; unreadable, 503 `EARN_READING_FAILED`. A wallet: `walletId`, or the first one somebody can sign for (404 `EARN_WALLET_NOT_FOUND`, 400 `EARN_WALLET_NOT_SIGNABLE` for a watch-only address, 400 `EARN_NO_WALLET`).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","description":"The product's identifier, for example `lumen` or `stablecoin-savings-usdc`."},"amount":{"type":"string","pattern":"^[0-9]{1,78}$","description":"In the asset's smallest unit, as a string of digits."},"isTestnet":{"type":"boolean"},"walletId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"One of the user's EVM wallets on the network. Without it, the first wallet somebody can sign for on the product's chain, then on any EVM chain, primary first."},"route":{"anyOf":[{"type":"string","enum":["direct","bridge","secondary_market"]},{"type":"null"}],"description":"The route to take: `direct` (into the product on its own chain), `bridge` (from another chain, through the cross-chain router) or `secondary_market` (the product's share token bought or sold on the market, at once). Without it, the first of these open to the wallet. A route not open to it is refused (409 `EARN_ROUTE_NOT_OFFERED`)."},"chainId":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"description":"The chain to operate on, by its id. Without it, the one the wallet is on. A chain the product is not on is refused (400 `EARN_CHAIN_NOT_OFFERED`)."}},"required":["productId","amount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the first answer again, with idempotency-replayed: true, and nothing is signed or sent twice. The same key with a different request answers 409 `IDEMPOTENCY_KEY_REUSED`, while the first is still running 409 `IDEMPOTENCY_IN_PROGRESS`; a key that is not one 400 `IDEMPOTENCY_KEY_INVALID`. The checks that need no chain are made before a key is replayed."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"],"description":"submitted (built; a client signs it now) → broadcast → bridging (bridge route only) → completed, or failed; expired when a client's signatures never came."},"isTestnet":{"type":"boolean"},"walletId":{"type":["null","string"]},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"]},"withdrawAll":{"type":"boolean"},"quote":{"type":"object","properties":{"apy":{"type":"number"},"apyBasisPoints":{"type":"integer"},"rateSource":{"type":"string","enum":["onchain","provider_api"]},"observedAt":{"type":"string"},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"assetDecimals":{"type":"integer"},"shares":{"type":"string"},"nativeFee":{"type":"string"}},"required":["apy","apyBasisPoints","rateSource","observedAt","expectedAmount","fee","assetDecimals"],"additionalProperties":false},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["null","string"]},"signing":{"anyOf":[{"type":"object","properties":{"walletAddress":{"type":"string"},"expiresAt":{"type":["string","null"]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string","enum":["approve","deposit","withdraw"]},"amount":{"type":["string","null"]},"counterparty":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","amount","counterparty","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}}},"required":["walletAddress","expiresAt","steps"],"additionalProperties":false},{"type":"null"}],"description":"While a client's signatures are awaited: sign each step's txHashToSign with the wallet, and send the signatures to POST /v1/earn/operations/{operationId}/broadcast before expiresAt."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"broadcastAt":{"type":["null","string"]},"completedAt":{"type":["null","string"]},"failedAt":{"type":["null","string"]},"bridge":{"type":"object","properties":{"messageId":{"type":"string","description":"The cross-chain message the operation sent."},"destination":{"type":"object","properties":{"chainId":{"type":"integer","description":"The product's chain."},"txHash":{"type":"string","description":"The transaction that delivered the message there."},"blockNumber":{"type":"string","description":"Its block, as a decimal string."}},"required":["chainId","txHash","blockNumber"],"additionalProperties":false,"description":"Where the message was delivered on the product's chain, once Aurea has read it (shortly after the operation completed)."}},"required":["messageId"],"additionalProperties":false,"description":"The bridge route: the message that carries the operation to the product's chain. While it travels the operation is `bridging`; it is completed once the product took it."},"redemption":{"type":"object","properties":{"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"],"description":"requested (asked of the product) → queued (waiting for the product's liquidity, usually under two days, at most about thirty) → paid; or failed, or cancelled by the product's operator (the shares returned)."},"shares":{"type":"string"},"assetsExpected":{"type":["null","string"]},"assetsPaid":{"type":["null","string"],"description":"What was paid, when it could be read."},"requestId":{"type":["null","string"],"description":"The product's own id of the request, once known."},"paidTxHash":{"type":["null","string"]},"queuedAt":{"type":["null","string"]},"paidAt":{"type":["null","string"]},"updatedAt":{"type":"string"}},"required":["state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"additionalProperties":false,"description":"A withdrawal the product queues and pays later: the operation is completed once the request is made, and this follows it until it is paid."}},"required":["operationId","productId","kind","route","signer","state","isTestnet","walletId","walletAddress","chain","chainId","assetAddress","amount","withdrawAll","quote","txHashes","failureCode","signing","createdAt","updatedAt","broadcastAt","completedAt","failedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/withdrawals":{"post":{"summary":"Withdraw from an earn product","tags":["earn"],"description":"Withdraws `amount` (\"max\": the whole position) to the wallet the position is held by. The position must hold it (400 `EARN_INSUFFICIENT_POSITION`). A paused product, or one the tenant switched off, still pays out. A vault product's `direct` withdrawal asks the product to redeem the shares: the operation completes once asked, and `redemption` follows it until it is paid; `secondary_market` sells the shares at once. The tenant must offer the product on the network (403 `EARN_PRODUCT_OFF`; an unknown product is 404 `EARN_PRODUCT_NOT_FOUND`). A product the tenant switched off, or that is paused, takes no new deposit; a withdrawal of a position goes on. A custodial wallet: the Hub signs and sends the steps at once and answers the operation completed, failed, or broadcast when a receipt is late. A client-side or MPC wallet: the operation is answered submitted with `signing.steps`; sign each `txHashToSign` and send the signatures to POST /v1/earn/operations/{operationId}/broadcast. Before anything is built, the product's state and rate are read again: older than the Hub's limit, 503 `EARN_READING_STALE`; not taking the operation on chain, 409 `EARN_PRODUCT_NOT_ACCEPTING`; unreadable, 503 `EARN_READING_FAILED`. A wallet: `walletId`, or the first one somebody can sign for (404 `EARN_WALLET_NOT_FOUND`, 400 `EARN_WALLET_NOT_SIGNABLE` for a watch-only address, 400 `EARN_NO_WALLET`).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","description":"The product's identifier, for example `lumen` or `stablecoin-savings-usdc`."},"amount":{"type":"string","pattern":"^([0-9]{1,78}|max)$","description":"In the asset's smallest unit, or \"max\" for the whole position."},"isTestnet":{"type":"boolean"},"walletId":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"One of the user's EVM wallets on the network. Without it, the first wallet somebody can sign for on the product's chain, then on any EVM chain, primary first."},"route":{"anyOf":[{"type":"string","enum":["direct","bridge","secondary_market"]},{"type":"null"}],"description":"The route to take: `direct` (into the product on its own chain), `bridge` (from another chain, through the cross-chain router) or `secondary_market` (the product's share token bought or sold on the market, at once). Without it, the first of these open to the wallet. A route not open to it is refused (409 `EARN_ROUTE_NOT_OFFERED`)."},"chainId":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"description":"The chain to operate on, by its id. Without it, the one the wallet is on. A chain the product is not on is refused (400 `EARN_CHAIN_NOT_OFFERED`)."}},"required":["productId","amount","isTestnet"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the first answer again, with idempotency-replayed: true, and nothing is signed or sent twice. The same key with a different request answers 409 `IDEMPOTENCY_KEY_REUSED`, while the first is still running 409 `IDEMPOTENCY_IN_PROGRESS`; a key that is not one 400 `IDEMPOTENCY_KEY_INVALID`. The checks that need no chain are made before a key is replayed."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"],"description":"submitted (built; a client signs it now) → broadcast → bridging (bridge route only) → completed, or failed; expired when a client's signatures never came."},"isTestnet":{"type":"boolean"},"walletId":{"type":["null","string"]},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"]},"withdrawAll":{"type":"boolean"},"quote":{"type":"object","properties":{"apy":{"type":"number"},"apyBasisPoints":{"type":"integer"},"rateSource":{"type":"string","enum":["onchain","provider_api"]},"observedAt":{"type":"string"},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"assetDecimals":{"type":"integer"},"shares":{"type":"string"},"nativeFee":{"type":"string"}},"required":["apy","apyBasisPoints","rateSource","observedAt","expectedAmount","fee","assetDecimals"],"additionalProperties":false},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["null","string"]},"signing":{"anyOf":[{"type":"object","properties":{"walletAddress":{"type":"string"},"expiresAt":{"type":["string","null"]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string","enum":["approve","deposit","withdraw"]},"amount":{"type":["string","null"]},"counterparty":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","amount","counterparty","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}}},"required":["walletAddress","expiresAt","steps"],"additionalProperties":false},{"type":"null"}],"description":"While a client's signatures are awaited: sign each step's txHashToSign with the wallet, and send the signatures to POST /v1/earn/operations/{operationId}/broadcast before expiresAt."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"broadcastAt":{"type":["null","string"]},"completedAt":{"type":["null","string"]},"failedAt":{"type":["null","string"]},"bridge":{"type":"object","properties":{"messageId":{"type":"string","description":"The cross-chain message the operation sent."},"destination":{"type":"object","properties":{"chainId":{"type":"integer","description":"The product's chain."},"txHash":{"type":"string","description":"The transaction that delivered the message there."},"blockNumber":{"type":"string","description":"Its block, as a decimal string."}},"required":["chainId","txHash","blockNumber"],"additionalProperties":false,"description":"Where the message was delivered on the product's chain, once Aurea has read it (shortly after the operation completed)."}},"required":["messageId"],"additionalProperties":false,"description":"The bridge route: the message that carries the operation to the product's chain. While it travels the operation is `bridging`; it is completed once the product took it."},"redemption":{"type":"object","properties":{"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"],"description":"requested (asked of the product) → queued (waiting for the product's liquidity, usually under two days, at most about thirty) → paid; or failed, or cancelled by the product's operator (the shares returned)."},"shares":{"type":"string"},"assetsExpected":{"type":["null","string"]},"assetsPaid":{"type":["null","string"],"description":"What was paid, when it could be read."},"requestId":{"type":["null","string"],"description":"The product's own id of the request, once known."},"paidTxHash":{"type":["null","string"]},"queuedAt":{"type":["null","string"]},"paidAt":{"type":["null","string"]},"updatedAt":{"type":"string"}},"required":["state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"additionalProperties":false,"description":"A withdrawal the product queues and pays later: the operation is completed once the request is made, and this follows it until it is paid."}},"required":["operationId","productId","kind","route","signer","state","isTestnet","walletId","walletAddress","chain","chainId","assetAddress","amount","withdrawAll","quote","txHashes","failureCode","signing","createdAt","updatedAt","broadcastAt","completedAt","failedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/operations/{operationId}/broadcast":{"post":{"summary":"Send the signatures of an operation","tags":["earn"],"description":"The signatures of an operation answered submitted, one per step, in order: each is checked against the operation's wallet (422 `EARN_SIGNATURE_INVALID`; a count that does not match, 400 `EARN_SIGNATURES_MISMATCH`), the product is read again (as for the write), then the steps are sent exactly as they were built. The client sends signatures only. 404 `EARN_OPERATION_NOT_FOUND`; 409 `EARN_OPERATION_NOT_AWAITING_SIGNATURES` for an operation in another state; 410 `EARN_SIGNING_EXPIRED` past `signing.expiresAt`; 400 `EARN_BROADCAST_REFUSED` when the node refuses the first step (nothing was sent: the same signatures may be sent again). Once a step is out, the answer is the operation in the state it reached.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signatures":{"type":"array","items":{"type":"object","properties":{"v":{"type":"string","pattern":"^(0x)?[0-9a-fA-F]{1,2}$","description":"The y parity: 0 or 1 (in hexadecimal, 0x optional: also 0x0, 0x1), or the legacy 27 or 28 — written in decimal (27, 28) or in hexadecimal (1b, 1c, 0x1b, 0x1c)."},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["v","r","s"],"additionalProperties":false},"minItems":1,"maxItems":8,"description":"One signature per step, in the order of the steps."}},"required":["signatures"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional. Up to 255 letters, digits, - or _. The same key with the same request answers the first answer again, with idempotency-replayed: true, and nothing is signed or sent twice. The same key with a different request answers 409 `IDEMPOTENCY_KEY_REUSED`, while the first is still running 409 `IDEMPOTENCY_IN_PROGRESS`; a key that is not one 400 `IDEMPOTENCY_KEY_INVALID`. The checks that need no chain are made before a key is replayed."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"],"description":"submitted (built; a client signs it now) → broadcast → bridging (bridge route only) → completed, or failed; expired when a client's signatures never came."},"isTestnet":{"type":"boolean"},"walletId":{"type":["null","string"]},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"]},"withdrawAll":{"type":"boolean"},"quote":{"type":"object","properties":{"apy":{"type":"number"},"apyBasisPoints":{"type":"integer"},"rateSource":{"type":"string","enum":["onchain","provider_api"]},"observedAt":{"type":"string"},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"assetDecimals":{"type":"integer"},"shares":{"type":"string"},"nativeFee":{"type":"string"}},"required":["apy","apyBasisPoints","rateSource","observedAt","expectedAmount","fee","assetDecimals"],"additionalProperties":false},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["null","string"]},"signing":{"anyOf":[{"type":"object","properties":{"walletAddress":{"type":"string"},"expiresAt":{"type":["string","null"]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string","enum":["approve","deposit","withdraw"]},"amount":{"type":["string","null"]},"counterparty":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","amount","counterparty","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}}},"required":["walletAddress","expiresAt","steps"],"additionalProperties":false},{"type":"null"}],"description":"While a client's signatures are awaited: sign each step's txHashToSign with the wallet, and send the signatures to POST /v1/earn/operations/{operationId}/broadcast before expiresAt."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"broadcastAt":{"type":["null","string"]},"completedAt":{"type":["null","string"]},"failedAt":{"type":["null","string"]},"bridge":{"type":"object","properties":{"messageId":{"type":"string","description":"The cross-chain message the operation sent."},"destination":{"type":"object","properties":{"chainId":{"type":"integer","description":"The product's chain."},"txHash":{"type":"string","description":"The transaction that delivered the message there."},"blockNumber":{"type":"string","description":"Its block, as a decimal string."}},"required":["chainId","txHash","blockNumber"],"additionalProperties":false,"description":"Where the message was delivered on the product's chain, once Aurea has read it (shortly after the operation completed)."}},"required":["messageId"],"additionalProperties":false,"description":"The bridge route: the message that carries the operation to the product's chain. While it travels the operation is `bridging`; it is completed once the product took it."},"redemption":{"type":"object","properties":{"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"],"description":"requested (asked of the product) → queued (waiting for the product's liquidity, usually under two days, at most about thirty) → paid; or failed, or cancelled by the product's operator (the shares returned)."},"shares":{"type":"string"},"assetsExpected":{"type":["null","string"]},"assetsPaid":{"type":["null","string"],"description":"What was paid, when it could be read."},"requestId":{"type":["null","string"],"description":"The product's own id of the request, once known."},"paidTxHash":{"type":["null","string"]},"queuedAt":{"type":["null","string"]},"paidAt":{"type":["null","string"]},"updatedAt":{"type":"string"}},"required":["state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"additionalProperties":false,"description":"A withdrawal the product queues and pays later: the operation is completed once the request is made, and this follows it until it is paid."}},"required":["operationId","productId","kind","route","signer","state","isTestnet","walletId","walletAddress","chain","chainId","assetAddress","amount","withdrawAll","quote","txHashes","failureCode","signing","createdAt","updatedAt","broadcastAt","completedAt","failedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/operations":{"get":{"summary":"The user's earn operations","tags":["earn"],"description":"The user's deposits and withdrawals on the network, newest first.","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The network: `true` testnet, `false` (the default) mainnet."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"operations":{"type":"array","items":{"type":"object","properties":{"operationId":{"type":"string"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"],"description":"submitted (built; a client signs it now) → broadcast → bridging (bridge route only) → completed, or failed; expired when a client's signatures never came."},"isTestnet":{"type":"boolean"},"walletId":{"type":["null","string"]},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"]},"withdrawAll":{"type":"boolean"},"quote":{"type":"object","properties":{"apy":{"type":"number"},"apyBasisPoints":{"type":"integer"},"rateSource":{"type":"string","enum":["onchain","provider_api"]},"observedAt":{"type":"string"},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"assetDecimals":{"type":"integer"},"shares":{"type":"string"},"nativeFee":{"type":"string"}},"required":["apy","apyBasisPoints","rateSource","observedAt","expectedAmount","fee","assetDecimals"],"additionalProperties":false},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["null","string"]},"signing":{"anyOf":[{"type":"object","properties":{"walletAddress":{"type":"string"},"expiresAt":{"type":["string","null"]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string","enum":["approve","deposit","withdraw"]},"amount":{"type":["string","null"]},"counterparty":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","amount","counterparty","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}}},"required":["walletAddress","expiresAt","steps"],"additionalProperties":false},{"type":"null"}],"description":"While a client's signatures are awaited: sign each step's txHashToSign with the wallet, and send the signatures to POST /v1/earn/operations/{operationId}/broadcast before expiresAt."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"broadcastAt":{"type":["null","string"]},"completedAt":{"type":["null","string"]},"failedAt":{"type":["null","string"]},"bridge":{"type":"object","properties":{"messageId":{"type":"string","description":"The cross-chain message the operation sent."},"destination":{"type":"object","properties":{"chainId":{"type":"integer","description":"The product's chain."},"txHash":{"type":"string","description":"The transaction that delivered the message there."},"blockNumber":{"type":"string","description":"Its block, as a decimal string."}},"required":["chainId","txHash","blockNumber"],"additionalProperties":false,"description":"Where the message was delivered on the product's chain, once Aurea has read it (shortly after the operation completed)."}},"required":["messageId"],"additionalProperties":false,"description":"The bridge route: the message that carries the operation to the product's chain. While it travels the operation is `bridging`; it is completed once the product took it."},"redemption":{"type":"object","properties":{"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"],"description":"requested (asked of the product) → queued (waiting for the product's liquidity, usually under two days, at most about thirty) → paid; or failed, or cancelled by the product's operator (the shares returned)."},"shares":{"type":"string"},"assetsExpected":{"type":["null","string"]},"assetsPaid":{"type":["null","string"],"description":"What was paid, when it could be read."},"requestId":{"type":["null","string"],"description":"The product's own id of the request, once known."},"paidTxHash":{"type":["null","string"]},"queuedAt":{"type":["null","string"]},"paidAt":{"type":["null","string"]},"updatedAt":{"type":"string"}},"required":["state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"additionalProperties":false,"description":"A withdrawal the product queues and pays later: the operation is completed once the request is made, and this follows it until it is paid."}},"required":["operationId","productId","kind","route","signer","state","isTestnet","walletId","walletAddress","chain","chainId","assetAddress","amount","withdrawAll","quote","txHashes","failureCode","signing","createdAt","updatedAt","broadcastAt","completedAt","failedAt"],"additionalProperties":false}}},"required":["isTestnet","operations"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/earn/operations/{operationId}":{"get":{"summary":"One earn operation","tags":["earn"],"description":"One of the user's operations, brought up to date first: a broadcast one is read from its chain and completed or failed when its receipts say so; one whose signatures never came in time is expired.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"productId":{"type":"string"},"kind":{"type":"string","enum":["deposit","withdrawal"]},"route":{"type":"string","enum":["direct","bridge","secondary_market"]},"signer":{"type":"string","enum":["server","client"]},"state":{"type":"string","enum":["submitted","broadcast","bridging","completed","failed","expired"],"description":"submitted (built; a client signs it now) → broadcast → bridging (bridge route only) → completed, or failed; expired when a client's signatures never came."},"isTestnet":{"type":"boolean"},"walletId":{"type":["null","string"]},"walletAddress":{"type":"string"},"chain":{"type":"string"},"chainId":{"type":"integer"},"assetAddress":{"type":"string"},"amount":{"type":["null","string"]},"withdrawAll":{"type":"boolean"},"quote":{"type":"object","properties":{"apy":{"type":"number"},"apyBasisPoints":{"type":"integer"},"rateSource":{"type":"string","enum":["onchain","provider_api"]},"observedAt":{"type":"string"},"expectedAmount":{"type":"string"},"fee":{"type":"string"},"assetDecimals":{"type":"integer"},"shares":{"type":"string"},"nativeFee":{"type":"string"}},"required":["apy","apyBasisPoints","rateSource","observedAt","expectedAmount","fee","assetDecimals"],"additionalProperties":false},"txHashes":{"type":"array","items":{"type":"string"}},"failureCode":{"type":["null","string"]},"signing":{"anyOf":[{"type":"object","properties":{"walletAddress":{"type":"string"},"expiresAt":{"type":["string","null"]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string","enum":["approve","deposit","withdraw"]},"amount":{"type":["string","null"]},"counterparty":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","amount","counterparty","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false}}},"required":["walletAddress","expiresAt","steps"],"additionalProperties":false},{"type":"null"}],"description":"While a client's signatures are awaited: sign each step's txHashToSign with the wallet, and send the signatures to POST /v1/earn/operations/{operationId}/broadcast before expiresAt."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"broadcastAt":{"type":["null","string"]},"completedAt":{"type":["null","string"]},"failedAt":{"type":["null","string"]},"bridge":{"type":"object","properties":{"messageId":{"type":"string","description":"The cross-chain message the operation sent."},"destination":{"type":"object","properties":{"chainId":{"type":"integer","description":"The product's chain."},"txHash":{"type":"string","description":"The transaction that delivered the message there."},"blockNumber":{"type":"string","description":"Its block, as a decimal string."}},"required":["chainId","txHash","blockNumber"],"additionalProperties":false,"description":"Where the message was delivered on the product's chain, once Aurea has read it (shortly after the operation completed)."}},"required":["messageId"],"additionalProperties":false,"description":"The bridge route: the message that carries the operation to the product's chain. While it travels the operation is `bridging`; it is completed once the product took it."},"redemption":{"type":"object","properties":{"state":{"type":"string","enum":["requested","queued","paid","failed","cancelled"],"description":"requested (asked of the product) → queued (waiting for the product's liquidity, usually under two days, at most about thirty) → paid; or failed, or cancelled by the product's operator (the shares returned)."},"shares":{"type":"string"},"assetsExpected":{"type":["null","string"]},"assetsPaid":{"type":["null","string"],"description":"What was paid, when it could be read."},"requestId":{"type":["null","string"],"description":"The product's own id of the request, once known."},"paidTxHash":{"type":["null","string"]},"queuedAt":{"type":["null","string"]},"paidAt":{"type":["null","string"]},"updatedAt":{"type":"string"}},"required":["state","shares","assetsExpected","assetsPaid","requestId","paidTxHash","queuedAt","paidAt","updatedAt"],"additionalProperties":false,"description":"A withdrawal the product queues and pays later: the operation is completed once the request is made, and this follows it until it is paid."}},"required":["operationId","productId","kind","route","signer","state","isTestnet","walletId","walletAddress","chain","chainId","assetAddress","amount","withdrawAll","quote","txHashes","failureCode","signing","createdAt","updatedAt","broadcastAt","completedAt","failedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/tokenized-assets":{"get":{"summary":"The tokenized assets the tenant offers","tags":["tokenized-assets"],"description":"Tokenized shares, ETFs, portfolios and the tokens that settle them, as the tenant offers them in the environment: the product lines it switched on, every asset of them or the ones it selected, without the assets for professional investors only while it keeps them out. Sorted by symbol, byte by byte (upper case before lower case). The query is checked before the access token and the signature: a value its schema refuses (isTestnet, productLine, a limit or offset out of range) answers 400, with the list of problems in `details`; a chainId other than 1 or 56 answers 422 after the gate. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","enum":["stock","etf","portfolio","settlement_token","yield_token"]},"in":"query","name":"productLine","required":false,"description":"Only the assets of this product line."},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":false,"description":"Only the assets with a token on this chain: 1 or 56."},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"assets":{"type":"array","items":{"type":"object","properties":{"assetId":{"type":"string","description":"The asset's identifier in this environment, stable."},"symbol":{"type":"string","description":"The token's symbol, as its contract names it."},"ticker":{"type":["null","string"],"description":"The underlying instrument's ticker."},"name":{"type":["null","string"],"description":"The underlying instrument's name."},"productLine":{"type":"string","enum":["stock","etf","portfolio","settlement_token","yield_token"],"description":"stock, etf or portfolio: a tokenized share, ETF or portfolio; settlement_token: the token trades settle in; yield_token: a yield-bearing dollar token."},"assetClass":{"type":["null","string"],"description":"For example equities, fixed-income, commodities."},"instrumentType":{"type":["null","string"]},"sectors":{"type":"array","items":{"type":"string"}},"isin":{"type":["null","string"],"description":"The ISIN, when there is one: the underlying instrument's; for a tracker certificate (instrumentType `tracker_certificate`), the certificate's own — its underlying's is `details.underlying.isin` of GET /v1/tokenized-assets/assets/{symbol}."},"chains":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string","description":"The token's contract on the chain."},"decimals":{"type":"integer"}},"required":["chainId","address","decimals"],"additionalProperties":false},"description":"Where the token is, on the chains served."},"afterHoursTradable":{"type":["null","boolean"],"description":"Whether it can trade outside the regular sessions; null when not known."},"investorClass":{"anyOf":[{"type":"string","enum":["retail","professional"]},{"type":"null"}],"description":"Who may buy it under EU rules: retail or professional investors; null while it is not classified."}},"required":["assetId","symbol","ticker","name","productLine","assetClass","instrumentType","sectors","isin","chains","afterHoursTradable","investorClass"],"additionalProperties":false}},"total":{"type":"integer","description":"How many assets match, on every page."},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["isTestnet","assets","total","limit","offset"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market/status":{"get":{"summary":"The market's status","tags":["tokenized-assets"],"description":"Whether the market is open, its session, when it opens and closes next, and the off-hours session. Kept up to a minute. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"isOpen":{"type":"boolean","description":"Whether one of the four conventional sessions is open now."},"session":{"type":"string","enum":["regular","premarket","postmarket","overnight","offhours","paused","closed"]},"nextOpenSession":{"type":"string","enum":["regular","premarket","postmarket","overnight","offhours","paused","closed"]},"nextOpen":{"type":["null","string"],"description":"ISO 8601, UTC."},"nextClose":{"type":["null","string"],"description":"ISO 8601, UTC."},"reason":{"type":["null","string"],"description":"Why the market is not open: TOKENIZED_ASSETS_MARKET_CLOSED or TOKENIZED_ASSETS_MARKET_PAUSED."},"afterHours":{"type":"object","properties":{"isOpen":{"type":"boolean"},"nextOpen":{"type":"string"},"nextClose":{"type":"string"}},"required":["isOpen","nextOpen","nextClose"],"additionalProperties":false,"description":"The off-hours session (weekends, holidays), for the assets that trade in it."},"timestamp":{"type":"string"}},"required":["isTestnet","isOpen","session","nextOpenSession","nextOpen","nextClose","reason","afterHours","timestamp"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market/prices":{"get":{"summary":"The latest prices","tags":["tokenized-assets"],"description":"The latest price of every asset the tenant offers, with its change over the last 24 hours of open market. For display: a quote gives the price an order trades at. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"prices":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"price":{"type":"string","description":"US dollars."},"change24h":{"type":"string","description":"The change over the last 24 hours of open market, in US dollars."},"changePct24h":{"type":"string","description":"The same change, in percent."},"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."}},"required":["symbol","price","change24h","changePct24h","timestamp"],"additionalProperties":false}}},"required":["isTestnet","prices"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market/tickers":{"get":{"summary":"The tickers","tags":["tokenized-assets"],"description":"The last price and 24-hour volumes of every asset the tenant offers, against the settlement token. Kept up to a minute. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"tickers":{"type":"array","items":{"type":"object","properties":{"tickerId":{"type":"string","description":"<base>_<target>, lower case."},"base":{"type":"string","description":"The asset's symbol."},"target":{"type":"string","description":"The settlement token's symbol."},"lastPrice":{"type":"number"},"baseVolume":{"type":"number","description":"Over 24 hours, in the asset."},"targetVolume":{"type":"number","description":"Over 24 hours, in the settlement token."}},"required":["tickerId","base","target","lastPrice","baseVolume","targetVolume"],"additionalProperties":false}}},"required":["isTestnet","tickers"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market/asset-statuses":{"get":{"summary":"The assets' statuses","tags":["tokenized-assets"],"description":"The assets the tenant offers whose trading is paused or limited, now or scheduled (an asset not listed trades normally). Kept up to a minute. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"statuses":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"paused":{"type":"boolean","description":"Trading is paused now."},"limited":{"type":["null","boolean"],"description":"Trading is limited now (smaller orders); null when not known (read on chain)."},"buyPaused":{"type":["null","boolean"],"description":"Read on chain: buying is paused. Null from the feed."},"sellPaused":{"type":["null","boolean"],"description":"Read on chain: selling is paused. Null from the feed."},"tokenPaused":{"type":["null","boolean"],"description":"Read on chain: the token itself is paused, so no transfer moves it. Null from the feed."},"events":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["active","upcoming"]},"type":{"type":"string","enum":["scheduled","unscheduled"]},"code":{"type":["null","string"],"description":"TOKENIZED_ASSETS_ASSET_PAUSED or TOKENIZED_ASSETS_ASSET_LIMITED."},"start":{"type":["null","string"]},"end":{"type":["null","string"]},"multiplierUpdate":{"type":["null","boolean"],"description":"Whether the shares multiplier changes during it."}},"required":["status","type","code","start","end","multiplierUpdate"],"additionalProperties":false},"description":"The pauses the feed reports, now or scheduled."},"source":{"type":"string","enum":["feed","chain"],"description":"Where the value was read: the market data feed, or the token's contracts on chain when the feed could not be read."}},"required":["symbol","paused","limited","buyPaused","sellPaused","tokenPaused","events","source"],"additionalProperties":false}}},"required":["isTestnet","statuses"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/price":{"get":{"summary":"An asset's latest price","tags":["tokenized-assets"],"description":"The token's latest price, and its underlying instrument's. For the yield-bearing dollar token, when the market data cannot be read, the price its contract subscribes and redeems at, read on chain (`source: chain`). Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"price":{"type":["null","string"],"description":"The token's price, in US dollars."},"underlying":{"anyOf":[{"type":"object","properties":{"ticker":{"type":["string","null"]},"price":{"type":"string","description":"A decimal number, written as a string to keep every digit."}},"required":["ticker","price"],"additionalProperties":false},{"type":"null"}],"description":"The underlying instrument's price, when it has one."},"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."},"source":{"type":"string","enum":["feed","chain"],"description":"Where the value was read: the market data feed, or the token's contracts on chain when the feed could not be read."}},"required":["isTestnet","symbol","price","underlying","timestamp","source"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/candles":{"get":{"summary":"An asset's candles","tags":["tokenized-assets"],"description":"Open, high, low and close of the token and of its underlying instrument, for an interval over a range. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","enum":["1min","5min","15min","1hour","4hour","12hour","1day"]},"in":"query","name":"interval","required":true,"description":"The candles' size."},{"schema":{"type":"string","enum":["1day","1month","3month","6month","1year","all"]},"in":"query","name":"range","required":true,"description":"How far back: 1day is the last 24 hours, all the whole history."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"interval":{"type":"string","enum":["1min","5min","15min","1hour","4hour","12hour","1day"]},"range":{"type":"string","enum":["1day","1month","3month","6month","1year","all"]},"candles":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."},"open":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"high":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"low":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"close":{"type":"string","description":"A decimal number, written as a string to keep every digit."}},"required":["timestamp","open","high","low","close"],"additionalProperties":false},"description":"The token's."},"underlying":{"anyOf":[{"type":"object","properties":{"ticker":{"type":["string","null"]},"candles":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":["string","null"],"description":"ISO 8601, UTC."},"open":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"high":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"low":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"close":{"type":"string","description":"A decimal number, written as a string to keep every digit."}},"required":["timestamp","open","high","low","close"],"additionalProperties":false}}},"required":["ticker","candles"],"additionalProperties":false},{"type":"null"}],"description":"The underlying instrument's, when it has one."}},"required":["isTestnet","symbol","interval","range","candles","underlying"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/market":{"get":{"summary":"An asset's market data","tags":["tokenized-assets"],"description":"The token's price, change, last 24 hours, holders, shares multiplier and tradable sessions, and its underlying instrument's fundamentals. Kept up to a minute. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"price":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"change24h":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"changePct24h":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"history24h":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."},"price":{"type":"string","description":"A decimal number, written as a string to keep every digit."}},"required":["timestamp","price"],"additionalProperties":false}},"holders":{"type":["null","number"]},"multiplier":{"type":["null","string"],"description":"How many shares of the underlying one token stands for (dividends reinvested)."},"tradableSessions":{"type":"array","items":{"type":"string","enum":["premarket","regular","postmarket","overnight","offhours"]}},"underlying":{"anyOf":[{"type":"object","properties":{"ticker":{"type":["string","null"]},"name":{"type":["string","null"]},"price":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"high52w":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"low52w":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"volume":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"averageVolume":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"sharesOutstanding":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"marketCap":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."}},"required":["ticker","name","price","high52w","low52w","volume","averageVolume","sharesOutstanding","marketCap"],"additionalProperties":false},{"type":"null"}],"description":"The underlying instrument; null for a token of several (see constituents)."},"constituents":{"type":"array","items":{"type":"string"},"description":"For a token of several assets: their symbols."},"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."}},"required":["isTestnet","symbol","price","change24h","changePct24h","history24h","holders","multiplier","tradableSessions","underlying","constituents","timestamp"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/dividends":{"get":{"summary":"An asset's latest dividend","tags":["tokenized-assets"],"description":"The underlying instrument's dividend yield, frequency and last payment. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"ticker":{"type":["null","string"]},"yield":{"type":"string","description":"Over the last year: 0.05 is 5%."},"frequency":{"type":"string","enum":["monthly","quarterly","semi-annually","annually","irregular","none"]},"lastAmount":{"type":"string","description":"Per share, in US dollars."},"lastPaymentDate":{"type":"string"},"timestamp":{"type":["null","string"],"description":"ISO 8601, UTC."}},"required":["isTestnet","symbol","ticker","yield","frequency","lastAmount","lastPaymentDate","timestamp"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/multiplier":{"get":{"summary":"An asset's shares multiplier","tags":["tokenized-assets"],"description":"How many shares of the underlying one token stands for, and how it changed. When the market data cannot be read, its current value read on chain, without history (`source: chain`). Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","enum":["1day","1month","3month","6month","1year","all"],"default":"1year"},"in":"query","name":"range","required":false,"description":"How far back the history goes."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"current":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"corporateActionPause":{"type":["null","boolean"],"description":"Read on chain: a corporate action's pause is on. Null from the feed."},"history":{"type":"array","items":{"type":"object","properties":{"multiplier":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"changedAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"reason":{"type":"string","enum":["cash_dividend","stock_dividend","stock_split","spinoff","other"]}},"required":["multiplier","changedAt","reason"],"additionalProperties":false}},"source":{"type":"string","enum":["feed","chain"],"description":"Where the value was read: the market data feed, or the token's contracts on chain when the feed could not be read."}},"required":["isTestnet","symbol","current","corporateActionPause","history","source"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/status":{"get":{"summary":"An asset's status","tags":["tokenized-assets"],"description":"Whether the asset's trading is paused or limited, with its pauses. When the market data cannot be read, the pause its contracts enforce, read on chain (`source: chain`). Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"paused":{"type":"boolean","description":"Trading is paused now."},"limited":{"type":["null","boolean"],"description":"Trading is limited now (smaller orders); null when not known (read on chain)."},"buyPaused":{"type":["null","boolean"],"description":"Read on chain: buying is paused. Null from the feed."},"sellPaused":{"type":["null","boolean"],"description":"Read on chain: selling is paused. Null from the feed."},"tokenPaused":{"type":["null","boolean"],"description":"Read on chain: the token itself is paused, so no transfer moves it. Null from the feed."},"events":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["active","upcoming"]},"type":{"type":"string","enum":["scheduled","unscheduled"]},"code":{"type":["null","string"],"description":"TOKENIZED_ASSETS_ASSET_PAUSED or TOKENIZED_ASSETS_ASSET_LIMITED."},"start":{"type":["null","string"]},"end":{"type":["null","string"]},"multiplierUpdate":{"type":["null","boolean"],"description":"Whether the shares multiplier changes during it."}},"required":["status","type","code","start","end","multiplierUpdate"],"additionalProperties":false},"description":"The pauses the feed reports, now or scheduled."},"source":{"type":"string","enum":["feed","chain"],"description":"Where the value was read: the market data feed, or the token's contracts on chain when the feed could not be read."},"isTestnet":{"type":"boolean"}},"required":["symbol","paused","limited","buyPaused","sellPaused","tokenPaused","events","source","isTestnet"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}":{"get":{"summary":"An asset","tags":["tokenized-assets"],"description":"The asset as the list gives it, with its details where it has them: the underlying's listing, the class it tracks (share, ETF, leveraged or inverse ETF), its trading hours and order limits per period, and its deployments with the stablecoins that settle them. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"asset":{"type":"object","properties":{"assetId":{"type":"string","description":"The asset's identifier in this environment, stable."},"symbol":{"type":"string","description":"The token's symbol, as its contract names it."},"ticker":{"type":["null","string"],"description":"The underlying instrument's ticker."},"name":{"type":["null","string"],"description":"The underlying instrument's name."},"productLine":{"type":"string","enum":["stock","etf","portfolio","settlement_token","yield_token"],"description":"stock, etf or portfolio: a tokenized share, ETF or portfolio; settlement_token: the token trades settle in; yield_token: a yield-bearing dollar token."},"assetClass":{"type":["null","string"],"description":"For example equities, fixed-income, commodities."},"instrumentType":{"type":["null","string"]},"sectors":{"type":"array","items":{"type":"string"}},"isin":{"type":["null","string"],"description":"The ISIN, when there is one: the underlying instrument's; for a tracker certificate (instrumentType `tracker_certificate`), the certificate's own — its underlying's is `details.underlying.isin` of GET /v1/tokenized-assets/assets/{symbol}."},"chains":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string","description":"The token's contract on the chain."},"decimals":{"type":"integer"}},"required":["chainId","address","decimals"],"additionalProperties":false},"description":"Where the token is, on the chains served."},"afterHoursTradable":{"type":["null","boolean"],"description":"Whether it can trade outside the regular sessions; null when not known."},"investorClass":{"anyOf":[{"type":"string","enum":["retail","professional"]},{"type":"null"}],"description":"Who may buy it under EU rules: retail or professional investors; null while it is not classified."}},"required":["assetId","symbol","ticker","name","productLine","assetClass","instrumentType","sectors","isin","chains","afterHoursTradable","investorClass"],"additionalProperties":false},"details":{"anyOf":[{"type":"object","properties":{"assetClass":{"type":"string","enum":["share","etf","leveraged_etf","inverse_etf","unclassified"],"description":"What the token tracks: a share, an ETF, or a leveraged or inverse ETF; unclassified until it is told (never offered then)."},"leverage":{"type":["string","null"],"description":"The leverage a leveraged or inverse ETF states (2, 3, -1…); null for any other, or when it states none."},"underlying":{"type":"object","properties":{"symbol":{"type":["string","null"],"description":"Its ticker on its exchange."},"isin":{"type":["string","null"],"description":"The underlying instrument's ISIN (the asset's own `isin` is the certificate's)."},"currency":{"type":["string","null"],"description":"ISO 4217."},"listingCountry":{"type":["string","null"],"description":"ISO 3166-1 alpha-2 of the exchange it is listed on."},"exchangeMic":{"type":["string","null"],"description":"ISO 10383."}},"required":["symbol","isin","currency","listingCountry","exchangeMic"],"additionalProperties":false},"trading":{"type":"object","properties":{"halted":{"type":"boolean"},"hoursMode":{"anyOf":[{"type":"string","enum":["Regular","MarketHours","TwentyFourFive","Always"]},{"type":"null"}],"description":"When it trades: Regular (the regular session), MarketHours (with extended hours), TwentyFourFive (24 hours, 5 days), Always; null when not known."},"tenantPeriods":{"type":"array","items":{"type":"string","enum":["market","extended","overnight"]},"description":"The periods of the underlying's market the tenant trades in."},"currency":{"type":["string","null"],"description":"The currency of the order limits."},"limitsPerPeriod":{"type":"object","additionalProperties":{"type":"object","properties":{"minOrderFiatValue":{"type":["number","null"],"description":"The least order, in cents of the trading currency; null: none."},"maxOrderFiatValue":{"type":"number","description":"The largest order, in cents of the trading currency; 0: not traded in this period."}},"required":["minOrderFiatValue","maxOrderFiatValue"],"additionalProperties":false}}},"required":["halted","hoursMode","tenantPeriods","currency","limitsPerPeriod"],"additionalProperties":false},"deployments":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"address":{"type":"string"},"wrapperAddress":{"type":["string","null"]},"wrapperAddressV2":{"type":["string","null"]},"instantSwaps":{"type":"boolean"},"stablecoins":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"currency":{"type":"string"},"address":{"type":"string"},"decimals":{"type":"integer"},"issuance":{"type":"boolean"},"redemption":{"type":"boolean"}},"required":["symbol","currency","address","decimals","issuance","redemption"],"additionalProperties":false}}},"required":["chainId","address","wrapperAddress","wrapperAddressV2","instantSwaps","stablecoins"],"additionalProperties":false},"description":"Where the token is on the chains served, with what settles it."},"syncedAt":{"type":"string"}},"required":["assetClass","leverage","underlying","trading","deployments","syncedAt"],"additionalProperties":false},{"type":"null"}],"description":"What only some assets have: their underlying's listing, trading terms and deployments; null for the others."}},"required":["isTestnet","asset","details"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/multipliers":{"get":{"summary":"An asset's multipliers, per chain","tags":["tokenized-assets"],"description":"How much of the underlying one token stands for on each chain served, the new value announced with when it takes effect, and every change before (dividends reinvested, splits). Operations pause around a new value's activation. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. Not every asset has this data: one without it is 409 `TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"integer","exclusiveMinimum":0},"in":"query","name":"chainId","required":false,"description":"One chain only; every chain served when omitted."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chains":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"appliedOn":{"type":"string","enum":["balance","display"],"description":"balance: the token's balance already includes it (EVM); display: the balance stays as it is and is shown multiplied (Solana)."},"current":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"pending":{"anyOf":[{"type":"object","properties":{"multiplier":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"activatesAt":{"type":"string"},"reason":{"anyOf":[{"type":"string","enum":["dividend","split","reverse_split","fee_accrual","administrative"]},{"type":"null"}]}},"required":["multiplier","activatesAt","reason"],"additionalProperties":false},{"type":"null"}],"description":"A new multiplier announced, and when it takes effect."},"history":{"type":"array","items":{"type":"object","properties":{"multiplier":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"previousMultiplier":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"activatedAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"reason":{"anyOf":[{"type":"string","enum":["dividend","split","reverse_split","fee_accrual","administrative"]},{"type":"null"}]}},"required":["multiplier","previousMultiplier","activatedAt","reason"],"additionalProperties":false}}},"required":["chainId","appliedOn","current","pending","history"],"additionalProperties":false}}},"required":["isTestnet","symbol","chains"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/supply":{"get":{"summary":"An asset's supply","tags":["tokenized-assets"],"description":"The tokens in circulation and in total, across every chain. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. Not every asset has this data: one without it is 409 `TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"circulating":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"total":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"timestamp":{"type":"string"}},"required":["isTestnet","symbol","circulating","total","timestamp"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/reserves":{"get":{"summary":"An asset's reserves","tags":["tokenized-assets"],"description":"The shares of the underlying held for the tokens in circulation, by custodian, as last attested; null when none is published. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. Not every asset has this data: one without it is 409 `TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"reserves":{"anyOf":[{"type":"object","properties":{"timestamp":{"type":["string","null"],"description":"ISO 8601, UTC."},"sharesHeld":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"circulatingSupply":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"holdings":{"type":"array","items":{"type":"object","properties":{"custodian":{"type":"string"},"quantity":{"type":"string","description":"A decimal number, written as a string to keep every digit."},"symbol":{"type":"string"}},"required":["custodian","quantity","symbol"],"additionalProperties":false}}},"required":["timestamp","sharesHeld","circulatingSupply","holdings"],"additionalProperties":false},{"type":"null"}]}},"required":["isTestnet","symbol","reserves"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/oracles":{"get":{"summary":"An asset's price oracles","tags":["tokenized-assets"],"description":"The price feeds of the token on the chains served: Chainlink (its feed id) and Pyth (its price id), with their contract or verifier. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. Not every asset has this data: one without it is 409 `TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"oracles":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"oracle":{"type":"string","enum":["chainlink","pyth"]},"feedType":{"type":"string"},"address":{"type":["null","string"]},"feedId":{"type":["null","string"]},"quoteAsset":{"type":["null","string"]},"decimals":{"type":["null","number"]},"exponent":{"type":["null","number"]},"verifierContract":{"type":["null","string"]}},"required":["chainId","oracle","feedType","address","feedId","quoteAsset","decimals","exponent","verifierContract"],"additionalProperties":false}}},"required":["isTestnet","symbol","oracles"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/corporate-actions/calendar":{"get":{"summary":"An asset's corporate-action calendar","tags":["tokenized-assets"],"description":"The corporate actions its issuer announced, upcoming and past, newest announced first, with how each moves the multiplier and the cash it reinvests; `closure` is the action that ends the product, if one is announced. For the assets whose states and actions the Hub records itself, see GET /v1/tokenized-assets/assets/{symbol}/corporate-actions. Only the assets the tenant offers: another one is 404 `TOKENIZED_ASSETS_ASSET_NOT_OFFERED`. Not every asset has this data: one without it is 409 `TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET`. When the market data cannot be read: 503 with its `TOKENIZED_ASSETS_PROVIDER_…` code. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"upcoming":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"kind":{"type":"string","description":"cash_dividend, stock_dividend, cash_and_stock_dividend, forward_split, reverse_split, unit_split, spin_off, cash_merger, stock_merger, stock_and_cash_merger, redemption, name_change, worthless_removal, rights_distribution, reorganization or unknown."},"status":{"type":"string","enum":["initial","corrected","cancelled","scheduled"]},"effectiveAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"announcedAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"multiplierBefore":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"multiplierAfter":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"grossCashflowUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"netCashflowUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"withholdingTaxRate":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"fromUnits":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"toUnits":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"redemptionPriceUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"closesProduct":{"type":"boolean","description":"The action ends the product: a redemption, a merger or a worthless removal."}},"required":["id","version","kind","status","effectiveAt","announcedAt","multiplierBefore","multiplierAfter","grossCashflowUsd","netCashflowUsd","withholdingTaxRate","fromUnits","toUnits","redemptionPriceUsd","closesProduct"],"additionalProperties":false}},"past":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"kind":{"type":"string","description":"cash_dividend, stock_dividend, cash_and_stock_dividend, forward_split, reverse_split, unit_split, spin_off, cash_merger, stock_merger, stock_and_cash_merger, redemption, name_change, worthless_removal, rights_distribution, reorganization or unknown."},"status":{"type":"string","enum":["initial","corrected","cancelled","scheduled"]},"effectiveAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"announcedAt":{"type":["null","string"],"description":"ISO 8601, UTC."},"multiplierBefore":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"multiplierAfter":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"grossCashflowUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"netCashflowUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"withholdingTaxRate":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"fromUnits":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"toUnits":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"redemptionPriceUsd":{"type":["null","string"],"description":"A decimal number, written as a string to keep every digit."},"closesProduct":{"type":"boolean","description":"The action ends the product: a redemption, a merger or a worthless removal."}},"required":["id","version","kind","status","effectiveAt","announcedAt","multiplierBefore","multiplierAfter","grossCashflowUsd","netCashflowUsd","withholdingTaxRate","fromUnits","toUnits","redemptionPriceUsd","closesProduct"],"additionalProperties":false}},"closure":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"kind":{"type":"string","description":"cash_dividend, stock_dividend, cash_and_stock_dividend, forward_split, reverse_split, unit_split, spin_off, cash_merger, stock_merger, stock_and_cash_merger, redemption, name_change, worthless_removal, rights_distribution, reorganization or unknown."},"status":{"type":"string","enum":["initial","corrected","cancelled","scheduled"]},"effectiveAt":{"type":["string","null"],"description":"ISO 8601, UTC."},"announcedAt":{"type":["string","null"],"description":"ISO 8601, UTC."},"multiplierBefore":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"multiplierAfter":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"grossCashflowUsd":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"netCashflowUsd":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"withholdingTaxRate":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"fromUnits":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"toUnits":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"redemptionPriceUsd":{"type":["string","null"],"description":"A decimal number, written as a string to keep every digit."},"closesProduct":{"type":"boolean","description":"The action ends the product: a redemption, a merger or a worthless removal."}},"required":["id","version","kind","status","effectiveAt","announcedAt","multiplierBefore","multiplierAfter","grossCashflowUsd","netCashflowUsd","withholdingTaxRate","fromUnits","toUnits","redemptionPriceUsd","closesProduct"],"additionalProperties":false},{"type":"null"}]}},"required":["isTestnet","symbol","upcoming","past","closure"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/wallet-registrations":{"post":{"summary":"Register one of one's wallets","tags":["tokenized-assets"],"description":"Registers one of the signed-in user's own wallets on a chain, so that it can be issued and redeem tokens directly: a challenge the wallet signs. A wallet whose key the Hub holds signs it at once (`signer: server`); otherwise the answer carries the message (and on EVM its digest) for the user's device or MPC to sign, sent back to …/signature within its time. 409 `TOKENIZED_ASSETS_WALLET_NOT_SIGNABLE` for a wallet nobody can sign for here, 423 for a frozen one. Only where the tenant registers its users' own wallets, for an asset that needs it: else 409 `TOKENIZED_ASSETS_REGISTRATION_UNAVAILABLE`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false},"walletId":{"type":"string","format":"uuid","description":"One of the user's own wallets."},"chainId":{"type":"integer","exclusiveMinimum":0,"description":"The chain it is registered for (1, 56, 42161, 10, or 1399811149 for Solana)."}},"required":["walletId","chainId"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"registrationId":{"type":"string"},"registeredWalletId":{"type":"string"},"chainId":{"type":"integer"},"address":{"type":"string"},"signer":{"type":"string","enum":["server","client"],"description":"Who signs: the Hub for a wallet it holds the key of, else the user's device or MPC."},"status":{"type":"string","enum":["challenged","submitted","active","waiting","failed","expired"],"description":"challenged: waiting for the user's signature; submitted: sent; active: registered; waiting: registered, waiting for more proof; failed (failureCode); expired: not signed in time."},"message":{"type":["null","string"],"description":"What to sign, while it waits for the user's signature."},"messageHash":{"type":["null","string"],"description":"EVM: the EIP-191 digest of the message (what a device or MPC signs)."},"expiresAt":{"type":"string"},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"finishedAt":{"type":["null","string"]}},"required":["registrationId","registeredWalletId","chainId","address","signer","status","message","messageHash","expiresAt","failureCode","createdAt","finishedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}},"get":{"summary":"One's wallet registrations","tags":["tokenized-assets"],"description":"The signed-in user's wallet registrations in the environment, the newest first. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"registrations":{"type":"array","items":{"type":"object","properties":{"registrationId":{"type":"string"},"registeredWalletId":{"type":"string"},"chainId":{"type":"integer"},"address":{"type":"string"},"signer":{"type":"string","enum":["server","client"],"description":"Who signs: the Hub for a wallet it holds the key of, else the user's device or MPC."},"status":{"type":"string","enum":["challenged","submitted","active","waiting","failed","expired"],"description":"challenged: waiting for the user's signature; submitted: sent; active: registered; waiting: registered, waiting for more proof; failed (failureCode); expired: not signed in time."},"message":{"type":["null","string"],"description":"What to sign, while it waits for the user's signature."},"messageHash":{"type":["null","string"],"description":"EVM: the EIP-191 digest of the message (what a device or MPC signs)."},"expiresAt":{"type":"string"},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"finishedAt":{"type":["null","string"]}},"required":["registrationId","registeredWalletId","chainId","address","signer","status","message","messageHash","expiresAt","failureCode","createdAt","finishedAt"],"additionalProperties":false}}},"required":["isTestnet","registrations"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/wallet-registrations/{registrationId}/signature":{"post":{"summary":"Sign a wallet registration","tags":["tokenized-assets"],"description":"The user's signature of the registration's message: checked against the wallet first (400 `TOKENIZED_ASSETS_SIGNATURE_INVALID`), then sent. 409 `TOKENIZED_ASSETS_REGISTRATION_EXPIRED` past its time, `…_NOT_AWAITING_SIGNATURE` when it is not waiting for one. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false},"signature":{"type":"string","minLength":1,"maxLength":400,"description":"EVM: the 65-byte signature, hex (0x…), of the message as a personal message (EIP-191) — the digest given is what it signs. Solana: the ed25519 signature of the message's UTF-8 bytes, base58."}},"required":["signature"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"registrationId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"registrationId":{"type":"string"},"registeredWalletId":{"type":"string"},"chainId":{"type":"integer"},"address":{"type":"string"},"signer":{"type":"string","enum":["server","client"],"description":"Who signs: the Hub for a wallet it holds the key of, else the user's device or MPC."},"status":{"type":"string","enum":["challenged","submitted","active","waiting","failed","expired"],"description":"challenged: waiting for the user's signature; submitted: sent; active: registered; waiting: registered, waiting for more proof; failed (failureCode); expired: not signed in time."},"message":{"type":["null","string"],"description":"What to sign, while it waits for the user's signature."},"messageHash":{"type":["null","string"],"description":"EVM: the EIP-191 digest of the message (what a device or MPC signs)."},"expiresAt":{"type":"string"},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"finishedAt":{"type":["null","string"]}},"required":["registrationId","registeredWalletId","chainId","address","signer","status","message","messageHash","expiresAt","failureCode","createdAt","finishedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/limits":{"get":{"summary":"An asset's trading limits","tags":["tokenized-assets"],"description":"The limits an order of the asset meets now: the market's for the tenant (largest order in tokens and in US dollars, quotes still allowed open) and the tenant's own (per order, per order of the asset, per user over the last 24 hours, and what the user's quotes used of it). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","enum":["buy","sell"]},"in":"query","name":"side","required":true},{"schema":{"type":"integer"},"in":"query","name":"chainId","required":true,"description":"The chain: 1 or 56."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"side":{"type":"string","enum":["buy","sell"]},"chainId":{"type":"integer"},"tradingOpen":{"type":"boolean"},"reason":{"type":["null","string"],"description":"Why trading is not open, as a TOKENIZED_ASSETS_… code."},"trading":{"type":"object","properties":{"maxTokenAmount":{"type":"string","description":"A decimal number, as a string."},"maxValueUsd":{"type":"string","description":"A decimal number, as a string."},"remainingQuotes":{"type":"integer"}},"required":["maxTokenAmount","maxValueUsd","remainingQuotes"],"additionalProperties":false,"description":"The market's limits for the tenant, now."},"tenant":{"type":"object","properties":{"maxOrderUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"assetMaxOrderUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"maxUserDailyUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"usedLast24hUsd":{"type":"string","description":"A decimal number, as a string."},"remainingDailyUsd":{"type":["null","string"],"description":"A decimal number, as a string."}},"required":["maxOrderUsd","assetMaxOrderUsd","maxUserDailyUsd","usedLast24hUsd","remainingDailyUsd"],"additionalProperties":false,"description":"The tenant's own limits, and the user's last 24 hours."},"maxOrderUsd":{"type":"string","description":"The largest order that fits them all, now."}},"required":["isTestnet","symbol","side","chainId","tradingOpen","reason","trading","tenant","maxOrderUsd"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/quotes/indicative":{"post":{"summary":"An indicative quote","tags":["tokenized-assets"],"description":"What an order would trade at now, and what it would cost or pay in the payment token after the tenant's fee, rounded as the token contracts round it. Indicative: nothing is reserved, no limit is used, nothing is stored; a binding quote may differ. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,56],"description":"The chain: 1 (Ethereum) or 56 (BNB Chain)."},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","maxLength":80,"description":"How many tokens, as a decimal of at most 18 digits after the point. Give this or notionalValue."},"notionalValue":{"type":"string","maxLength":80,"description":"How many US dollars, as a decimal of at most 18 digits after the point. Give this or tokenAmount."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"],"description":"What the buy is paid in, or the sale paid out in: on chain 1 USDC (the default) or USDon, on chain 56 USDT (the default) or USDon; a portfolio in USDC or USDT only."}},"required":["symbol","chainId","side"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","description":"Tokens bought or sold."},"price":{"type":"string","description":"US dollars per token."},"value":{"type":"string","description":"tokenAmount × price, rounded down to 18 decimals, in US dollars."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"]},"paymentAmount":{"type":"string","description":"What a buy is charged (rounded up to the token's decimals) or a sale pays (rounded down), in paymentToken."},"fee":{"type":"object","properties":{"bps":{"type":"integer"},"amount":{"type":"string","description":"A decimal number, as a string."}},"required":["bps","amount"],"additionalProperties":false,"description":"The tenant's fee, in basis points and in paymentToken."},"total":{"type":"string","description":"A buy: paymentAmount plus the fee. A sale: paymentAmount less the fee."},"isTestnet":{"type":"boolean"},"binding":{"type":"boolean","enum":[false]}},"required":["symbol","chainId","side","tokenAmount","price","value","paymentToken","paymentAmount","fee","total","isTestnet","binding"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/quotes":{"post":{"summary":"A binding quote","tags":["tokenized-assets"],"description":"A quote that holds until expiresAt, kept by Aurea for the execution of the order: its terms are answered, never its signature. Only for a user who meets every requirement — 403 `TOKENIZED_ASSETS_ELIGIBILITY_INCOMPLETE` names what is missing (`details.missing`: residence, residence_subdivision, us_person_declaration, classification, appropriateness, document:<kind>, acceptance:<kind>); 403 `TOKENIZED_ASSETS_COUNTRY_EXCLUDED`, `…_US_PERSON`, `…_NOT_APPROPRIATE` or `…_PROFESSIONAL_ONLY` when one says no — within the tenant's limits (409 `TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED`) and the market's (409), in the tenant's trading hours (409 `TOKENIZED_ASSETS_AFTER_HOURS_OFF`), from a registered wallet (409 `TOKENIZED_ASSETS_WALLET_NOT_REGISTERED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,56],"description":"The chain: 1 (Ethereum) or 56 (BNB Chain)."},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","maxLength":80,"description":"How many tokens, as a decimal of at most 18 digits after the point. Give this or notionalValue."},"notionalValue":{"type":"string","maxLength":80,"description":"How many US dollars, as a decimal of at most 18 digits after the point. Give this or tokenAmount."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"],"description":"What the buy is paid in, or the sale paid out in: on chain 1 USDC (the default) or USDon, on chain 56 USDT (the default) or USDon; a portfolio in USDC or USDT only."}},"required":["symbol","chainId","side"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","description":"Tokens bought or sold."},"price":{"type":"string","description":"US dollars per token."},"value":{"type":"string","description":"tokenAmount × price, rounded down to 18 decimals, in US dollars."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"]},"paymentAmount":{"type":"string","description":"What a buy is charged (rounded up to the token's decimals) or a sale pays (rounded down), in paymentToken."},"fee":{"type":"object","properties":{"bps":{"type":"integer"},"amount":{"type":"string","description":"A decimal number, as a string."}},"required":["bps","amount"],"additionalProperties":false,"description":"The tenant's fee, in basis points and in paymentToken."},"total":{"type":"string","description":"A buy: paymentAmount plus the fee. A sale: paymentAmount less the fee."},"isTestnet":{"type":"boolean"},"quoteId":{"type":"string"},"binding":{"type":"boolean","enum":[true]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"],"description":"attested: binding until expiresAt; expired after it; submitted, completed or failed once executed."},"failureCode":{"type":["null","string"]},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["symbol","chainId","side","tokenAmount","price","value","paymentToken","paymentAmount","fee","total","isTestnet","quoteId","binding","status","failureCode","expiresAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/quotes/{quoteId}":{"get":{"summary":"One of one's binding quotes","tags":["tokenized-assets"],"description":"A binding quote of the signed-in user, in the environment asked: its terms and status. 404 `TOKENIZED_ASSETS_QUOTE_NOT_FOUND` for anyone else's. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","description":"Tokens bought or sold."},"price":{"type":"string","description":"US dollars per token."},"value":{"type":"string","description":"tokenAmount × price, rounded down to 18 decimals, in US dollars."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"]},"paymentAmount":{"type":"string","description":"What a buy is charged (rounded up to the token's decimals) or a sale pays (rounded down), in paymentToken."},"fee":{"type":"object","properties":{"bps":{"type":"integer"},"amount":{"type":"string","description":"A decimal number, as a string."}},"required":["bps","amount"],"additionalProperties":false,"description":"The tenant's fee, in basis points and in paymentToken."},"total":{"type":"string","description":"A buy: paymentAmount plus the fee. A sale: paymentAmount less the fee."},"isTestnet":{"type":"boolean"},"quoteId":{"type":"string"},"binding":{"type":"boolean","enum":[true]},"status":{"type":"string","enum":["quoted","attested","submitted","completed","failed","expired"],"description":"attested: binding until expiresAt; expired after it; submitted, completed or failed once executed."},"failureCode":{"type":["null","string"]},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["symbol","chainId","side","tokenAmount","price","value","paymentToken","paymentAmount","fee","total","isTestnet","quoteId","binding","status","failureCode","expiresAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/eligibility":{"get":{"summary":"One's own eligibility","tags":["tokenized-assets"],"description":"What the tenant supplied about the signed-in user for tokenized assets, item by item (null: not supplied). Eligibility is supplied by the tenant, the authorised entity: its residence, the Regulation S declaration, the client's classification and the appropriateness test's outcome, each with when, its source and who supplied it; every earlier value is kept. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"residence":{"anyOf":[{"type":"object","properties":{"country":{"type":"string"},"subdivision":{"type":["string","null"]},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"}},"required":["country","subdivision","declaredAt","source","suppliedAt"],"additionalProperties":false},{"type":"null"}]},"usPerson":{"anyOf":[{"type":"object","properties":{"isUsPerson":{"type":"boolean"},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"}},"required":["isUsPerson","declaredAt","source","suppliedAt"],"additionalProperties":false},{"type":"null"}]},"classification":{"anyOf":[{"type":"object","properties":{"investorClass":{"type":"string","enum":["retail","professional"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"}},"required":["investorClass","assessedAt","source","suppliedAt"],"additionalProperties":false},{"type":"null"}]},"appropriateness":{"anyOf":[{"type":"object","properties":{"outcome":{"type":"string","enum":["appropriate","not_appropriate"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"}},"required":["outcome","assessedAt","source","suppliedAt"],"additionalProperties":false},{"type":"null"}]}},"required":["userId","residence","usPerson","classification","appropriateness"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/users/{userId}/eligibility":{"get":{"summary":"A user's eligibility (tenant administrators)","tags":["tokenized-assets"],"description":"What the tenant supplied about one of its users, with who supplied each item. 404 `TOKENIZED_ASSETS_USER_NOT_FOUND` for a user of another tenant. Eligibility is supplied by the tenant, the authorised entity: its residence, the Regulation S declaration, the client's classification and the appropriateness test's outcome, each with when, its source and who supplied it; every earlier value is kept. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"residence":{"anyOf":[{"type":"object","properties":{"country":{"type":"string"},"subdivision":{"type":["string","null"]},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["country","subdivision","declaredAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"usPerson":{"anyOf":[{"type":"object","properties":{"isUsPerson":{"type":"boolean"},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["isUsPerson","declaredAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"classification":{"anyOf":[{"type":"object","properties":{"investorClass":{"type":"string","enum":["retail","professional"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["investorClass","assessedAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"appropriateness":{"anyOf":[{"type":"object","properties":{"outcome":{"type":"string","enum":["appropriate","not_appropriate"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["outcome","assessedAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]}},"required":["userId","residence","usPerson","classification","appropriateness"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}},"patch":{"summary":"Supply a user's eligibility (tenant administrators)","tags":["tokenized-assets"],"description":"The tenant supplies one or more items of a user's eligibility; each replaces that item's current value, and the earlier one is kept. 400 `TOKENIZED_ASSETS_ELIGIBILITY_INVALID`: no item, a country that is not one, a region of another country, a time in the future. Eligibility is supplied by the tenant, the authorised entity: its residence, the Regulation S declaration, the client's classification and the appropriateness test's outcome, each with when, its source and who supplied it; every earlier value is kept. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","description":"The environment whose tokenized assets the tenant has set up (the eligibility is the user's in both)."},"residence":{"type":"object","properties":{"country":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2."},"subdivision":{"anyOf":[{"type":"string","pattern":"^[A-Z]{2}-[A-Z0-9]{1,3}$"},{"type":"null"}],"description":"ISO 3166-2, when known: required where a region of the country is excluded."},"declaredAt":{"type":"string","format":"date-time","description":"ISO 8601, with its offset."},"source":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Where it comes from, in the tenant's words: for example kyc, self_declaration, mifid_classification, appropriateness_test."},"reference":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"The tenant's own reference for it."}},"required":["country","declaredAt","source"],"additionalProperties":false},"usPerson":{"type":"object","properties":{"isUsPerson":{"type":"boolean","description":"The Regulation S declaration: false when the user declared not to be a \"US person\" (Rule 902) nor acting for one."},"declaredAt":{"type":"string","format":"date-time","description":"ISO 8601, with its offset."},"source":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Where it comes from, in the tenant's words: for example kyc, self_declaration, mifid_classification, appropriateness_test."},"reference":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"The tenant's own reference for it."}},"required":["isUsPerson","declaredAt","source"],"additionalProperties":false},"classification":{"type":"object","properties":{"investorClass":{"type":"string","enum":["retail","professional"]},"assessedAt":{"type":"string","format":"date-time","description":"ISO 8601, with its offset."},"source":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Where it comes from, in the tenant's words: for example kyc, self_declaration, mifid_classification, appropriateness_test."},"reference":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"The tenant's own reference for it."}},"required":["investorClass","assessedAt","source"],"additionalProperties":false},"appropriateness":{"type":"object","properties":{"outcome":{"type":"string","enum":["appropriate","not_appropriate"]},"assessedAt":{"type":"string","format":"date-time","description":"ISO 8601, with its offset."},"source":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,63}$","description":"Where it comes from, in the tenant's words: for example kyc, self_declaration, mifid_classification, appropriateness_test."},"reference":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"The tenant's own reference for it."}},"required":["outcome","assessedAt","source"],"additionalProperties":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"userId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"residence":{"anyOf":[{"type":"object","properties":{"country":{"type":"string"},"subdivision":{"type":["string","null"]},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["country","subdivision","declaredAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"usPerson":{"anyOf":[{"type":"object","properties":{"isUsPerson":{"type":"boolean"},"declaredAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["isUsPerson","declaredAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"classification":{"anyOf":[{"type":"object","properties":{"investorClass":{"type":"string","enum":["retail","professional"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["investorClass","assessedAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]},"appropriateness":{"anyOf":[{"type":"object","properties":{"outcome":{"type":"string","enum":["appropriate","not_appropriate"]},"assessedAt":{"type":"string"},"source":{"type":"string"},"suppliedAt":{"type":"string"},"reference":{"type":["string","null"]},"suppliedBy":{"type":"string","description":"The tenant's principal who supplied it."},"suppliedByRole":{"type":"string"}},"required":["outcome","assessedAt","source","suppliedAt","reference","suppliedBy","suppliedByRole"],"additionalProperties":false},{"type":"null"}]}},"required":["userId","residence","usPerson","classification","appropriateness"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/documents":{"get":{"summary":"An asset's documents","tags":["tokenized-assets"],"description":"The documents the user accepts before a binding quote of the asset — the prospectus, the final terms and, for a retail client, the key information document — in their current version, in the language asked for or in English, each with the SHA-256 of its file and whether the user accepted that version. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[a-z]{2}$","default":"en"},"in":"query","name":"language","required":false,"description":"The language wanted; a document without it is answered in English."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"documents":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["prospectus","final_terms","kid","prospectus_supplement","risk_issuer_control","risk_upgradeable_contracts","risk_securities_lending","risk_product_closure","risk_leverage"],"description":"prospectus, final_terms, kid (key information document), prospectus_supplement, or a risk disclosure: risk_issuer_control (the issuer can move or freeze tokens), risk_upgradeable_contracts, risk_securities_lending (the underlying shares may be lent), risk_product_closure, risk_leverage (leveraged and inverse products)."},"version":{"type":"integer"},"language":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"sha256":{"type":"string"},"appliesTo":{"type":"string","enum":["asset","all"],"description":"This asset's own document, or one for every asset (a base prospectus)."},"publishedAt":{"type":["null","string"]},"validUntil":{"type":"string","description":"Until when the document is valid (a base prospectus expires): present only for a document that has an end. Past it, nothing is sold until a renewed version is published."},"accepted":{"type":"boolean"}},"required":["kind","version","language","title","url","sha256","appliesTo","publishedAt","accepted"],"additionalProperties":false}}},"required":["isTestnet","symbol","documents"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/documents/acceptances":{"post":{"summary":"Accept an asset's document","tags":["tokenized-assets"],"description":"Records that the user accepted the document they were shown: its kind, current version, language and file hash, as the documents route answered them (409 `TOKENIZED_ASSETS_DOCUMENT_MISMATCH` otherwise). 201 the first time; 200 with the first acceptance afterwards. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false},"kind":{"type":"string","enum":["prospectus","final_terms","kid","prospectus_supplement","risk_issuer_control","risk_upgradeable_contracts","risk_securities_lending","risk_product_closure","risk_leverage"],"description":"prospectus, final_terms, kid (key information document), prospectus_supplement, or a risk disclosure: risk_issuer_control (the issuer can move or freeze tokens), risk_upgradeable_contracts, risk_securities_lending (the underlying shares may be lent), risk_product_closure, risk_leverage (leveraged and inverse products)."},"version":{"type":"integer","exclusiveMinimum":0},"language":{"type":"string","pattern":"^[a-z]{2}$","description":"ISO 639-1, lower case."},"sha256":{"type":"string","pattern":"^[0-9a-fA-F]{64}$","description":"The SHA-256 of the file, in hex."}},"required":["kind","version","language","sha256"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"kind":{"type":"string","enum":["prospectus","final_terms","kid","prospectus_supplement","risk_issuer_control","risk_upgradeable_contracts","risk_securities_lending","risk_product_closure","risk_leverage"],"description":"prospectus, final_terms, kid (key information document), prospectus_supplement, or a risk disclosure: risk_issuer_control (the issuer can move or freeze tokens), risk_upgradeable_contracts, risk_securities_lending (the underlying shares may be lent), risk_product_closure, risk_leverage (leveraged and inverse products)."},"version":{"type":"integer"},"language":{"type":"string"},"acceptedAt":{"type":"string"}},"required":["symbol","kind","version","language","acceptedAt"],"additionalProperties":false}}}},"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"kind":{"type":"string","enum":["prospectus","final_terms","kid","prospectus_supplement","risk_issuer_control","risk_upgradeable_contracts","risk_securities_lending","risk_product_closure","risk_leverage"],"description":"prospectus, final_terms, kid (key information document), prospectus_supplement, or a risk disclosure: risk_issuer_control (the issuer can move or freeze tokens), risk_upgradeable_contracts, risk_securities_lending (the underlying shares may be lent), risk_product_closure, risk_leverage (leveraged and inverse products)."},"version":{"type":"integer"},"language":{"type":"string"},"acceptedAt":{"type":"string"}},"required":["symbol","kind","version","language","acceptedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/requirements":{"get":{"summary":"What a binding quote of an asset needs","tags":["tokenized-assets"],"description":"Whether the signed-in user can get a binding quote of the asset now, and if not, why: the requirement that says no, and everything missing. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"path","name":"symbol","required":true,"description":"The token's symbol, as its contract names it (case matters)."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"eligible":{"type":"boolean","description":"Whether the user can get a binding quote for the asset now."},"refusal":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"reason":{"type":"string"}},"required":["code"],"additionalProperties":false},{"type":"null"}],"description":"When a requirement says no: TOKENIZED_ASSETS_COUNTRY_EXCLUDED, …_US_PERSON, …_NOT_APPROPRIATE or …_PROFESSIONAL_ONLY, with its reason."},"missing":{"type":"array","items":{"type":"string"},"description":"What is missing: residence, residence_subdivision, us_person_declaration, classification, appropriateness, document:<kind> (none published), acceptance:<kind> (not accepted)."},"documents":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["prospectus","final_terms","kid","prospectus_supplement","risk_issuer_control","risk_upgradeable_contracts","risk_securities_lending","risk_product_closure","risk_leverage"],"description":"prospectus, final_terms, kid (key information document), prospectus_supplement, or a risk disclosure: risk_issuer_control (the issuer can move or freeze tokens), risk_upgradeable_contracts, risk_securities_lending (the underlying shares may be lent), risk_product_closure, risk_leverage (leveraged and inverse products)."},"version":{"anyOf":[{"type":"integer"},{"type":"null"}]},"accepted":{"type":"boolean"}},"required":["kind","version","accepted"],"additionalProperties":false}}},"required":["isTestnet","symbol","eligible","refusal","missing","documents"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/quotes/{quoteId}/execute":{"post":{"summary":"Execute a binding quote","tags":["tokenized-assets"],"description":"Carries out one of the user's binding quotes (status `attested`) exactly as it was signed, within its validity. A wallet its owner signs for needs a long quote (409 `TOKENIZED_ASSETS_QUOTE_TOO_SHORT`); use a limit order otherwise. A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. Refused before anything is signed when the chain says no: 409 `TOKENIZED_ASSETS_QUOTE_EXPIRED`, `…_QUOTE_ALREADY_USED`, `…_MARKET_CLOSED`, `…_PRICE_OUT_OF_BOUNDS`, `…_ASSET_NOT_ACCEPTED`, `…_ASSET_PAUSED`, `…_WALLET_BLOCKED`, `…_WALLET_ACCOUNT_MISMATCH`, `…_INSUFFICIENT_BALANCE`; 400 `TOKENIZED_ASSETS_ORDER_TOO_SMALL` below the contracts' least amount; the user's eligibility is read again (403). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/operations":{"get":{"summary":"One's operations","tags":["tokenized-assets"],"description":"The signed-in user's operations in the environment, newest first. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"operations":{"type":"array","items":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["isTestnet","operations","limit","offset"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/operations/{operationId}":{"get":{"summary":"One of one's operations","tags":["tokenized-assets"],"description":"An operation of the signed-in user, read again from the chain while it is not final. 404 `TOKENIZED_ASSETS_OPERATION_NOT_FOUND` for anyone else's. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/operations/{operationId}/broadcast":{"post":{"summary":"Send an operation's signatures","tags":["tokenized-assets"],"description":"The signatures of an operation waiting for them, one per step, in order: each must be the operation's wallet's over the step as built (400 `TOKENIZED_ASSETS_SIGNATURE_INVALID`); after `signingExpiresAt`, 409 `TOKENIZED_ASSETS_SIGNING_EXPIRED`. The chain is read again first (a trade's quote as at its execution). A node refusing the first step answers 400 `TOKENIZED_ASSETS_BROADCAST_REFUSED`, and the same signatures may be sent again within the window — with a new Idempotency-Key when the refused call sent one: its key answers 409 `IDEMPOTENCY_OUTCOME_UNKNOWN` from then on. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"signatures":{"type":"array","items":{"type":"object","properties":{"v":{"type":"string","maxLength":4,"description":"The y parity: 0 or 1 (in hexadecimal, 0x optional: also 0x0, 0x1), or the legacy 27 or 28 — written in decimal (27, 28) or in hexadecimal (1b, 1c, 0x1b, 0x1c)."},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"}},"required":["v","r","s"],"additionalProperties":false},"minItems":1,"maxItems":8,"description":"One signature per step, in order, over the step's txHashToSign."}},"required":["signatures"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/limit-orders":{"post":{"summary":"Place a limit order","tags":["tokenized-assets"],"description":"An order placed on chain from the user's own wallet (a wallet its owner signs for, where the tenant keeps assets in its users' wallets), filled later at the limit price or better, or not at all before it expires. Within the tenant's limits at the limit price; in the regular session only, and lapsing at its close at the latest, when the tenant does not trade after hours. The steps (an exact approval and the order) are signed by the client and sent to /operations/{operationId}/broadcast. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,56],"description":"The chain: 1 (Ethereum) or 56 (BNB Chain)."},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","maxLength":80,"description":"How many tokens, exactly (at most 18 digits after the point). Give this or notionalValue."},"notionalValue":{"type":"string","maxLength":80,"description":"How many US dollars, exactly, in the payment token's decimals. Give this or tokenAmount."},"limitPrice":{"type":"string","maxLength":80,"description":"US dollars per token: the most a buy pays, the least a sale takes."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDon"]},"expiresInSeconds":{"type":"integer","minimum":60,"maximum":604800,"description":"How long the order stays open; the market's own maximum and, when the tenant trades in the regular session only, its close apply."}},"required":["symbol","chainId","side","limitPrice"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/yield/price":{"get":{"summary":"The yield token's price","tags":["tokenized-assets"],"description":"The yield token's price as its manager reads it from its oracle, and the price its rebasing form's balances follow, from the chain. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"chainId":{"type":"integer"},"priceUsd":{"type":"string","description":"The yield token's price, as its manager subscribes and redeems at."},"rebasingPriceUsd":{"type":"string","description":"The price the rebasing form's balances follow."},"sharesPerToken":{"type":"integer"},"blockNumber":{"type":"string"}},"required":["isTestnet","chainId","priceUsd","rebasingPriceUsd","sharesPerToken","blockNumber"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/yield/subscriptions":{"post":{"summary":"Buy the yield token","tags":["tokenized-assets"],"description":"The yield token, or its rebasing form, bought with the stablecoin from the registered wallet (the tenant's, holding it for the user, or the user's own), at the oracle's price; the least it takes is the price's expectation less a small tolerance. When the chain gives less, its transaction reverts and nothing moves: the operation ends `failed` with `failureCode` `TOKENIZED_ASSETS_PRICE_MOVED`, answered 201 here (200 from /operations/{operationId}/broadcast), not as an error. Within the tenant's limits. A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"token":{"type":"string","enum":["USDY","rUSDY"],"description":"The yield token, or its rebasing form."},"amount":{"type":"string","maxLength":80,"description":"The stablecoin paid in, as a decimal (6 digits after the point at most)."}},"required":["token","amount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/yield/redemptions":{"post":{"summary":"Sell the yield token","tags":["tokenized-assets"],"description":"The yield token, or its rebasing form (as whole yield tokens' worth of its shares), sold for the stablecoin at the oracle's price, with the same tolerance: when the chain gives less, its transaction reverts and nothing moves — the operation ends `failed` with `failureCode` `TOKENIZED_ASSETS_PRICE_MOVED`, answered 201 (200 from /operations/{operationId}/broadcast), not as an error. Within the tenant's limits. A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"token":{"type":"string","enum":["USDY","rUSDY"]},"tokenAmount":{"type":"string","maxLength":80,"description":"How much of the token is sold, as a decimal."}},"required":["token","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/yield/conversions":{"post":{"summary":"Convert the yield token","tags":["tokenized-assets"],"description":"The yield token wrapped into its rebasing form, or the rebasing form unwrapped back into whole yield tokens. A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"from":{"type":"string","enum":["USDY","rUSDY"],"description":"What is converted: the yield token into its rebasing form, or back."},"tokenAmount":{"type":"string","maxLength":80}},"required":["from","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/positions":{"get":{"summary":"One's holdings","tags":["tokenized-assets"],"description":"What the tenant's wallet holds for the signed-in user, per asset and chain, with what it cost and its average cost. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"positions":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"chainId":{"type":"integer"},"unit":{"type":"string","enum":["token","shares","base"]},"tokenAmount":{"type":"string","description":"A decimal number, as a string."},"costUsd":{"type":"string","description":"What the holding cost, at the trades' values (the tenant's fee apart)."},"averageCostUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"movements":{"type":"integer"},"updatedAt":{"type":"string"},"multiplier":{"type":["null","string"],"description":"Shares of the underlying instrument each token stands for on this chain (dividends reinvested), as last read; null when the asset has none or it was not read."},"underlyingShares":{"type":["null","string"],"description":"The holding in shares of the underlying instrument: tokenAmount × multiplier; null when there is no multiplier."},"multiplierAsOf":{"type":["null","string"],"description":"When the multiplier was last read; null when it never was."}},"required":["symbol","chainId","unit","tokenAmount","costUsd","averageCostUsd","movements","updatedAt","multiplier","underlyingShares","multiplierAsOf"],"additionalProperties":false}}},"required":["isTestnet","positions"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/positions/movements":{"get":{"summary":"One's holdings' history","tags":["tokenized-assets"],"description":"Every change of the signed-in user's holdings, newest first: buys, sales, the yield token's subscriptions, redemptions and conversions, deliveries and returns, and what a refused operation gave back. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"in":"query","name":"symbol","required":false}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"movements":{"type":"array","items":{"type":"object","properties":{"movementId":{"type":"string"},"operationId":{"type":"string"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"unit":{"type":"string","enum":["token","shares","base"]},"kind":{"type":"string"},"tokenAmount":{"type":"string","description":"A decimal number, as a string."},"costUsd":{"type":"string","description":"A decimal number, as a string."},"tokenAmountAfter":{"type":"string","description":"A decimal number, as a string."},"costUsdAfter":{"type":"string","description":"A decimal number, as a string."},"txHash":{"type":["null","string"]},"createdAt":{"type":"string"}},"required":["movementId","operationId","symbol","chainId","unit","kind","tokenAmount","costUsd","tokenAmountAfter","costUsdAfter","txHash","createdAt"],"additionalProperties":false}},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["isTestnet","movements","limit","offset"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/positions/deliveries":{"post":{"summary":"Deliver holdings to one's wallet","tags":["tokenized-assets"],"description":"Tokens the tenant's wallet holds for the user, sent to one of the user's own wallets (the primary one of the environment by default). The transfer is simulated first: one the token refuses (a blocklist, sanctions or a pause) answers 409 `TOKENIZED_ASSETS_WALLET_BLOCKED` and nothing is taken. Then it is taken from the holding at once, and given back if the chain refuses the transfer after all (the operation ends `failed`). A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"tokenAmount":{"type":"string","maxLength":80},"walletId":{"type":"string","format":"uuid","description":"One of the user's own wallets of the environment; the primary one by default."}},"required":["symbol","chainId","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/positions/returns":{"post":{"summary":"Return tokens to the tenant's wallet","tags":["tokenized-assets"],"description":"Tokens sent back from one of the user's own wallets to the tenant's wallet, to be sold from there: added to the holding once the chain shows the transfer. While the tenant's wallet does not operate in the environment (production, today), refused 409 `TOKENIZED_ASSETS_OMNIBUS_NOT_LIVE` before anything is signed or stored, as a delivery from it is: the tokens stay in the user's wallet. A wallet Aurea signs for is signed and sent at once (201, `submitted` or `completed`); a wallet its owner signs for gets the steps to sign (`steps`, each `txHashToSign`) and sends the signatures to /operations/{operationId}/broadcast before `signingExpiresAt`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"tokenAmount":{"type":"string","maxLength":80},"walletId":{"type":"string","format":"uuid","description":"One of the user's own wallets of the environment; the primary one by default."}},"required":["symbol","chainId","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/assets/{symbol}/corporate-actions":{"get":{"summary":"An asset's corporate actions","tags":["tokenized-assets"],"description":"What is known of an asset the tenant offers — paused or not on each chain, its shares multiplier, its latest dividend — and the corporate actions seen since it was first read, newest first: paused and resumed on a chain, a new dividend, a new multiplier. The same news reaches the tenant's webhooks as `tokenized_asset.paused`, `tokenized_asset.resumed` and `tokenized_asset.corporate_action`. While an asset is paused on a chain, its quotes and its execution there are refused with 409 `TOKENIZED_ASSETS_ASSET_PAUSED`. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","enum":["paused","resumed","dividend","multiplier"]},"in":"query","name":"kind","required":false,"description":"Only the actions of this kind."},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0,"maximum":100000,"default":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string"},"in":"path","name":"symbol","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"states":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"integer"},"buyPaused":{"type":"boolean","description":"Buying is paused on this chain: quotes and buys are refused."},"sellPaused":{"type":"boolean","description":"Selling is paused on this chain: quotes and sales are refused."},"tokenPaused":{"type":["null","boolean"],"description":"The token itself is paused: no transfer moves it."},"limited":{"type":["null","boolean"]},"reason":{"type":["null","string"],"description":"Why trading is paused, as an Aurea code, when it is said."},"pausedSince":{"type":["null","string"]},"multiplier":{"type":["null","string"],"description":"Shares of the underlying instrument each token stands for (dividends reinvested); null when the asset has none."},"corporateActionPause":{"type":["null","boolean"]},"multiplierChangedAt":{"type":["null","string"]},"dividend":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","description":"A decimal number, as a string."},"paymentDate":{"type":"string"},"yield":{"type":"string","description":"A decimal number, as a string."},"frequency":{"type":"string"}},"required":["amount","paymentDate","yield","frequency"],"additionalProperties":false},{"type":"null"}],"description":"The latest dividend."},"checkedAt":{"type":"string","description":"When it was last read."}},"required":["chainId","buyPaused","sellPaused","tokenPaused","limited","reason","pausedSince","multiplier","corporateActionPause","multiplierChangedAt","dividend","checkedAt"],"additionalProperties":false},"description":"What is known of the asset on each chain; empty until it was read."},"actions":{"type":"array","items":{"type":"object","properties":{"actionId":{"type":"string"},"symbol":{"type":"string"},"chainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The chain a pause is on; null for a dividend or a multiplier, which are the asset's."},"kind":{"type":"string","enum":["paused","resumed","dividend","multiplier"]},"detail":{"type":"object","properties":{"buyPaused":{"type":"boolean"},"sellPaused":{"type":"boolean"},"tokenPaused":{"type":"boolean"},"reason":{"type":["null","string"]},"pausedSince":{"type":["null","string"]},"amount":{"type":"string"},"paymentDate":{"type":"string"},"yield":{"type":"string"},"frequency":{"type":"string"},"previous":{"type":"string"},"current":{"type":"string"}},"additionalProperties":false,"description":"paused: buyPaused, sellPaused, tokenPaused, reason; resumed: pausedSince; dividend: amount, paymentDate, yield, frequency; multiplier: previous, current."},"source":{"type":"string","enum":["feed","chain"],"description":"feed: the market data feed said so; chain: the asset's contracts or oracle."},"effectiveAt":{"type":["null","string"]},"observedAt":{"type":"string"}},"required":["actionId","symbol","chainId","kind","detail","source","effectiveAt","observedAt"],"additionalProperties":false}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}},"required":["isTestnet","symbol","states","actions","total","limit","offset"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes":{"post":{"summary":"A secondary-market quote","tags":["tokenized-assets"],"description":"An indicative quote of the secondary market for an asset the tenant offers, paid from and delivered to one of the user's own wallets: what it pays, what it should receive and the least it will. Kept five minutes for /approve and /execute (one minute on Solana, where no approval is needed), never answered with the transaction it would send. No route now: 409 `TOKENIZED_ASSETS_SECONDARY_NO_ROUTE`. On Solana, a wallet its owner signs for where the tenant does not offer that: 409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`. The secondary route: offered only by a tenant that switched it on (else 403 `TOKENIZED_ASSETS_SECONDARY_ROUTE_OFF`), in production only (409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`), with the same eligibility and documents as the primary route (403) and refused while the asset is paused (409 `TOKENIZED_ASSETS_ASSET_PAUSED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,56,1399811149],"description":"The chain: 1 (Ethereum), 56 (BNB Chain) or 1399811149 (Solana, where the platform offers it for the asset; elsewhere 400 TOKENIZED_ASSETS_CHAIN_UNSUPPORTED)."},"side":{"type":"string","enum":["buy","sell"]},"amount":{"type":"string","maxLength":80,"description":"What is paid, exactly, as a decimal: the chain's stablecoin for a buy (USDC on Ethereum, USDT on BNB Chain, USDC on Solana), the asset's tokens for a sale (as the wallet's balance shows them)."},"walletId":{"type":"string","format":"uuid","description":"One of the user's own wallets of the environment, that pays and receives; the primary one by default."},"slippageBps":{"type":"integer","minimum":1,"maximum":300,"description":"How far below the quote the swap may deliver, in basis points (default 50)."}},"required":["symbol","chainId","side","amount"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"route":{"type":"string","enum":["secondary"]},"indicative":{"type":"boolean","description":"The amounts are what the market offers now; the swap delivers at least receive.minimum.","enum":[true]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"pay":{"type":"object","properties":{"token":{"type":"string"},"amount":{"type":"string","description":"A decimal number, as a string."}},"required":["token","amount"],"additionalProperties":false},"receive":{"type":"object","properties":{"token":{"type":"string"},"amount":{"type":"string","description":"A decimal number, as a string."},"minimum":{"type":"string","description":"The least the swap delivers."}},"required":["token","amount","minimum"],"additionalProperties":false},"approvalRequired":{"type":"boolean","description":"The wallet must first allow the swap the amount paid: /approve before /execute."},"status":{"type":"string","enum":["quoted","approving","executing","executed","failed","expired"],"description":"quoted; approving: the approval asked for; executing, executed: the swap asked for (once); failed (failureCode); expired: its time is over."},"failureCode":{"type":["null","string"]},"transactionId":{"type":["null","string"],"description":"The swap's transaction, once executed (/v1/transactions)."},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["quoteId","route","indicative","isTestnet","symbol","chainId","side","pay","receive","approvalRequired","status","failureCode","transactionId","redeemableFromIssuer","disclosure","expiresAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes/{quoteId}":{"get":{"summary":"A secondary-market quote","tags":["tokenized-assets"],"description":"One of the user's own secondary-market quotes, in the environment asked. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","parameters":[{"schema":{"type":"string","enum":["true","false"],"default":"false"},"in":"query","name":"isTestnet","required":false,"description":"The environment: `true` the test environment, `false` (the default) production."},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"route":{"type":"string","enum":["secondary"]},"indicative":{"type":"boolean","description":"The amounts are what the market offers now; the swap delivers at least receive.minimum.","enum":[true]},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"pay":{"type":"object","properties":{"token":{"type":"string"},"amount":{"type":"string","description":"A decimal number, as a string."}},"required":["token","amount"],"additionalProperties":false},"receive":{"type":"object","properties":{"token":{"type":"string"},"amount":{"type":"string","description":"A decimal number, as a string."},"minimum":{"type":"string","description":"The least the swap delivers."}},"required":["token","amount","minimum"],"additionalProperties":false},"approvalRequired":{"type":"boolean","description":"The wallet must first allow the swap the amount paid: /approve before /execute."},"status":{"type":"string","enum":["quoted","approving","executing","executed","failed","expired"],"description":"quoted; approving: the approval asked for; executing, executed: the swap asked for (once); failed (failureCode); expired: its time is over."},"failureCode":{"type":["null","string"]},"transactionId":{"type":["null","string"],"description":"The swap's transaction, once executed (/v1/transactions)."},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."},"expiresAt":{"type":"string"},"createdAt":{"type":"string"}},"required":["quoteId","route","indicative","isTestnet","symbol","chainId","side","pay","receive","approvalRequired","status","failureCode","transactionId","redeemableFromIssuer","disclosure","expiresAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes/{quoteId}/approve":{"post":{"summary":"Approve a secondary-market quote's payment","tags":["tokenized-assets"],"description":"Allows the swap exactly the amount the quote pays, from the quote's wallet. Only for a quote with approvalRequired, waiting and within its time (409 `TOKENIZED_ASSETS_QUOTE_NOT_EXECUTABLE`, `TOKENIZED_ASSETS_QUOTE_EXPIRED`). A wallet Aurea signs for is signed and sent at once (`txHash`); a wallet its owner signs for gets the transaction to sign (`requiresClientSigning`, `txHashToSign`, `preparedTxId`) and sends the signature to /broadcast — on Solana the message to sign (`messageToSign`), sent to /broadcast-solana. The secondary route: offered only by a tenant that switched it on (else 403 `TOKENIZED_ASSETS_SECONDARY_ROUTE_OFF`), in production only (409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`), with the same eligibility and documents as the primary route (403) and refused while the asset is paused (409 `TOKENIZED_ASSETS_ASSET_PAUSED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"step":{"type":"string","enum":["approval","swap"]},"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"requiresClientSigning":{"type":"boolean"},"preparedTxId":{"type":"string","description":"A wallet its owner signs for: sign txHashToSign, then /broadcast with this id."},"txHashToSign":{"type":"string"},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the bytes of the swap's message, base64, to sign (ed25519) and send to /broadcast-solana with preparedTxId before the quote expires."},"chainId":{"type":"integer"},"nonce":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"expiresAt":{"type":"string"},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."}},"required":["quoteId","step","redeemableFromIssuer","disclosure"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes/{quoteId}/execute":{"post":{"summary":"Execute a secondary-market quote","tags":["tokenized-assets"],"description":"The swap the quote kept, once (a second call: 409 `TOKENIZED_ASSETS_QUOTE_NOT_EXECUTABLE`), within its time (409 `TOKENIZED_ASSETS_QUOTE_EXPIRED`): the asset bought into, or sold from, the quote's wallet; the swap's transaction is the user's like any other. Refused by the swap: 400 `TOKENIZED_ASSETS_SECONDARY_REFUSED`, the quote failed. When the swap path answers without a transaction (no `transactionId` in the answer), the quote is `failed` with `failureCode` `TOKENIZED_ASSETS_SECONDARY_REFUSED` (GET /secondary/quotes/{quoteId}), though the answer is 200. A wallet Aurea signs for is signed and sent at once (`txHash`); a wallet its owner signs for gets the transaction to sign (`requiresClientSigning`, `txHashToSign`, `preparedTxId`) and sends the signature to /broadcast — on Solana the message to sign (`messageToSign`), sent to /broadcast-solana. The secondary route: offered only by a tenant that switched it on (else 403 `TOKENIZED_ASSETS_SECONDARY_ROUTE_OFF`), in production only (409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`), with the same eligibility and documents as the primary route (403) and refused while the asset is paused (409 `TOKENIZED_ASSETS_ASSET_PAUSED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"step":{"type":"string","enum":["approval","swap"]},"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"requiresClientSigning":{"type":"boolean"},"preparedTxId":{"type":"string","description":"A wallet its owner signs for: sign txHashToSign, then /broadcast with this id."},"txHashToSign":{"type":"string"},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the bytes of the swap's message, base64, to sign (ed25519) and send to /broadcast-solana with preparedTxId before the quote expires."},"chainId":{"type":"integer"},"nonce":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"expiresAt":{"type":"string"},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."}},"required":["quoteId","step","redeemableFromIssuer","disclosure"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes/{quoteId}/broadcast":{"post":{"summary":"Send a signed secondary-market step","tags":["tokenized-assets"],"description":"The signature of a step the quote prepared (its approval, or its swap within the quote's time), checked against the prepared transaction and the wallet, then sent. Another quote's prepared transaction, or a quote on Solana (its swap is sent to /broadcast-solana): 400 `TOKENIZED_ASSETS_SECONDARY_REFUSED`. The secondary route: offered only by a tenant that switched it on (else 403 `TOKENIZED_ASSETS_SECONDARY_ROUTE_OFF`), in production only (409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`), with the same eligibility and documents as the primary route (403) and refused while the asset is paused (409 `TOKENIZED_ASSETS_ASSET_PAUSED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"preparedTxId":{"type":"string","format":"uuid","description":"The prepared transaction the step answered."},"v":{"type":"integer","minimum":0,"maximum":28},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,64}$"}},"required":["preparedTxId","v","r","s"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"step":{"type":"string","enum":["approval","swap"]},"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"requiresClientSigning":{"type":"boolean"},"preparedTxId":{"type":"string","description":"A wallet its owner signs for: sign txHashToSign, then /broadcast with this id."},"txHashToSign":{"type":"string"},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the bytes of the swap's message, base64, to sign (ed25519) and send to /broadcast-solana with preparedTxId before the quote expires."},"chainId":{"type":"integer"},"nonce":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"expiresAt":{"type":"string"},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."}},"required":["quoteId","step","redeemableFromIssuer","disclosure"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/secondary/quotes/{quoteId}/broadcast-solana":{"post":{"summary":"Send a signed secondary-market swap on Solana","tags":["tokenized-assets"],"description":"A Solana wallet's signature of the swap a quote on Solana prepared (`messageToSign`), within the quote's time (409 `TOKENIZED_ASSETS_QUOTE_EXPIRED`): checked against the wallet over exactly that message, put in the prepared transaction and sent; the answer is the swap confirmed or failed on chain. Another quote's swap, or a quote not on Solana: 400 `TOKENIZED_ASSETS_SECONDARY_REFUSED`. The secondary route: offered only by a tenant that switched it on (else 403 `TOKENIZED_ASSETS_SECONDARY_ROUTE_OFF`), in production only (409 `TOKENIZED_ASSETS_SECONDARY_ROUTE_UNAVAILABLE`), with the same eligibility and documents as the primary route (403) and refused while the asset is paused (409 `TOKENIZED_ASSETS_ASSET_PAUSED`). A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"transactionId":{"type":"string","format":"uuid","description":"The swap's transaction, as /execute answered it."},"preparedTxId":{"type":"string","format":"uuid","description":"The prepared swap /execute answered."},"signature":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{64,90}$","description":"The wallet's ed25519 signature of messageToSign, base58."}},"required":["transactionId","preparedTxId","signature"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quoteId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string"},"step":{"type":"string","enum":["approval","swap"]},"transactionId":{"type":"string"},"txHash":{"type":"string"},"status":{"type":"string"},"requiresClientSigning":{"type":"boolean"},"preparedTxId":{"type":"string","description":"A wallet its owner signs for: sign txHashToSign, then /broadcast with this id."},"txHashToSign":{"type":"string"},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the bytes of the swap's message, base64, to sign (ed25519) and send to /broadcast-solana with preparedTxId before the quote expires."},"chainId":{"type":"integer"},"nonce":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"expiresAt":{"type":"string"},"redeemableFromIssuer":{"type":"boolean","description":"Tokens bought on the secondary market cannot be redeemed from their issuer.","enum":[false]},"disclosure":{"type":"string","description":"What the holder must be told."}},"required":["quoteId","step","redeemableFromIssuer","disclosure"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market-orders/indicative":{"post":{"summary":"Estimate a market order","tags":["tokenized-assets"],"description":"What a market order of the asset would be now — the stablecoin paid for tokens, or tokens sold for it, carried out by the issuer at the market price: the indicative price, the fee, the least an order may be worth, how long the issuer takes. Nothing is stored or reserved. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"side":{"type":"string","enum":["buy","sell"]},"amount":{"type":"string","maxLength":80,"description":"A buy: the stablecoin paid. A sale: the tokens sold, as wallet balances show them."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDG"],"description":"The stablecoin paid or received, where the asset takes it on the chain."}},"required":["symbol","chainId","side","amount","paymentToken"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"paymentToken":{"type":"string"},"amount":{"type":"string","description":"A decimal number, as a string."},"indicative":{"type":"boolean","enum":[true]},"priceUsd":{"type":"string","description":"The token's indicative price now."},"valueUsd":{"type":"string","description":"A decimal number, as a string."},"feeUsd":{"type":"string","description":"The issuer's fee, estimated."},"minimumUsd":{"type":"string","description":"The least an order may be worth."},"estimatedTokenAmount":{"type":["null","string"],"description":"A buy: the tokens it would bring at the indicative price, after the fee."},"estimatedPaymentAmount":{"type":["null","string"],"description":"A sale: the stablecoin it would bring at the indicative price, after the fee."},"settlementSeconds":{"type":"integer","description":"How long the issuer usually takes to deliver."}},"required":["isTestnet","symbol","chainId","side","paymentToken","amount","indicative","priceUsd","valueUsd","feeUsd","minimumUsd","estimatedTokenAmount","estimatedPaymentAmount","settlementSeconds"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/market-orders":{"post":{"summary":"Place a market order","tags":["tokenized-assets"],"description":"Sends exactly the stablecoin (a buy) or the tokens (a sale) from the wallet the issuer knows — the tenant's, holding them for the user, or the user's own — to the issuer, which buys or sells at the market price and delivers the tokens or the stablecoin back to it. Within the tenant's limits and the issuer's minimum. A wallet Aurea signs for is signed and sent at once (201); a wallet its owner signs for gets the steps to sign (EVM: `steps`, sent to /operations/{operationId}/broadcast; Solana: `messageToSign`, sent to /operations/{operationId}/broadcast-solana) before `signingExpiresAt`. Once what was sent is on chain the operation is `settling` until the issuer delivers (then `completed`; `failed` with TOKENIZED_ASSETS_SETTLEMENT_REFUNDED when it gives back what was sent). Refused: 403 TOKENIZED_ASSETS_FLOW_OFF (the tenant does not offer it), 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE (not available here or now; details.reason), the eligibility and documents (403), 409 TOKENIZED_ASSETS_ASSET_PAUSED and TOKENIZED_ASSETS_MULTIPLIER_UPDATE, TOKENIZED_ASSETS_MARKET_CLOSED, TOKENIZED_ASSETS_AFTER_HOURS_OFF, 400 TOKENIZED_ASSETS_ORDER_TOO_SMALL, 409 TOKENIZED_ASSETS_LIMIT_REACHED and TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED, TOKENIZED_ASSETS_WALLET_NOT_REGISTERED, TOKENIZED_ASSETS_WALLET_BLOCKED, TOKENIZED_ASSETS_INSUFFICIENT_BALANCE, TOKENIZED_ASSETS_POSITION_INSUFFICIENT. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"side":{"type":"string","enum":["buy","sell"]},"amount":{"type":"string","maxLength":80,"description":"A buy: the stablecoin paid. A sale: the tokens sold, as wallet balances show them."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDG"],"description":"The stablecoin paid or received, where the asset takes it on the chain."}},"required":["symbol","chainId","side","amount","paymentToken"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/instant-orders/indicative":{"post":{"summary":"Estimate an instant order","tags":["tokenized-assets"],"description":"The price an instant order of the asset would be executed at now, kept for a few seconds; nothing is reserved. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","maxLength":80,"description":"The tokens bought or sold, as wallet balances show them (or cashAmount)."},"cashAmount":{"type":"string","maxLength":80,"description":"The stablecoin paid or received (or tokenAmount)."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDG"],"description":"The stablecoin paid or received, where the asset takes it on the chain."}},"required":["symbol","chainId","side","paymentToken"],"additionalProperties":false}}},"required":true},"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"type":"string","enum":["buy","sell"]},"paymentToken":{"type":"string"},"indicative":{"type":"boolean","enum":[true]},"priceUsd":{"type":"string","description":"The price an instant order placed now would be executed at, for a few seconds."},"tokenAmount":{"type":"string","description":"A decimal number, as a string."},"cashAmount":{"type":"string","description":"A decimal number, as a string."},"expiresAt":{"type":"string"}},"required":["isTestnet","symbol","chainId","side","paymentToken","indicative","priceUsd","tokenAmount","cashAmount","expiresAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/instant-orders":{"post":{"summary":"Place an instant order","tags":["tokenized-assets"],"description":"A binding price from the issuer for the wallet it knows, checked against what was asked, and executed on chain at once: both sides in one transaction, within the price's short window (409 TOKENIZED_ASSETS_QUOTE_EXPIRED past it). Within the tenant's limits and the asset's order bounds. A wallet Aurea signs for is signed and sent at once (201); a wallet its owner signs for gets the steps to sign (EVM: `steps`, sent to /operations/{operationId}/broadcast; Solana: `messageToSign`, sent to /operations/{operationId}/broadcast-solana) before `signingExpiresAt`. Refused: 403 TOKENIZED_ASSETS_FLOW_OFF (the tenant does not offer it), 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE (not available here or now; details.reason), the eligibility and documents (403), 409 TOKENIZED_ASSETS_ASSET_PAUSED and TOKENIZED_ASSETS_MULTIPLIER_UPDATE, TOKENIZED_ASSETS_MARKET_CLOSED, TOKENIZED_ASSETS_AFTER_HOURS_OFF, 400 TOKENIZED_ASSETS_ORDER_TOO_SMALL, 409 TOKENIZED_ASSETS_LIMIT_REACHED and TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED, TOKENIZED_ASSETS_WALLET_NOT_REGISTERED, TOKENIZED_ASSETS_WALLET_BLOCKED, TOKENIZED_ASSETS_INSUFFICIENT_BALANCE, TOKENIZED_ASSETS_POSITION_INSUFFICIENT. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"side":{"type":"string","enum":["buy","sell"]},"tokenAmount":{"type":"string","maxLength":80,"description":"The tokens bought or sold, as wallet balances show them (or cashAmount)."},"cashAmount":{"type":"string","maxLength":80,"description":"The stablecoin paid or received (or tokenAmount)."},"paymentToken":{"type":"string","enum":["USDC","USDT","USDG"],"description":"The stablecoin paid or received, where the asset takes it on the chain."}},"required":["symbol","chainId","side","paymentToken"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/chain-transfers":{"post":{"summary":"Move tokens to another chain","tags":["tokenized-assets"],"description":"Sends the tokens to the issuer on one chain; the issuer delivers them on the other, to the same wallet (which it must know there too). Between the asset's EVM chains; to or from Solana only where the platform offers it, delivered to the same owner's wallet the issuer knows on the other chain, which must be the only one of that chain's kind it knows for the tenant (else 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE, details.reason destination_not_unique). A wallet Aurea signs for is signed and sent at once (201); a wallet its owner signs for gets the steps to sign (EVM: `steps`, sent to /operations/{operationId}/broadcast; Solana: `messageToSign`, sent to /operations/{operationId}/broadcast-solana) before `signingExpiresAt`. Once what was sent is on chain the operation is `settling` until the issuer delivers (then `completed`; `failed` with TOKENIZED_ASSETS_SETTLEMENT_REFUNDED when it gives back what was sent). Refused: 403 TOKENIZED_ASSETS_FLOW_OFF (the tenant does not offer it), 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE (not available here or now; details.reason), the eligibility and documents (403), 409 TOKENIZED_ASSETS_ASSET_PAUSED and TOKENIZED_ASSETS_MULTIPLIER_UPDATE, TOKENIZED_ASSETS_MARKET_CLOSED, TOKENIZED_ASSETS_AFTER_HOURS_OFF, 400 TOKENIZED_ASSETS_ORDER_TOO_SMALL, 409 TOKENIZED_ASSETS_LIMIT_REACHED and TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED, TOKENIZED_ASSETS_WALLET_NOT_REGISTERED, TOKENIZED_ASSETS_WALLET_BLOCKED, TOKENIZED_ASSETS_INSUFFICIENT_BALANCE, TOKENIZED_ASSETS_POSITION_INSUFFICIENT. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"fromChainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"toChainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"tokenAmount":{"type":"string","maxLength":80,"description":"The tokens moved, as wallet balances show them."}},"required":["symbol","fromChainId","toChainId","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/in-kind/redemptions":{"post":{"summary":"Exchange tokens for shares","tags":["tokenized-assets"],"description":"Sends the tokens to the issuer, which delivers the underlying shares to the tenant's brokerage account. A wallet Aurea signs for is signed and sent at once (201); a wallet its owner signs for gets the steps to sign (EVM: `steps`, sent to /operations/{operationId}/broadcast; Solana: `messageToSign`, sent to /operations/{operationId}/broadcast-solana) before `signingExpiresAt`. Once what was sent is on chain the operation is `settling` until the issuer delivers (then `completed`; `failed` with TOKENIZED_ASSETS_SETTLEMENT_REFUNDED when it gives back what was sent). Refused: 403 TOKENIZED_ASSETS_FLOW_OFF (the tenant does not offer it), 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE (not available here or now; details.reason), the eligibility and documents (403), 409 TOKENIZED_ASSETS_ASSET_PAUSED and TOKENIZED_ASSETS_MULTIPLIER_UPDATE, TOKENIZED_ASSETS_MARKET_CLOSED, TOKENIZED_ASSETS_AFTER_HOURS_OFF, 400 TOKENIZED_ASSETS_ORDER_TOO_SMALL, 409 TOKENIZED_ASSETS_LIMIT_REACHED and TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED, TOKENIZED_ASSETS_WALLET_NOT_REGISTERED, TOKENIZED_ASSETS_WALLET_BLOCKED, TOKENIZED_ASSETS_INSUFFICIENT_BALANCE, TOKENIZED_ASSETS_POSITION_INSUFFICIENT. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"tokenAmount":{"type":"string","maxLength":80,"description":"The tokens given for shares, or wanted for shares, as wallet balances show them."}},"required":["symbol","chainId","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/in-kind/issuances":{"post":{"summary":"Exchange shares for tokens","tags":["tokenized-assets"],"description":"Asks the tenant's brokerage account to turn shares into tokens, which the issuer delivers to the wallet it knows; `settling` until they arrive. 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE where no brokerage account is connected. Once what was sent is on chain the operation is `settling` until the issuer delivers (then `completed`; `failed` with TOKENIZED_ASSETS_SETTLEMENT_REFUNDED when it gives back what was sent). Refused: 403 TOKENIZED_ASSETS_FLOW_OFF (the tenant does not offer it), 409 TOKENIZED_ASSETS_FLOW_UNAVAILABLE (not available here or now; details.reason), the eligibility and documents (403), 409 TOKENIZED_ASSETS_ASSET_PAUSED and TOKENIZED_ASSETS_MULTIPLIER_UPDATE, TOKENIZED_ASSETS_MARKET_CLOSED, TOKENIZED_ASSETS_AFTER_HOURS_OFF, 400 TOKENIZED_ASSETS_ORDER_TOO_SMALL, 409 TOKENIZED_ASSETS_LIMIT_REACHED and TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED, TOKENIZED_ASSETS_WALLET_NOT_REGISTERED, TOKENIZED_ASSETS_WALLET_BLOCKED, TOKENIZED_ASSETS_INSUFFICIENT_BALANCE, TOKENIZED_ASSETS_POSITION_INSUFFICIENT. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"symbol":{"type":"string","pattern":"^[A-Za-z0-9.-]{1,32}$"},"chainId":{"type":"number","enum":[1,10,56,42161,1399811149],"description":"The chain: 1 (Ethereum), 10 (Optimism), 56 (BNB Chain), 42161 (Arbitrum) or 1399811149 (Solana), where the asset has a token."},"tokenAmount":{"type":"string","maxLength":80,"description":"The tokens given for shares, or wanted for shares, as wallet balances show them."}},"required":["symbol","chainId","tokenAmount"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."},{"schema":{"type":"string"},"in":"header","name":"x-external-tx-id","required":false,"description":"Optional. Your own id for the operation this call starts: up to 255 letters, digits, and - _ . : — unique for your tenant for ever. The operation keeps it (externalTxId) and GET /v1/operations/by-external-id/{externalTxId} finds it. An id another operation of your tenant already holds answers 409 with details.code EXTERNAL_TX_ID_REUSED and details.operationId, before anything is signed or sent; an id that is not one answers 400 EXTERNAL_TX_ID_INVALID. A call refused before it recorded an operation (a validation error, say) leaves the id free. With an Idempotency-Key, the same key and the same id answer the first answer again. Honoured once Aurea records your operations (GET /v1/operations lists them); until then the header is not read. A request without it behaves as it always has."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/tokenized-assets/operations/{operationId}/broadcast-solana":{"post":{"summary":"Send a Solana operation's signature","tags":["tokenized-assets"],"description":"The wallet's ed25519 signature of an operation's messageToSign (a Solana wallet its owner signs for): checked against the wallet over that message (400 TOKENIZED_ASSETS_SIGNATURE_INVALID), then sent; after signingExpiresAt, 409 TOKENIZED_ASSETS_SIGNING_EXPIRED. A tenant without tokenized assets set up in the environment is answered 403 `TOKENIZED_ASSETS_NOT_CONFIGURED`; set up but not offering them there, 403 `TOKENIZED_ASSETS_OFF`. Contact us for details: https://www.aureahub.com/contact","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"isTestnet":{"type":"boolean","default":false,"description":"true for the test environment."},"signature":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{64,90}$","description":"The wallet's ed25519 signature (base58) of the operation's messageToSign."}},"required":["signature"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"operationId","required":true},{"schema":{"type":"string"},"in":"header","name":"idempotency-key","required":false,"description":"Optional (required for institutional tenants). Up to 255 letters, digits, - or _. Sending the same key again with the same request answers with the first answer instead of running it again, and the response carries idempotency-replayed: true. The same key with a different request, or while the first call is still running, answers 409 with details.code IDEMPOTENCY_KEY_REUSED or IDEMPOTENCY_IN_PROGRESS; after a first call that may have taken effect without answering, 409 IDEMPOTENCY_OUTCOME_UNKNOWN (it is never run again: check the operation, then use a new key). A key that is not one answers 400 IDEMPOTENCY_KEY_INVALID. A request without the header behaves as it always has. Keys last 24 hours."}],"security":[{"bearerAuth":[],"tenantSignature":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"operationId":{"type":"string"},"kind":{"type":"string","enum":["trade","limit_order","yield_subscribe","yield_redeem","yield_wrap","yield_unwrap","delivery","return","market","instant","bridge","in_kind"],"description":"market: a market order; instant: an instant order; bridge: a chain transfer; in_kind: tokens for shares, or shares for tokens; the others: binding quotes, limit orders, the yield token, deliveries and returns."},"status":{"type":"string","enum":["quoted","attested","submitted","settling","completed","failed","expired"],"description":"quoted or attested: built (waiting for the client's signatures when signer is client); submitted: sent; settling: what was sent is on chain, the issuer has still to deliver (market orders, chain transfers, in-kind operations); completed; failed; expired (its time over, nothing happened)."},"isTestnet":{"type":"boolean"},"symbol":{"type":"string"},"chainId":{"type":"integer"},"side":{"anyOf":[{"type":"string","enum":["buy","sell"]},{"type":"null"}]},"unit":{"type":"string","enum":["token","shares","base"],"description":"shares: the rebasing yield token, counted in yield tokens' worth of shares; base: tokens counted before their multiplier (a balance shows base × multiplier)."},"tokenAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"valueUsd":{"type":["null","string"],"description":"A decimal number, as a string."},"paymentToken":{"anyOf":[{"type":"string","enum":["USDC","USDT","USDon","USDG"]},{"type":"null"}]},"paymentAmount":{"type":["null","string"],"description":"A decimal number, as a string."},"wallet":{"type":"string","enum":["omnibus","own"],"description":"omnibus: the tenant's wallet holds the tokens for the user; own: the user's wallet."},"signer":{"type":"string","enum":["server","client"]},"quoteId":{"type":["null","string"]},"order":{"anyOf":[{"type":"object","properties":{"orderId":{"type":["string","null"]},"limitPrice":{"type":["string","null"],"description":"A decimal number, as a string."},"expiresAt":{"type":["string","null"]},"filledTokenAmount":{"type":["string","null"],"description":"A decimal number, as a string."}},"required":["orderId","limitPrice","expiresAt","filledTokenAmount"],"additionalProperties":false},{"type":"null"}]},"steps":{"type":"array","items":{"type":"object","properties":{"stepIndex":{"type":"integer"},"purpose":{"type":"string"},"txHashToSign":{"type":"string"},"to":{"type":"string"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"type":"integer"},"nonce":{"type":"integer"},"gasLimit":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}},"required":["stepIndex","purpose","txHashToSign","to","data","value","chainId","nonce","gasLimit","maxFeePerGas","maxPriorityFeePerGas"],"additionalProperties":false},"description":"What the client signs, while the operation waits for its signatures; empty otherwise."},"signingExpiresAt":{"type":["null","string"]},"txHashes":{"type":"array","items":{"type":"string"}},"received":{"type":["null","string"],"description":"What the wallet received, once completed: the yield token or its shares, or the stablecoin of a redemption."},"failureCode":{"type":["null","string"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"settlement":{"type":"object","properties":{"settlingSince":{"type":["null","string"],"description":"When what was sent reached the chain and the issuer began to settle."},"multiplier":{"type":["null","string"],"description":"The token's multiplier the amount was converted with (balances show base units × multiplier)."},"tokenAmountAsBalance":{"type":["null","string"],"description":"The token amount asked, as wallet balances show it."},"toChainId":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A chain transfer's destination chain."}},"required":["settlingSince","multiplier","tokenAmountAsBalance","toChainId"],"additionalProperties":false,"description":"Present on the operations of the market, instant, chain-transfer and in-kind routes (and their holdings' deliveries and returns) only."},"messageToSign":{"type":"string","description":"A Solana wallet its owner signs for: the message's bytes (base64) to sign with ed25519 and send to /operations/{operationId}/broadcast-solana before signingExpiresAt."}},"required":["operationId","kind","status","isTestnet","symbol","chainId","side","unit","tokenAmount","valueUsd","paymentToken","paymentAmount","wallet","signer","quoteId","order","steps","signingExpiresAt","txHashes","received","failureCode","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a request that failed validation (422), an array of the problems found, each `{ path, message }`."}}}}}}}}},"/v1/portfolio/performance":{"get":{"tags":["portfolio"],"description":"Get portfolio performance for the authenticated user over a given time period. Returns daily EUR/USD totals from historical snapshots taken by the nightly job.","parameters":[{"schema":{"type":"string","enum":["24h","1W","1M","1Y"],"default":"1M"},"in":"query","name":"period","required":false,"description":"Time period for performance calculation"},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"isTestnet","required":false,"description":"Network type: false for mainnet (default), true for testnet"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Portfolio performance data","content":{"application/json":{"schema":{"description":"Portfolio performance data","type":"object","properties":{"period":{"type":"string","enum":["24h","1W","1M","1Y"],"description":"Requested period"},"dataAvailable":{"type":"boolean","description":"True when at least 2 snapshots exist to compute a meaningful change"},"changeEur":{"type":["number","null"],"description":"Absolute EUR change (last - first snapshot). null when dataAvailable=false"},"changePercent":{"type":["number","null"],"description":"Percentage EUR change relative to first snapshot. null when dataAvailable=false or first total is 0"},"snapshots":{"type":"array","description":"Daily snapshots ordered oldest to newest","items":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"Snapshot date (YYYY-MM-DD)"},"totalEur":{"type":"number","description":"Total portfolio value in EUR on this date"},"totalUsd":{"type":"number","description":"Total portfolio value in USD on this date"}},"required":["date","totalEur","totalUsd"]}}},"required":["period","dataAvailable","snapshots"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"description":"Rate limit exceeded","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v1/agent-payments/status":{"get":{"summary":"Get module and LLM status","tags":["agent-payments"],"description":"Returns the agent-payments module status (phase, feature-flag enabled state, configured LLM provider) and whether the LLM is configured. Read-only; no side effects.","responses":{"200":{"description":"The module's status","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The module's status","properties":{"module":{"type":"string"},"phase":{"type":"integer"},"enabled":{"type":"boolean"},"llmProvider":{"type":"string"},"llmConfigured":{"type":"boolean"}}}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents":{"post":{"summary":"Create an agent","tags":["agent-payments"],"description":"Creates a new agent identity (e.g. a merchant or spending agent) scoped to the caller's tenant. Returns the created agent (201).","responses":{"201":{"description":"The agent created","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent created","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, or the user does not exist","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, or the user does not exist","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"An agent with that did exists","content":{"application/json":{"schema":{"type":"object","description":"An agent with that did exists","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List agents","tags":["agent-payments"],"description":"Lists agents for the caller's tenant, optionally filtered by `status` and paged with `limit` (at most 200) and `offset`. Read-only; returns the agents under `data`.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["pending","active","suspended","revoked"]},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"The agents, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agents, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}":{"get":{"summary":"Get an agent by id","tags":["agent-payments"],"description":"Fetches a single agent by id within the caller's tenant. Returns 404 if the agent does not exist. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Delete (soft-delete) an agent","tags":["agent-payments"],"description":"Soft-deletes an agent: revokes its active API keys so it can no longer authenticate, then marks it revoked. Execution/audit history is preserved. An agent already revoked answers 404 and nothing changes.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, no such agent, or the agent is already revoked","content":{"application/json":{"schema":{"type":"object","description":"The module is off, no such agent, or the agent is already revoked","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/status":{"post":{"summary":"Set an agent's status","tags":["agent-payments"],"description":"Admin status control: activate a pending/suspended agent, or suspend an active one. Only 'active' agents can move money (enforced by the policy engine). Returns the updated agent; 404 if not found.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/policies":{"post":{"summary":"Create a spending policy","tags":["agent-payments"],"description":"Creates a spending policy (limits, allow/deny rules, optional not-before/expiry window) used by the PolicyGuard to authorize agent payments. Returns the created policy (201).","responses":{"201":{"description":"The policy created","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The policy created","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","description":"active, paused or expired"},"currency":{"type":["string","null"]},"perTxMax":{"type":["string","null"],"description":"A decimal amount (as a string)"},"dailyMax":{"type":["string","null"],"description":"A decimal amount (as a string)"},"weeklyMax":{"type":["string","null"],"description":"A decimal amount (as a string)"},"monthlyMax":{"type":["string","null"],"description":"A decimal amount (as a string)"},"velocityMaxCount":{"type":["integer","null"]},"velocityWindowSeconds":{"type":["integer","null"]},"allowedAssets":{"type":"array","items":{"type":"string"}},"allowedChains":{"type":"array","items":{"type":"string"}},"recipientAllowlist":{"type":"array","items":{"type":"string"}},"recipientBlocklist":{"type":"array","items":{"type":"string"}},"stepUpThreshold":{"type":["string","null"],"description":"A decimal amount (as a string)"},"requiresApproval":{"type":"boolean"},"notBefore":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"metadata":{"description":"The policy's metadata (an object)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mandates":{"post":{"summary":"Create a mandate","tags":["agent-payments"],"description":"Creates a signed agent mandate (the user-authorized spending grant an agent acts under). Returns the created mandate (201).","responses":{"201":{"description":"The mandate created","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The mandate created","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"parentMandateId":{"type":["string","null"],"format":"uuid"},"mandateType":{"type":"string","description":"intent, cart or recurring"},"status":{"type":"string","description":"pending, active, consumed, completed, revoked, expired or failed"},"description":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"merchant":{"type":["string","null"]},"cart":{"description":"The cart, as created (an object, or null)"},"constraints":{"description":"The constraints (an object)"},"recurrenceRule":{"type":["string","null"]},"recurrenceIntervalSeconds":{"type":["integer","null"]},"nextRunAt":{"type":["string","null"],"format":"date-time"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"runCount":{"type":"integer"},"maxRuns":{"type":["integer","null"]},"signature":{"type":["string","null"]},"signedBy":{"type":["string","null"],"description":"user or agent"},"mandateHash":{"type":["string","null"],"description":"SHA-256 of the mandate's canonical payload (hex)"},"payload":{"description":"The canonical payload that is signed (an object)"},"activityLogId":{"type":["string","null"],"format":"uuid"},"notBefore":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, a signature with no agent public key or that does not verify, or an unknown user, wallet, policy or parent mandate","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, a signature with no agent public key or that does not verify, or an unknown user, wallet, policy or parent mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List an agent's mandates","tags":["agent-payments"],"description":"The agent's mandates, newest first, optionally of one `status` (`limit`, at most 200): what the agent may pay, with whom and until when — what is scheduled to be paid. Read-only; returns them under `mandates`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"agentId","required":true},{"schema":{"type":"string","enum":["pending","active","consumed","revoked","expired","failed"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"The agent's mandates, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent's mandates, newest first","properties":{"mandates":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A mandate","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"parentMandateId":{"type":["string","null"],"format":"uuid"},"mandateType":{"type":"string","description":"intent, cart or recurring"},"status":{"type":"string","description":"pending, active, consumed, completed, revoked, expired or failed"},"description":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"merchant":{"type":["string","null"]},"cart":{"description":"The cart, as created (an object, or null)"},"constraints":{"description":"The constraints (an object)"},"recurrenceRule":{"type":["string","null"]},"recurrenceIntervalSeconds":{"type":["integer","null"]},"nextRunAt":{"type":["string","null"],"format":"date-time"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"runCount":{"type":"integer"},"maxRuns":{"type":["integer","null"]},"signature":{"type":["string","null"]},"signedBy":{"type":["string","null"],"description":"user or agent"},"mandateHash":{"type":["string","null"],"description":"SHA-256 of the mandate's canonical payload (hex)"},"payload":{"description":"The canonical payload that is signed (an object)"},"activityLogId":{"type":["string","null"],"format":"uuid"},"notBefore":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mandates/{id}":{"get":{"summary":"Get a mandate by id","tags":["agent-payments"],"description":"Fetches a single mandate by id within the caller's tenant. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"A mandate","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A mandate","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"parentMandateId":{"type":["string","null"],"format":"uuid"},"mandateType":{"type":"string","description":"intent, cart or recurring"},"status":{"type":"string","description":"pending, active, consumed, completed, revoked, expired or failed"},"description":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"merchant":{"type":["string","null"]},"cart":{"description":"The cart, as created (an object, or null)"},"constraints":{"description":"The constraints (an object)"},"recurrenceRule":{"type":["string","null"]},"recurrenceIntervalSeconds":{"type":["integer","null"]},"nextRunAt":{"type":["string","null"],"format":"date-time"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"runCount":{"type":"integer"},"maxRuns":{"type":["integer","null"]},"signature":{"type":["string","null"]},"signedBy":{"type":["string","null"],"description":"user or agent"},"mandateHash":{"type":["string","null"],"description":"SHA-256 of the mandate's canonical payload (hex)"},"payload":{"description":"The canonical payload that is signed (an object)"},"activityLogId":{"type":["string","null"],"format":"uuid"},"notBefore":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such mandate","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mandates/{id}/revoke":{"post":{"summary":"Revoke a mandate","tags":["agent-payments"],"description":"Revokes a mandate so the agent can no longer act under it. Returns the updated mandate.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"A mandate","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A mandate","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"parentMandateId":{"type":["string","null"],"format":"uuid"},"mandateType":{"type":"string","description":"intent, cart or recurring"},"status":{"type":"string","description":"pending, active, consumed, completed, revoked, expired or failed"},"description":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"merchant":{"type":["string","null"]},"cart":{"description":"The cart, as created (an object, or null)"},"constraints":{"description":"The constraints (an object)"},"recurrenceRule":{"type":["string","null"]},"recurrenceIntervalSeconds":{"type":["integer","null"]},"nextRunAt":{"type":["string","null"],"format":"date-time"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"runCount":{"type":"integer"},"maxRuns":{"type":["integer","null"]},"signature":{"type":["string","null"]},"signedBy":{"type":["string","null"],"description":"user or agent"},"mandateHash":{"type":["string","null"],"description":"SHA-256 of the mandate's canonical payload (hex)"},"payload":{"description":"The canonical payload that is signed (an object)"},"activityLogId":{"type":["string","null"],"format":"uuid"},"notBefore":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such mandate","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mandates/{id}/verify":{"post":{"summary":"Verify a mandate","tags":["agent-payments"],"description":"Verifies a mandate's validity (signature/status/expiry) and returns `{ valid, reason? }`. Read-only; moves no money.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Whether the mandate's signature is valid, with the reason when it is not","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Whether the mandate's signature is valid, with the reason when it is not","properties":{"valid":{"type":"boolean"},"reason":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such mandate","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mandates/{id}/delegation":{"post":{"summary":"Prepare an MPC wallet's delegation of a mandate","tags":["agent-payments"],"description":"The wallet's user, present, delegates the mandate to its agent on-chain: answers the two digests the MPC wallet signs through its ordinary signature (the token's ERC-2612 permit for the agent allowance router, then the router's AgentMandate: the cap over every payment, the recipients, the expiry). Send both signatures to POST /delegations/:id/confirm within 30 minutes. Moves no money.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"The delegation prepared, and the two digests the wallet signs (its token's permit for the router, then the AgentMandate)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The delegation prepared, and the two digests the wallet signs (its token's permit for the router, then the AgentMandate)","properties":{"delegation":{"type":"object","additionalProperties":true,"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","properties":{"id":{"type":"string","format":"uuid"},"mandateId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"router":{"type":"string","description":"The agent allowance router's address"},"token":{"type":"string"},"ownerAddress":{"type":"string","description":"The wallet's address"},"onchainId":{"type":"string","description":"The mandate's id in the router (bytes32)"},"cap":{"type":"string","description":"The cap over every payment, in the token's smallest unit"},"recipients":{"type":"array","items":{"type":"string"}},"notAfter":{"type":"string","format":"date-time"},"signatureDeadline":{"type":"string","format":"date-time"},"mandateDigest":{"type":"string"},"permitDigest":{"type":"string"},"status":{"type":"string","description":"prepared, active, revoked, expired or failed"},"createTxHash":{"type":["string","null"]},"revokeTxHash":{"type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"onchain":{"type":["object","null"],"additionalProperties":true,"description":"What the router says of an active delegation now","properties":{"spent":{"type":"string"},"remaining":{"type":"string"},"revoked":{"type":"boolean"}}}}},"toSign":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A digest the wallet signs through its ordinary MPC signature, and the EIP-712 typed data it is the hash of","properties":{"purpose":{"type":"string","description":"permit or mandate"},"digest":{"type":"string"},"typedData":{"description":"The EIP-712 typed data (domain, types, primaryType, message)"}}}}}}}}},"400":{"description":"A recipient, the cap or notAfter is not valid, or a recipient is not allowed by the mandate's policy","content":{"application/json":{"schema":{"type":"object","description":"A recipient, the cap or notAfter is not valid, or a recipient is not allowed by the mandate's policy","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The caller is not the wallet's user","content":{"application/json":{"schema":{"type":"object","description":"The caller is not the wallet's user","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module or MPC delegated signing is off, or no such mandate or delegation","content":{"application/json":{"schema":{"type":"object","description":"The module or MPC delegated signing is off, or no such mandate or delegation","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","content":{"application/json":{"schema":{"type":"object","description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent allowance router is not configured, or a transaction could not be sent","content":{"application/json":{"schema":{"type":"object","description":"The agent allowance router is not configured, or a transaction could not be sent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/delegations/{id}/confirm":{"post":{"summary":"Confirm a delegation with the wallet's two signatures","tags":["agent-payments"],"description":"Checks that both signatures are the wallet's own for exactly the prepared terms and submits them to the agent allowance router. Answers the delegation: active once the router recorded it, still prepared with its transaction while the receipt is not read (GET it again).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","properties":{"id":{"type":"string","format":"uuid"},"mandateId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"router":{"type":"string","description":"The agent allowance router's address"},"token":{"type":"string"},"ownerAddress":{"type":"string","description":"The wallet's address"},"onchainId":{"type":"string","description":"The mandate's id in the router (bytes32)"},"cap":{"type":"string","description":"The cap over every payment, in the token's smallest unit"},"recipients":{"type":"array","items":{"type":"string"}},"notAfter":{"type":"string","format":"date-time"},"signatureDeadline":{"type":"string","format":"date-time"},"mandateDigest":{"type":"string"},"permitDigest":{"type":"string"},"status":{"type":"string","description":"prepared, active, revoked, expired or failed"},"createTxHash":{"type":["string","null"]},"revokeTxHash":{"type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"onchain":{"type":["object","null"],"additionalProperties":true,"description":"What the router says of an active delegation now","properties":{"spent":{"type":"string"},"remaining":{"type":"string"},"revoked":{"type":"boolean"}}}}}}}},"400":{"description":"A signature is not the wallet's for the delegation's terms","content":{"application/json":{"schema":{"type":"object","description":"A signature is not the wallet's for the delegation's terms","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The caller is not the wallet's user","content":{"application/json":{"schema":{"type":"object","description":"The caller is not the wallet's user","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module or MPC delegated signing is off, or no such mandate or delegation","content":{"application/json":{"schema":{"type":"object","description":"The module or MPC delegated signing is off, or no such mandate or delegation","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","content":{"application/json":{"schema":{"type":"object","description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"410":{"description":"The delegation's 30 minutes to sign are over","content":{"application/json":{"schema":{"type":"object","description":"The delegation's 30 minutes to sign are over","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent allowance router is not configured, or a transaction could not be sent","content":{"application/json":{"schema":{"type":"object","description":"The agent allowance router is not configured, or a transaction could not be sent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/delegations/{id}/revoke":{"post":{"summary":"Revoke a delegation","tags":["agent-payments"],"description":"The wallet's user revokes its delegation in the agent allowance router: nothing moves under it afterwards. The wallet's owner can always revoke it on-chain itself as well; a tenant's administrators revoke the mandate, and the delegation is revoked on-chain within 15 minutes.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","properties":{"id":{"type":"string","format":"uuid"},"mandateId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"router":{"type":"string","description":"The agent allowance router's address"},"token":{"type":"string"},"ownerAddress":{"type":"string","description":"The wallet's address"},"onchainId":{"type":"string","description":"The mandate's id in the router (bytes32)"},"cap":{"type":"string","description":"The cap over every payment, in the token's smallest unit"},"recipients":{"type":"array","items":{"type":"string"}},"notAfter":{"type":"string","format":"date-time"},"signatureDeadline":{"type":"string","format":"date-time"},"mandateDigest":{"type":"string"},"permitDigest":{"type":"string"},"status":{"type":"string","description":"prepared, active, revoked, expired or failed"},"createTxHash":{"type":["string","null"]},"revokeTxHash":{"type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"onchain":{"type":["object","null"],"additionalProperties":true,"description":"What the router says of an active delegation now","properties":{"spent":{"type":"string"},"remaining":{"type":"string"},"revoked":{"type":"boolean"}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module or MPC delegated signing is off, or no such mandate or delegation","content":{"application/json":{"schema":{"type":"object","description":"The module or MPC delegated signing is off, or no such mandate or delegation","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","content":{"application/json":{"schema":{"type":"object","description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent allowance router is not configured, or a transaction could not be sent","content":{"application/json":{"schema":{"type":"object","description":"The agent allowance router is not configured, or a transaction could not be sent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/delegations":{"get":{"summary":"List delegations","tags":["agent-payments"],"description":"The tenant's MPC delegations, newest first (at most 200), of one mandate with ?mandateId=.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"mandateId","required":false,"description":"Only the delegations of this mandate"}],"responses":{"200":{"description":"The delegations, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The delegations, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","properties":{"id":{"type":"string","format":"uuid"},"mandateId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"router":{"type":"string","description":"The agent allowance router's address"},"token":{"type":"string"},"ownerAddress":{"type":"string","description":"The wallet's address"},"onchainId":{"type":"string","description":"The mandate's id in the router (bytes32)"},"cap":{"type":"string","description":"The cap over every payment, in the token's smallest unit"},"recipients":{"type":"array","items":{"type":"string"}},"notAfter":{"type":"string","format":"date-time"},"signatureDeadline":{"type":"string","format":"date-time"},"mandateDigest":{"type":"string"},"permitDigest":{"type":"string"},"status":{"type":"string","description":"prepared, active, revoked, expired or failed"},"createTxHash":{"type":["string","null"]},"revokeTxHash":{"type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"onchain":{"type":["object","null"],"additionalProperties":true,"description":"What the router says of an active delegation now","properties":{"spent":{"type":"string"},"remaining":{"type":"string"},"revoked":{"type":"boolean"}}}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module or MPC delegated signing is off, or no such mandate or delegation","content":{"application/json":{"schema":{"type":"object","description":"The module or MPC delegated signing is off, or no such mandate or delegation","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","content":{"application/json":{"schema":{"type":"object","description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent allowance router is not configured, or a transaction could not be sent","content":{"application/json":{"schema":{"type":"object","description":"The agent allowance router is not configured, or a transaction could not be sent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/delegations/{id}":{"get":{"summary":"Get one's own delegation","tags":["agent-payments"],"description":"The caller's own delegation (its wallet's user), with what the agent allowance router says of it now (spent, remaining, revoked) while it is active. A tenant's administrators list them with GET /delegations.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An MPC wallet's delegation of a mandate to its agent, through the agent allowance router","properties":{"id":{"type":"string","format":"uuid"},"mandateId":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"chainId":{"type":"integer"},"router":{"type":"string","description":"The agent allowance router's address"},"token":{"type":"string"},"ownerAddress":{"type":"string","description":"The wallet's address"},"onchainId":{"type":"string","description":"The mandate's id in the router (bytes32)"},"cap":{"type":"string","description":"The cap over every payment, in the token's smallest unit"},"recipients":{"type":"array","items":{"type":"string"}},"notAfter":{"type":"string","format":"date-time"},"signatureDeadline":{"type":"string","format":"date-time"},"mandateDigest":{"type":"string"},"permitDigest":{"type":"string"},"status":{"type":"string","description":"prepared, active, revoked, expired or failed"},"createTxHash":{"type":["string","null"]},"revokeTxHash":{"type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"activatedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"onchain":{"type":["object","null"],"additionalProperties":true,"description":"What the router says of an active delegation now","properties":{"spent":{"type":"string"},"remaining":{"type":"string"},"revoked":{"type":"boolean"}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module or MPC delegated signing is off, or no such mandate or delegation","content":{"application/json":{"schema":{"type":"object","description":"The module or MPC delegated signing is off, or no such mandate or delegation","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","content":{"application/json":{"schema":{"type":"object","description":"The mandate is not active or is delegated already, the wallet is not an MPC wallet, the token has no permit, or the signed policy decisions are off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent allowance router is not configured, or a transaction could not be sent","content":{"application/json":{"schema":{"type":"object","description":"The agent allowance router is not configured, or a transaction could not be sent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/authorize":{"post":{"summary":"Preview a policy decision","tags":["agent-payments"],"description":"Evaluates a proposed payment against the PolicyGuard and returns the decision (allow / deny / step-up / approval-required) with its trace. Preview only: moves no money and reserves nothing on the spend ledger (the trace's reservationId is null), while the spend executions hold still counts against the policy's windows.","responses":{"200":{"description":"The policy decision: a refusal carries `allow: false` and its reason (and, for a limit or a webhook decline, a trace); an approval carries the step-up and approval flags, the risk score and the trace","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The policy decision: a refusal carries `allow: false` and its reason (and, for a limit or a webhook decline, a trace); an approval carries the step-up and approval flags, the risk score and the trace","properties":{"allow":{"type":"boolean"},"reason":{"type":"string"},"requiresStepUp":{"type":"boolean"},"requiresApproval":{"type":"boolean"},"riskScore":{"type":"number","description":"0 to 100"},"trace":{"description":"What decided it: policy, mandate, reservation, risk factors and the authorization webhook's answer"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/executions":{"post":{"summary":"Execute an agent payment","tags":["agent-payments"],"description":"Runs an agent payment through the policy gate: authorizes via PolicyGuard (reserving on the spend ledger), then moves money on the chosen rail. Idempotent by key; decisions needing step-up/approval are parked as approval_required. Returns the execution (201).","responses":{"201":{"description":"The execution: settled, failed, denied, or parked as approval_required (an idempotent replay answers the first one)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The execution: settled, failed, denied, or parked as approval_required (an idempotent replay answers the first one)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, or an unknown agent or mandate","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, or an unknown agent or mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"409":{"description":"The same idempotency key, at the same time","content":{"application/json":{"schema":{"type":"object","description":"The same idempotency key, at the same time","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/executions/{id}/approve":{"post":{"summary":"Approve a pending execution","tags":["agent-payments"],"description":"Approves an execution parked as approval_required, releasing it to complete on the rail with the user who asked for the payment, as it would have run had it not been parked (the held spend reservation is settled). Returns the updated execution. With the tenant's passkey step-up enforced, send `stepUpToken`: the token of POST /v1/auth/step-up/options and POST /v1/auth/step-up for `agent_execution.approve` on this execution (`executionId`); 403 STEP_UP_REQUIRED or STEP_UP_INVALID otherwise.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent payment execution","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen, or the execution is quarantined","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen, or the execution is quarantined","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The freeze status could not be read","content":{"application/json":{"schema":{"type":"object","description":"The freeze status could not be read","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agent-requests":{"get":{"summary":"List pending agent requests","tags":["agent-payments"],"description":"Lists pending deferred-approval requests (executions awaiting a human decision) for the tenant. Read-only; returns them under `data`.","responses":{"200":{"description":"The executions waiting for a decision","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The executions waiting for a decision","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An execution presented as a request for a person's decision","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","description":"pending or expired while it waits; running, executed, rejected or the execution's own status once decided"},"display":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string"},"description":{"type":"string"},"sections":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"label":{"type":"string"},"value":{"type":"string"}}}}}},"result":{"type":["object","null"],"additionalProperties":true,"description":"When executed: the transaction it made","properties":{"transactionId":{"type":["string","null"],"format":"uuid"}}},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"recipient":{"type":["string","null"]},"agentId":{"type":"string","format":"uuid"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agent-requests/{id}":{"get":{"summary":"Get an agent request by id","tags":["agent-payments"],"description":"Fetches a single deferred-approval request by id for the tenant. Returns 404 if not found. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An execution presented as a request for a person's decision","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An execution presented as a request for a person's decision","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","description":"pending or expired while it waits; running, executed, rejected or the execution's own status once decided"},"display":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string"},"description":{"type":"string"},"sections":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"label":{"type":"string"},"value":{"type":"string"}}}}}},"result":{"type":["object","null"],"additionalProperties":true,"description":"When executed: the transaction it made","properties":{"transactionId":{"type":["string","null"],"format":"uuid"}}},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"recipient":{"type":["string","null"]},"agentId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or (`{ error }`) no such execution","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or (`{ error }`) no such execution","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agent-requests/{id}/approve":{"post":{"summary":"Approve an agent request","tags":["agent-payments"],"description":"Approves a deferred-approval request, releasing the underlying execution to complete on the rail with the user who asked for the payment (held reservation is settled). Returns the updated execution. With the tenant's passkey step-up enforced, send `stepUpToken`: the token of POST /v1/auth/step-up/options and POST /v1/auth/step-up for `agent_execution.approve` on this execution (`executionId`); 403 STEP_UP_REQUIRED or STEP_UP_INVALID otherwise.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent payment execution","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen, or the execution is quarantined","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen, or the execution is quarantined","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The freeze status could not be read","content":{"application/json":{"schema":{"type":"object","description":"The freeze status could not be read","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agent-requests/{id}/reject":{"post":{"summary":"Reject an agent request","tags":["agent-payments"],"description":"Rejects a deferred-approval request with an optional reason; the underlying execution is declined and its held spend reservation released. Returns the updated execution. With the tenant's passkey step-up enforced, send `stepUpToken`: the token of POST /v1/auth/step-up/options and POST /v1/auth/step-up for `agent_execution.reject` on this execution (`executionId`); 403 STEP_UP_REQUIRED or STEP_UP_INVALID otherwise.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent payment execution","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such execution (`details.code` AGENT_EXECUTION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/utilization":{"get":{"summary":"Get agent spend utilization","tags":["agent-payments"],"description":"Returns an agent's spend utilization against its policy limits (used vs remaining per window). Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The agent's spend against its policy's limits","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent's spend against its policy's limits","properties":{"agentId":{"type":"string"},"currency":{"type":["string","null"]},"hasPolicy":{"type":"boolean"},"windows":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"daily, weekly and monthly: decimal strings (limit and remaining null without a limit); velocity: counts","properties":{"window":{"type":"string","description":"daily, weekly, monthly or velocity"},"limit":{"description":"The limit, or null"},"used":{"description":"Spent (or, for velocity, payments made)"},"remaining":{"description":"What is left, or null without a limit"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/authorization-webhook":{"get":{"summary":"Get authorization webhook config","tags":["agent-payments"],"description":"Returns the tenant's real-time authorization webhook configuration (the external endpoint that can veto agent payments). Read-only.","responses":{"200":{"description":"The tenant's authorization webhook: whether it is on, where it is, what decides without an answer, whether a signing secret is set","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's authorization webhook: whether it is on, where it is, what decides without an answer, whether a signing secret is set","properties":{"enabled":{"description":"Whether the webhook is on (as stored; false when unset)"},"url":{"description":"The webhook's address (as stored), or null"},"fallback":{"type":"string","description":"allow or reject"},"hasSecret":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"put":{"summary":"Set authorization webhook config","tags":["agent-payments"],"description":"Creates or updates the tenant's real-time authorization webhook (URL/secret/enabled) used as an external veto during payment authorization. Returns the saved config.","responses":{"200":{"description":"The tenant's authorization webhook: whether it is on, where it is, what decides without an answer, whether a signing secret is set","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's authorization webhook: whether it is on, where it is, what decides without an answer, whether a signing secret is set","properties":{"enabled":{"type":"boolean"},"url":{"description":"The webhook's address (as stored), or null"},"fallback":{"type":"string","description":"allow or reject"},"hasSecret":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/credentials":{"post":{"summary":"Issue a delegated credential","tags":["agent-payments"],"description":"Issues a scoped, revocable delegated credential for an agent. The raw token is returned exactly once (201) and cannot be retrieved again.","responses":{"201":{"description":"The credential and its token, shown this once","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The credential and its token, shown this once","properties":{"credential":{"type":"object","additionalProperties":true,"description":"A delegated credential (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"tokenPrefix":{"type":["string","null"]},"scope":{"description":"The credential's scope (an object)"},"currency":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"usedAmount":{"type":"string","description":"A decimal amount (as a string)"},"maxUses":{"type":["integer","null"]},"useCount":{"type":"integer"},"status":{"type":"string","description":"active, revoked, expired or exhausted"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedReason":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"token":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, or an unknown mandate","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, or an unknown mandate","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List delegated credentials","tags":["agent-payments"],"description":"Lists delegated credentials for the tenant, optionally filtered by agentId. Token secrets are never returned. Read-only; returns them under `data`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"agentId","required":false}],"responses":{"200":{"description":"The credentials, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The credentials, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A delegated credential (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"tokenPrefix":{"type":["string","null"]},"scope":{"description":"The credential's scope (an object)"},"currency":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"usedAmount":{"type":"string","description":"A decimal amount (as a string)"},"maxUses":{"type":["integer","null"]},"useCount":{"type":"integer"},"status":{"type":"string","description":"active, revoked, expired or exhausted"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedReason":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/credentials/{id}/revoke":{"post":{"summary":"Revoke a delegated credential","tags":["agent-payments"],"description":"Revokes a delegated credential (with an optional reason) so it can no longer be used. Returns the updated credential.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"A delegated credential (never its token)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A delegated credential (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"tokenPrefix":{"type":["string","null"]},"scope":{"description":"The credential's scope (an object)"},"currency":{"type":["string","null"]},"maxAmount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"usedAmount":{"type":"string","description":"A decimal amount (as a string)"},"maxUses":{"type":["integer","null"]},"useCount":{"type":"integer"},"status":{"type":"string","description":"active, revoked, expired or exhausted"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedReason":{"type":["string","null"]},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no active credential with that id","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no active credential with that id","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/kya/verify":{"post":{"summary":"Run Know-Your-Agent verification","tags":["agent-payments"],"description":"Runs Know-Your-Agent (KYA) verification on an agent and records the result. Returns the KYA record.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The agent's Know-Your-Agent record, or `{ status: \"none\" }` when it has never been verified","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent's Know-Your-Agent record, or `{ status: \"none\" }` when it has never been verified","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"method":{"type":"string","description":"self_signed, jwt_attestation, fido or manual"},"status":{"type":"string","description":"pending, verified, rejected or expired (none: no record)"},"trustLevel":{"type":"string","description":"none, basic, attested or certified"},"attestation":{"description":"The attestation sent (an object)"},"reputationScore":{"type":"integer"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, an agent without a public key, or a self_signed verification without a signature","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, an agent without a public key, or a self_signed verification without a signature","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/kya":{"get":{"summary":"Get an agent's KYA record","tags":["agent-payments"],"description":"Returns the agent's latest Know-Your-Agent record, or `{ status: 'none' }` if it has never been verified. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The agent's Know-Your-Agent record, or `{ status: \"none\" }` when it has never been verified","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent's Know-Your-Agent record, or `{ status: \"none\" }` when it has never been verified","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"method":{"type":"string","description":"self_signed, jwt_attestation, fido or manual"},"status":{"type":"string","description":"pending, verified, rejected or expired (none: no record)"},"trustLevel":{"type":"string","description":"none, basic, attested or certified"},"attestation":{"description":"The attestation sent (an object)"},"reputationScore":{"type":"integer"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/provision-merchant":{"post":{"summary":"Provision a merchant in one call","tags":["agent-payments"],"description":"Convenience endpoint (e.g. for Aurea Pay): creates a merchant-type agent and issues a publishable widget key in a single call. Returns both agent and publishable key (201); the raw key is shown once.","responses":{"201":{"description":"The merchant agent and its publishable key (the key shown this once)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The merchant agent and its publishable key (the key shown this once)","properties":{"agent":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"publishableKey":{"type":"object","additionalProperties":true,"description":"An API key with the key itself, shown this once","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"keyType":{"type":"string","description":"publishable or secret"},"publicKey":{"type":["string","null"],"description":"A publishable key in full; null for a secret key"},"last4":{"type":["string","null"]},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","description":"active or revoked"},"createdAt":{"type":"string","format":"date-time"},"key":{"type":"string"}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/stripe-account":{"post":{"summary":"Set an agent's connected account at the payment provider","tags":["agent-payments"],"description":"Sets (or clears, when null) the merchant agent's connected account id at the payment provider (acct_…) in metadata, so hosted card checkouts are charged to the merchant's connected account. Returns the updated agent; 404 if not found.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An agent","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"did":{"type":["string","null"]},"name":{"type":"string"},"description":{"type":["string","null"]},"agentType":{"type":"string","description":"internal, merchant, external or machine"},"status":{"type":"string","description":"pending, active, suspended or revoked"},"publicKey":{"type":["string","null"],"description":"The agent's Ed25519 public key (PEM)"},"verifiedAgentId":{"type":["string","null"]},"metadata":{"description":"The agent's metadata (an object)"},"isTestnet":{"type":["boolean","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/api-keys":{"post":{"summary":"Issue an API key for an agent","tags":["agent-payments"],"description":"Issues a scoped API key (publishable or secret) bound to the agent. The full key is returned exactly once (201) and cannot be retrieved again.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"An API key with the key itself, shown this once","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An API key with the key itself, shown this once","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"keyType":{"type":"string","description":"publishable or secret"},"publicKey":{"type":["string","null"],"description":"A publishable key in full; null for a secret key"},"last4":{"type":["string","null"]},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","description":"active or revoked"},"createdAt":{"type":"string","format":"date-time"},"key":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List an agent's API keys","tags":["agent-payments"],"description":"Lists the API keys issued for an agent (metadata only — no secrets). Read-only; returns them under `data`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The agent's API keys","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The agent's API keys","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An API key (no secret)","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"keyType":{"type":"string","description":"publishable or secret"},"publicKey":{"type":["string","null"],"description":"A publishable key in full; null for a secret key"},"last4":{"type":["string","null"]},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","description":"active or revoked"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/api-keys/{id}/rotate":{"post":{"summary":"Rotate an API key","tags":["agent-payments"],"description":"Rotates an API key: revokes the old secret and issues a fresh one. The new key is returned exactly once and cannot be retrieved again.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An API key with the key itself, shown this once","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An API key with the key itself, shown this once","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"keyType":{"type":"string","description":"publishable or secret"},"publicKey":{"type":["string","null"],"description":"A publishable key in full; null for a secret key"},"last4":{"type":["string","null"]},"allowedOrigins":{"type":"array","items":{"type":"string"}},"label":{"type":["string","null"]},"status":{"type":"string","description":"active or revoked"},"createdAt":{"type":"string","format":"date-time"},"key":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such API key (`details.code` AGENT_API_KEY_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such API key (`details.code` AGENT_API_KEY_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/api-keys/{id}/revoke":{"post":{"summary":"Revoke an API key","tags":["agent-payments"],"description":"Revokes an API key so it can no longer authenticate. Returns `{ id, status: 'revoked' }`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The key named is revoked (the same answer for an unknown id)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The key named is revoked (the same answer for an unknown id)","properties":{"id":{"type":"string"},"status":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/api-keys/{id}/origins":{"put":{"summary":"Set allowed origins for an API key","tags":["agent-payments"],"description":"Updates the CORS allow-list of origins for a publishable API key (used to restrict where the widget may call from). Returns `{ id, allowedOrigins }`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The key's allowed origins, as set","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The key's allowed origins, as set","properties":{"id":{"type":"string"},"allowedOrigins":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/analytics/spend":{"get":{"summary":"Get spend analytics by agent","tags":["agent-payments"],"description":"Aggregates spend per agent over an optional date range and agent filter, the largest settled amount first. Read-only; returns rows under `data`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"agentId","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"from","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"to","required":false}],"responses":{"200":{"description":"Spend per agent","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Spend per agent","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"agentId":{"type":"string","format":"uuid"},"settled":{"type":"string","description":"A decimal amount (as a string)"},"held":{"type":"string","description":"A decimal amount (as a string)"},"settledCount":{"type":"integer"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/analytics/executions":{"get":{"summary":"Get execution statistics","tags":["agent-payments"],"description":"Returns aggregate execution statistics (counts grouped by status) for the tenant. Read-only; returns rows under `data`.","responses":{"200":{"description":"Executions per status, with their total","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Executions per status, with their total","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"status":{"type":"string"},"count":{"type":"integer"},"amount":{"type":"string","description":"A decimal amount (as a string)"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/tenant-settings":{"get":{"summary":"Get tenant agent settings","tags":["agent-payments"],"description":"Returns the tenant's agent-payments settings, including whether the module is enabled for this tenant. Read-only.","responses":{"200":{"description":"The tenant's agent-payments settings","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's agent-payments settings","properties":{"agentPaymentsEnabled":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"patch":{"summary":"Enable or disable for the tenant","tags":["agent-payments"],"description":"Turns the agent-payments module on or off for the tenant, also while it is off for the tenant (the module must be on for the deployment). Aurea switches it on or off on request: a tenant's own roles are refused with 403 AGENT_PAYMENTS_SWITCH_PLATFORM_ONLY. Returns the updated tenant settings.","responses":{"200":{"description":"The tenant's agent-payments settings","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's agent-payments settings","properties":{"agentPaymentsEnabled":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/feed":{"post":{"summary":"Ingest a product feed","tags":["agent-payments"],"description":"Ingests a product feed for a merchant agent, upserting its catalogue of products. Returns `{ ingested }` (the count of items processed).","responses":{"200":{"description":"How many items were ingested","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"How many items were ingested","properties":{"ingested":{"type":"integer"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/ingest-url":{"post":{"summary":"Crawl a URL and ingest catalogue","tags":["agent-payments"],"description":"Crawls a merchant URL (\"scrape the store\"), extracts its products, and ingests them into the agent's catalogue. Returns the crawl result.","responses":{"200":{"description":"How many products were found and ingested, and from what","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"How many products were found and ingested, and from what","properties":{"ingested":{"type":"integer"},"source":{"type":"string","description":"json-feed, shopify, json-ld or none"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, an invalid or non-http(s) URL, a fetch that failed, or an answer too large","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, an invalid or non-http(s) URL, a fetch that failed, or an answer too large","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the URL is local or resolves to a private address","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the URL is local or resolves to a private address","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant (nothing is fetched)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant (nothing is fetched)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/products":{"get":{"summary":"List merchant products","tags":["agent-payments"],"description":"Lists the merchant agent's products. Authenticates with a scoped merchant API key (agent pinned to the key) or a tenant-admin JWT. Read-only; returns them under `data`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"agentId","required":true}],"responses":{"200":{"description":"The merchant's active products","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The merchant's active products","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A merchant product","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"sku":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"price":{"type":"string","description":"A decimal amount (as a string)"},"currency":{"type":"string"},"imageUrl":{"type":["string","null"]},"metadata":{"description":"The product's metadata (an object)"},"active":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a valid merchant API key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a valid merchant API key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/checkout":{"post":{"summary":"Create a checkout session","tags":["agent-payments"],"description":"Creates a checkout session from a cart, locking the line items into a cart mandate (priced + hashed). Authenticates via merchant API key or tenant-admin JWT. Returns the session (201); moves no money yet.","responses":{"201":{"description":"The checkout session (a cart mandate); no money moved yet","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The checkout session (a cart mandate); no money moved yet","properties":{"checkoutId":{"type":"string","format":"uuid"},"status":{"type":"string"},"currency":{"type":"string"},"total":{"type":"string","description":"A decimal amount (as a string)"},"items":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"sku":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"},"unitPrice":{"type":"string","description":"A decimal amount (as a string)"},"lineTotal":{"type":"string","description":"A decimal amount (as a string)"}}}},"agentId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, an unknown product or a currency mismatch","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, an unknown product or a currency mismatch","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a valid merchant API key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a valid merchant API key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/checkout/{id}/complete":{"post":{"summary":"Complete a checkout (Aurea-paid)","tags":["agent-payments"],"description":"Completes a checkout by executing payment for its cart mandate through the policy gate and recording split settlement legs (merchant + platform + tax). Returns the completed checkout with execution and legs.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The checkout's execution and, when settled, its settlement legs","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The checkout's execution and, when settled, its settlement legs","properties":{"checkoutId":{"type":"string","format":"uuid"},"execution":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"legs":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A settlement leg of a completed checkout","properties":{"id":{"type":"string","format":"uuid"},"executionId":{"type":"string","format":"uuid"},"legIndex":{"type":"integer"},"partyType":{"type":"string","description":"merchant, platform, tax, fee or other"},"recipient":{"type":"string"},"amount":{"type":"string","description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"status":{"type":"string"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, a checkout that is not active, or an unknown wallet","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, a checkout that is not active, or an unknown wallet","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such checkout","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such checkout","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/checkout/{id}":{"get":{"summary":"Get a checkout session","tags":["agent-payments"],"description":"Fetches a checkout session by id. Authenticates via merchant API key or tenant-admin JWT. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The checkout session","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The checkout session","properties":{"checkoutId":{"type":"string","format":"uuid"},"status":{"type":"string"},"currency":{"type":"string"},"total":{"type":"string","description":"A decimal amount (as a string)"},"items":{"description":"The cart's line items as stored: sku, name, quantity, unitPrice, lineTotal"},"agentId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a valid merchant API key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a valid merchant API key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such checkout","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such checkout","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/checkout/{id}/refund":{"post":{"summary":"Refund a settled checkout","tags":["agent-payments"],"description":"Refunds a settled card checkout, fully or partially (optional amountMinor). Returns the refund result.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The refund the payment provider made","content":{"application/json":{"schema":{"type":"object","description":"The refund the payment provider made","properties":{"refundId":{"type":"string"},"status":{"type":["string","null"]},"executionId":{"type":"string","format":"uuid"},"amount":{"type":"string","description":"A decimal amount (as a string)"},"currency":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, a checkout not paid by card or not settled, or an invalid amount","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, a checkout not paid by card or not settled, or an invalid amount","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such checkout","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such checkout","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"500":{"description":"The payment provider is not configured","content":{"application/json":{"schema":{"type":"object","description":"The payment provider is not configured","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/disputes":{"get":{"summary":"List refunds and disputes","tags":["agent-payments"],"description":"Lists recorded refunds and disputes/chargebacks for the tenant. Read-only; returns them under `data`.","responses":{"200":{"description":"Refunds and disputes, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Refunds and disputes, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A refund or a dispute","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"executionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"dispute or refund"},"provider":{"type":"string"},"providerRef":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"status":{"type":"string"},"reason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/chat":{"post":{"summary":"Chat with the shopping agent","tags":["agent-payments"],"description":"Sends a message to the conversational shopping agent (LLM-backed) for a merchant agent, which can browse the catalogue and help build a cart. Authenticates via merchant API key (agent pinned) or tenant-admin JWT. Returns the chat response.","responses":{"200":{"description":"The shopping agent's reply (the LLM's, or the fallback's when no LLM answers), the resolved cart and, when the shopper checked out, the checkout opened","content":{"application/json":{"schema":{"type":"object","description":"The shopping agent's reply (the LLM's, or the fallback's when no LLM answers), the resolved cart and, when the shopper checked out, the checkout opened","properties":{"reply":{"type":"string"},"cart":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"sku":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"},"unitPrice":{"type":"string","description":"A decimal amount (as a string)"},"lineTotal":{"type":"string","description":"A decimal amount (as a string)"}}}},"total":{"type":"string","description":"A decimal amount (as a string)"},"currency":{"type":"string"}}},"checkout":{"type":"object","properties":{"checkoutId":{"type":"string","format":"uuid"},"total":{"type":"string","description":"A decimal amount (as a string)"},"currency":{"type":"string"}}},"llm":{"type":"boolean","description":"true when the LLM answered, false for the fallback"},"aiStatus":{"type":"string","description":"answered, or why the AI model did not answer: limit_reached (the tenant's monthly cap), filtered (the content filter), timeout, unavailable, not_configured or error"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, or the checkout could not be opened","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, or the checkout could not be opened","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a valid merchant API key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a valid merchant API key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid, or no agent (none in the body and no merchant key)","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid, or no agent (none in the body and no merchant key)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/commerce/checkout/{id}/card":{"post":{"summary":"Create a hosted card checkout session","tags":["agent-payments"],"description":"Creates a hosted card checkout session for a cart mandate so a shopper (who need not have an Aurea account) can pay by card. Authenticates via merchant API key or tenant-admin JWT. Returns the session including its redirect URL (201).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"The hosted card checkout: where to send the shopper","content":{"application/json":{"schema":{"type":"object","description":"The hosted card checkout: where to send the shopper","properties":{"url":{"type":["string","null"]},"sessionId":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, a checkout that is not active, a payment the policy does not authorize, or a payment provider that is not configured","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, a checkout that is not active, a payment the policy does not authorize, or a payment provider that is not configured","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a valid merchant API key","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a valid merchant API key","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission, or the merchant key's origin or rate limit refuses the call","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such checkout","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such checkout","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/standing":{"get":{"summary":"Get an agent's standing","tags":["agent-payments"],"description":"What the agent's identity is worth now: its Know-Your-Agent record with the expiry applied (a verification past its expiry reads `expired` and holds no trust level), and its reputation over the last 180 days from its settled and reversed payments, refunds and disputes (`score` null below 5 payments). Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"What the agent's identity is worth now: its KYA with the expiry applied, and its reputation over the window","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"What the agent's identity is worth now: its KYA with the expiry applied, and its reputation over the window","properties":{"agentId":{"type":"string","format":"uuid"},"trustLevel":{"type":"string","description":"none, basic, attested or certified — none unless verified and current"},"status":{"type":"string","description":"none, pending, verified, rejected or expired"},"method":{"type":["string","null"]},"verifiedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"},"reputationScore":{"type":["integer","null"]},"reputation":{"type":"object","additionalProperties":true,"properties":{"score":{"type":["integer","null"]},"sampleSize":{"type":"integer"},"sufficient":{"type":"boolean"},"windowDays":{"type":"integer"},"basis":{"type":"object","additionalProperties":true,"properties":{"settled":{"type":"integer"},"reversed":{"type":"integer"},"disputesLost":{"type":"integer"},"disputesWon":{"type":"integer"},"disputesOpen":{"type":"integer"},"refunds":{"type":"integer"}}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/agents/{id}/credential/revoke":{"post":{"summary":"Revoke all of an agent's credentials","tags":["agent-payments"],"description":"Revokes every active delegated credential of the agent at once — a cutoff: a credential issued afterwards works. Returns how many were revoked.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"How many of the agent's active credentials were revoked","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"How many of the agent's active credentials were revoked","properties":{"agentId":{"type":"string","format":"uuid"},"revoked":{"type":"integer"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/executions/recent":{"get":{"summary":"List recent executions","tags":["agent-payments"],"description":"The tenant's latest executions in the comma-separated `statuses` (default settled), newest first (`limit`, at most 200). Read-only; returns them under `data`.","parameters":[{"schema":{"type":"string","default":"settled"},"in":"query","name":"statuses","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"The executions, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The executions, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/executions/by-key/{key}":{"get":{"summary":"Get the execution an idempotency key made","tags":["agent-payments"],"description":"The execution POST /executions made with this idempotency key: how a payment already sent turned out. 404 when no execution was made with it. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"key","required":true}],"responses":{"200":{"description":"An agent payment execution","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An agent payment execution","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"mandateId":{"type":["string","null"],"format":"uuid"},"policyId":{"type":["string","null"],"format":"uuid"},"delegatedCredentialId":{"type":["string","null"],"format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid"},"transactionId":{"type":["string","null"],"format":"uuid"},"kind":{"type":"string","description":"payment, payout, swap, redeem, x402 or refund"},"rail":{"type":["string","null"],"description":"The rail that moved the money (null until one ran)"},"status":{"type":"string","description":"pending, authorized, approval_required, executing, settled, failed, reversed or denied"},"amount":{"type":["string","null"],"description":"A decimal amount (as a string)"},"currency":{"type":["string","null"]},"asset":{"type":["string","null"]},"chain":{"type":["string","null"]},"recipient":{"type":["string","null"]},"policyDecision":{"description":"The policy decision taken (an object: allow, reason, trace, riskScore, requiresStepUp, requiresApproval)"},"riskScore":{"type":["integer","null"]},"denialReason":{"type":["string","null"]},"idempotencyKey":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no execution was made with this key (`details.code` AGENT_EXECUTION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no execution was made with this key (`details.code` AGENT_EXECUTION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/conversations":{"get":{"summary":"List an owner's chat threads","tags":["agent-payments"],"description":"The treasury agent's threads of one owner (`ownerRef`: your end user's id, required), most recently active first; archived ones are left out. Read-only; returns them under `conversations`.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"in":"query","name":"ownerRef","required":true}],"responses":{"200":{"description":"The owner's threads, most recently active first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The owner's threads, most recently active first","properties":{"conversations":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A chat thread","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"title":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"messageCount":{"type":"integer"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/conversations/{id}":{"get":{"summary":"Get a chat thread","tags":["agent-payments"],"description":"The thread and its messages, oldest first, each with what it did (a payment it prepared, never one made). 404 when the thread is not this owner's — the same answer as for one that does not exist. Read-only.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"in":"query","name":"ownerRef","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The thread and its messages, oldest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The thread and its messages, oldest first","properties":{"conversation":{"type":"object","additionalProperties":true,"description":"A chat thread","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"title":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"messageCount":{"type":"integer"}}},"messages":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A chat turn and what it did (metadata)","properties":{"id":{"type":"string","format":"uuid"},"role":{"type":"string","description":"user, assistant or system"},"content":{"type":"string"},"metadata":{"description":"What the turn did: preparedPayment (never a payment made), showLimits, showPending, llm, aiStatus; error for a failed turn"},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such thread of this owner (`details.code` AGENT_CONVERSATION_NOT_FOUND)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such thread of this owner (`details.code` AGENT_CONVERSATION_NOT_FOUND)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Archive a chat thread","tags":["agent-payments"],"description":"Hides the thread from the owner's list; its messages are kept (a chat can be the only record of why an agent was told to pay someone). Returns `{ ok: true }`.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":128},"in":"query","name":"ownerRef","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Archived","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Archived","properties":{"ok":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such thread of this owner","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such thread of this owner","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/conversations/messages":{"post":{"summary":"Send a message to the treasury agent","tags":["agent-payments"],"description":"Stores the owner's message, asks the treasury agent (the AI model, metered against the tenant's monthly cap; a fallback without it) and stores its answer with what it did. The agent PREPARES a payment at most (recipient, amount) — a person approves it before anything moves. Starts a thread when `conversationId` is omitted (`agentId` required). The history the agent reads comes from the stored thread, never from the request. A failure is stored as a turn too (`failed`).","responses":{"200":{"description":"The thread, the agent's answer (or the stored failure), and whether it failed","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The thread, the agent's answer (or the stored failure), and whether it failed","properties":{"conversation":{"type":"object","additionalProperties":true,"description":"A chat thread","properties":{"id":{"type":"string","format":"uuid"},"agentId":{"type":"string","format":"uuid"},"title":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"messageCount":{"type":"integer"}}},"message":{"type":"object","additionalProperties":true,"description":"A chat turn and what it did (metadata)","properties":{"id":{"type":"string","format":"uuid"},"role":{"type":"string","description":"user, assistant or system"},"content":{"type":"string"},"metadata":{"description":"What the turn did: preparedPayment (never a payment made), showLimits, showPending, llm, aiStatus; error for a failed turn"},"createdAt":{"type":"string","format":"date-time"}}},"failed":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, no such agent in the tenant, or no such thread of this owner","content":{"application/json":{"schema":{"type":"object","description":"The module is off, no such agent in the tenant, or no such thread of this owner","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/sessions/keys":{"post":{"summary":"Mint an agent session key","tags":["agent-payments"],"description":"Makes a session key for the wallet and answers only its address (the private key is kept encrypted and never answered). A key can spend nothing on its own: it gains power only when the wallet grants it a session on the vault contract, which enforces the token, the caps and the expiry. 503 AGENT_VAULT_UNAVAILABLE while no vault contract is configured.","responses":{"201":{"description":"The session key minted: its id and address (never its private key)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The session key minted: its id and address (never its private key)","properties":{"id":{"type":"string","format":"uuid"},"address":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such wallet in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such wallet in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent vault is not available on this deployment (`details.code` AGENT_VAULT_UNAVAILABLE)","content":{"application/json":{"schema":{"type":"object","description":"The agent vault is not available on this deployment (`details.code` AGENT_VAULT_UNAVAILABLE)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/sessions":{"post":{"summary":"Record a vault session granted on-chain","tags":["agent-payments"],"description":"Records the session the wallet granted a minted session key, once its grant transaction is confirmed on the vault's chain (to the vault contract, from the wallet's owner address); the wallet's previous active session ends. A display cache: the contract enforces every limit (`perTxCap`, `dailyCap` in base units, `validUntil` in Unix seconds). 503 AGENT_VAULT_UNAVAILABLE while no vault contract is configured.","responses":{"201":{"description":"The session recorded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The session recorded","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"ownerAddress":{"type":"string"},"sessionKeyAddress":{"type":"string"},"contractAddress":{"type":"string"},"tokenAddress":{"type":"string"},"tokenDecimals":{"type":"integer"},"chainId":{"type":"integer"},"perTxCap":{"type":["string","null"],"description":"Base units"},"dailyCap":{"type":["string","null"],"description":"Base units"},"validUntil":{"type":"string","format":"date-time"},"status":{"type":"string","description":"active, revoked or expired"},"grantTxHash":{"type":["string","null"]}}}}}},"400":{"description":"The grant is not a confirmed call of the vault contract by the wallet, or not on its chain, or already expired (`details.code` AGENT_VAULT_GRANT_INVALID)","content":{"application/json":{"schema":{"type":"object","description":"The grant is not a confirmed call of the vault contract by the wallet, or not on its chain, or already expired (`details.code` AGENT_VAULT_GRANT_INVALID)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such wallet in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such wallet in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"503":{"description":"The agent vault is not available on this deployment, or its chain could not be read","content":{"application/json":{"schema":{"type":"object","description":"The agent vault is not available on this deployment, or its chain could not be read","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List a wallet's vault sessions","tags":["agent-payments"],"description":"The wallet's vault sessions, newest first — the active one and its revoked and expired predecessors. A display cache of the vault contract. Read-only; returns them under `sessions`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":true}],"responses":{"200":{"description":"The wallet's sessions, newest first (a display cache of the vault contract)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The wallet's sessions, newest first (a display cache of the vault contract)","properties":{"sessions":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A vault session (a display cache: the vault contract enforces every limit)","properties":{"id":{"type":"string","format":"uuid"},"walletId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"ownerAddress":{"type":"string"},"sessionKeyAddress":{"type":"string"},"contractAddress":{"type":"string"},"tokenAddress":{"type":"string"},"tokenDecimals":{"type":"integer"},"chainId":{"type":"integer"},"perTxCap":{"type":["string","null"],"description":"Base units"},"dailyCap":{"type":["string","null"],"description":"Base units"},"validUntil":{"type":"string","format":"date-time"},"status":{"type":"string","description":"active, revoked or expired"},"grantTxHash":{"type":["string","null"]}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such wallet in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such wallet in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"delete":{"summary":"Mark a wallet's vault session revoked","tags":["agent-payments"],"description":"Marks the wallet's active vault session revoked (with the revoking transaction `txHash`, when given) and wipes its key's material. The contract stops honouring it on its own once the wallet revokes it on-chain. Returns how many sessions were marked (0 or 1).","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"walletId","required":true},{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"in":"query","name":"txHash","required":false}],"responses":{"200":{"description":"How many active sessions were marked revoked (0 or 1)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"How many active sessions were marked revoked (0 or 1)","properties":{"revoked":{"type":"integer"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such wallet in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such wallet in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/tools":{"get":{"summary":"List MCP tools","tags":["agent-payments"],"description":"Lists the MCP (Model Context Protocol) tools of the agent-payments server: each one's name, description, input JSON schema, the scope a grant needs, and its read-only and destructive hints. With a grant's token (`Authorization: Bearer amcp_…`), only the tools its scopes reach. Read-only; returns them under `tools`.","responses":{"200":{"description":"The MCP tools","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The MCP tools","properties":{"tools":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An MCP tool","properties":{"name":{"type":"string"},"description":{"type":"string"},"inputSchema":{"description":"The tool's input, as a JSON schema"},"scope":{"type":"string","description":"The scope a grant needs to call it"},"annotations":{"type":"object","additionalProperties":true,"description":"MCP's tool annotations","properties":{"readOnlyHint":{"type":"boolean"},"destructiveHint":{"type":"boolean"}}}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a live grant","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a live grant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/tools/{name}":{"get":{"summary":"Get an MCP tool by name","tags":["agent-payments"],"description":"Returns the definition (input schema, scope, hints) of a single MCP tool by name. Returns 404 for an unknown tool, or one the grant's scopes do not reach. Read-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"An MCP tool","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An MCP tool","properties":{"name":{"type":"string"},"description":{"type":"string"},"inputSchema":{"description":"The tool's input, as a JSON schema"},"scope":{"type":"string","description":"The scope a grant needs to call it"},"annotations":{"type":"object","additionalProperties":true,"description":"MCP's tool annotations","properties":{"readOnlyHint":{"type":"boolean"},"destructiveHint":{"type":"boolean"}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a live grant","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a live grant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such tool (or none the grant's scopes reach)","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such tool (or none the grant's scopes reach)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/call":{"post":{"summary":"Invoke an MCP tool","tags":["agent-payments"],"description":"Invokes a named MCP tool with the given input in the caller's tenant/user context (optionally with an RSA public key). A session needs the tool's scope's permission; a grant's token also needs the scope, and a grant pinned to one agent reaches that agent only. Every call is logged; a grant calls at most its limit a minute, the tenant at most its limit a day (429). Side effects depend on the tool — some move money or mutate state. Returns `{ result }`.","responses":{"200":{"description":"The tool's result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tool's result","properties":{"result":{"description":"What the tool answered (an agent, a list, a policy, a mandate, a decision, an execution, a credential with its token, encrypted when an RSA key was sent, …)"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=, an unknown tool, or input the tool refuses","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=, an unknown tool, or input the tool refuses","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token nor a live grant","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token nor a live grant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the tool's permission, the grant does not hold its scope, or the grant is pinned to another agent","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the tool's permission, the grant does not hold its scope, or the grant is pinned to another agent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"The grant's calls per minute or the tenant's per day are spent","content":{"application/json":{"schema":{"type":"object","description":"The grant's calls per minute or the tenant's per day are spent","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp":{"post":{"summary":"MCP endpoint (JSON-RPC 2.0)","tags":["agent-payments"],"description":"The Model Context Protocol over JSON-RPC 2.0, for MCP hosts: `initialize`, `ping`, `tools/list`, `tools/call`; `notifications/*` answer 202 without a body; batches are refused. The same tools, authentication, scopes and limits as GET /mcp/tools and POST /mcp/call: a session, a grant's token (`Bearer amcp_…`) or an agent's delegated credential as a connector (`x-aurea-agent-key` or `Bearer ack_…`, the read and prepare tools only). A tool's refusal is an `isError` result the model reads.","responses":{"200":{"description":"A JSON-RPC 2.0 answer: `result` (initialize, ping, tools/list, tools/call — a tool's refusal is a result with isError) or `error` (-32600, -32601, -32602)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A JSON-RPC 2.0 answer: `result` (initialize, ping, tools/list, tools/call — a tool's refusal is a result with isError) or `error` (-32600, -32601, -32602)","properties":{"jsonrpc":{"type":"string"},"id":{"description":"The request's id"},"result":{"description":"The method's result"},"error":{"type":"object","additionalProperties":true,"properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}}}}},"202":{"description":"A notification: accepted, no body"},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"Neither a valid access token, a live grant nor a live connector credential (`WWW-Authenticate` names where to authenticate)","content":{"application/json":{"schema":{"type":"object","description":"Neither a valid access token, a live grant nor a live connector credential (`WWW-Authenticate` names where to authenticate)","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/.well-known/oauth-protected-resource":{"get":{"summary":"MCP protected-resource metadata","tags":["agent-payments"],"description":"The OAuth protected-resource metadata (RFC 9728) of the MCP endpoint: the resource, the authorization servers an MCP host authenticates with, the bearer method. Public: a host reads it before it holds a token.","responses":{"200":{"description":"OAuth protected-resource metadata (RFC 9728) of the MCP endpoint","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"OAuth protected-resource metadata (RFC 9728) of the MCP endpoint","properties":{"resource":{"type":"string"},"authorization_servers":{"type":"array","items":{"type":"string"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}}}}}}},"404":{"description":"MCP is not configured (a route that does not exist), or the module is off","content":{"application/json":{"schema":{"type":"object","description":"MCP is not configured (a route that does not exist), or the module is off","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/grants":{"post":{"summary":"Consent to an external AI agent","tags":["agent-payments"],"description":"The signed-in user consents to an external AI agent (`clientName`) calling the MCP tools with `scopes` (each one a permission the user holds), optionally pinned to one `agentId`, for `expiresInDays` (at most the platform's maximum). Without `codeChallenge`, answers the grant and its token (`amcp_…`) once. With a PKCE `codeChallenge` (S256) and optionally a `redirectUri` (https, or a loopback http address) and `state`, answers a one-time `code` (10 minutes) the client exchanges at POST /mcp/token with its verifier, and the `redirectTo` address to send the user back to.","responses":{"201":{"description":"The grant, with its token (once) — or, with PKCE, its one-time code, how long it lasts and where to send the user back","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The grant, with its token (once) — or, with PKCE, its one-time code, how long it lasts and where to send the user back","properties":{"grant":{"type":"object","additionalProperties":true,"description":"An external AI agent's grant: a user's consent (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"clientName":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"agentId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","description":"pending, active, revoked or expired"},"tokenPrefix":{"type":["string","null"],"description":"The token's first characters"},"redirectUri":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"}}},"token":{"type":"string","description":"The bearer token (amcp_…), answered once"},"code":{"type":"string","description":"The one-time code (amcpc_…)"},"codeExpiresIn":{"type":"integer","description":"Seconds"},"redirectTo":{"type":["string","null"]}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"Not a user of the tenant (platform administrators do not consent for one), or the role may not grant a scope asked for","content":{"application/json":{"schema":{"type":"object","description":"Not a user of the tenant (platform administrators do not consent for one), or the role may not grant a scope asked for","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"429":{"description":"The tenant holds as many live grants as it may","content":{"application/json":{"schema":{"type":"object","description":"The tenant holds as many live grants as it may","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List the external AI agents' grants","tags":["agent-payments"],"description":"The tenant's grants, newest first: every one for a role that configures agent payments, else the user's own. Each with its client, scopes, agent, status (pending, active, revoked or expired), expiry and last use; never a token. Read-only; returns them under `data`.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"The grants, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The grants, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"An external AI agent's grant: a user's consent (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"clientName":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"agentId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","description":"pending, active, revoked or expired"},"tokenPrefix":{"type":["string","null"],"description":"The token's first characters"},"redirectUri":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/token":{"post":{"summary":"Exchange a consent's code for a grant's token","tags":["agent-payments"],"description":"OAuth 2.1 authorization-code exchange with PKCE (S256), called by the external AI agent without a session: `grant_type` authorization_code, the one-time `code` POST /mcp/grants answered, the `code_verifier` whose SHA-256 is the challenge, and the `redirect_uri` given at consent (if any). The code is used once; a wrong verifier or redirect URI burns it. Answers the bearer token (`amcp_…`), its lifetime in seconds and its scopes.","responses":{"200":{"description":"The grant's bearer token (OAuth 2.1 token answer)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The grant's bearer token (OAuth 2.1 token answer)","properties":{"access_token":{"type":"string"},"token_type":{"type":"string"},"expires_in":{"type":"integer"},"scope":{"type":"string","description":"The scopes, space-separated"},"grant_id":{"type":"string","format":"uuid"}}}}}},"400":{"description":"The code is unknown, used, expired, or its verifier or redirect URI does not match","content":{"application/json":{"schema":{"type":"object","description":"The code is unknown, used, expired, or its verifier or redirect URI does not match","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"MCP is not configured (a route that does not exist), or the module is off for the deployment or for the grant's tenant","content":{"application/json":{"schema":{"type":"object","description":"MCP is not configured (a route that does not exist), or the module is off for the deployment or for the grant's tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/grants/{id}/calls":{"get":{"summary":"List a grant's tool calls","tags":["agent-payments"],"description":"The tool calls an external AI agent made with the grant, newest first: the tool, how it ended (ok, refused, failed) with its error code, the request id. Its user's, or any for a role that configures agent payments. Read-only; returns them under `data`.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The grant's tool calls, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The grant's tool calls, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"One MCP tool call","properties":{"id":{"type":"string","format":"uuid"},"grantId":{"type":["string","null"],"format":"uuid"},"userId":{"type":["string","null"],"format":"uuid"},"tool":{"type":"string"},"status":{"type":"string","description":"ok, refused or failed"},"errorCode":{"type":["string","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such grant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such grant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/mcp/grants/{id}/revoke":{"post":{"summary":"Revoke an external AI agent's grant","tags":["agent-payments"],"description":"Revokes a grant at once: its token and any pending code stop working. Its user revokes their own; a role that configures agent payments revokes any. Revoking a revoked grant answers it as it is. Returns the grant.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"An external AI agent's grant: a user's consent (never its token)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"An external AI agent's grant: a user's consent (never its token)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid"},"clientName":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"agentId":{"type":["string","null"],"format":"uuid"},"status":{"type":"string","description":"pending, active, revoked or expired"},"tokenPrefix":{"type":["string","null"],"description":"The token's first characters"},"redirectUri":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such grant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such grant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/endpoints":{"post":{"summary":"Register a webhook endpoint","tags":["agent-payments"],"description":"Registers a webhook endpoint (a URL, the event types it subscribes to — none: every one, see GET /webhooks/events — and optionally one agent, whose events only it then receives) to receive agent-payments event deliveries for the tenant. With a `secret` every delivery is signed (`X-Aurea-Signature`, and `X-Aurea-Signature-V1` over the timestamp and body); without one deliveries go unsigned until POST /webhooks/endpoints/:id/rotate-secret makes one. Returns the created endpoint (201).","responses":{"201":{"description":"The endpoint registered","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The endpoint registered","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","description":"active or disabled"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such agent in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such agent in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}},"get":{"summary":"List webhook endpoints","tags":["agent-payments"],"description":"Lists the registered webhook endpoints for the tenant. Read-only; returns them under `data`.","responses":{"200":{"description":"The tenant's webhook endpoints","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's webhook endpoints","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A webhook endpoint (never its secret)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","description":"active or disabled"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/events":{"get":{"summary":"List the webhook event types","tags":["agent-payments"],"description":"The event types an endpoint can subscribe to, each with what it reports. A delivery's body is `{ id, type, createdAt, data }`; `data` carries the ids (`agentId` always). Read-only; returns them under `data`.","responses":{"200":{"description":"The events an endpoint can subscribe to","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The events an endpoint can subscribe to","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string"},"description":{"type":"string"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/endpoints/{id}/status":{"post":{"summary":"Turn a webhook endpoint on or off","tags":["agent-payments"],"description":"Sets an endpoint `active` or `disabled`. A disabled endpoint receives nothing and gets no new events; its queued deliveries wait and go once it is active again. Returns the endpoint.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"A webhook endpoint (never its secret)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A webhook endpoint (never its secret)","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","description":"active or disabled"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such endpoint in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such endpoint in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/endpoints/{id}/rotate-secret":{"post":{"summary":"Rotate a webhook endpoint's signing secret","tags":["agent-payments"],"description":"Makes a new signing secret, answered once. For 24 hours the previous secret signs beside it (a second `v1` in `X-Aurea-Signature-V1`), so the receiver can switch without losing a delivery. Returns the endpoint with `secret` and `previousSecretUntil`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"The endpoint, with its new signing secret (answered once); the previous one signs beside it until previousSecretUntil","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The endpoint, with its new signing secret (answered once); the previous one signs beside it until previousSecretUntil","properties":{"id":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"agentId":{"type":["string","null"],"format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"status":{"type":"string","description":"active or disabled"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"secret":{"type":"string","description":"whsec_…, answered once"},"previousSecretUntil":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such endpoint in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such endpoint in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/endpoints/{id}/test":{"post":{"summary":"Send a test event to a webhook endpoint","tags":["agent-payments"],"description":"Queues a `webhook.test` event for this endpoint only (whatever it subscribes to), signed like every delivery; GET /webhooks/deliveries shows how it went. Returns its event id (202).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"202":{"description":"The test event queued for the endpoint","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The test event queued for the endpoint","properties":{"eventId":{"type":"string"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off, or no such endpoint in the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off, or no such endpoint in the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/deliveries":{"get":{"summary":"List webhook deliveries","tags":["agent-payments"],"description":"The tenant's deliveries, newest first, optionally of one endpoint or status: the event, its data, the attempts, the last HTTP status, when the next attempt is due. A delivery is retried with growing waits (1 minute to 1 hour) up to 6 attempts, then `dead`. Read-only; returns them under `data`.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"endpointId","required":false},{"schema":{"type":"string","enum":["pending","delivered","failed","dead"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"The deliveries, newest first","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The deliveries, newest first","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"A delivery (never the endpoint's secret)","properties":{"id":{"type":"string","format":"uuid"},"endpointId":{"type":["string","null"],"format":"uuid"},"eventType":{"type":"string"},"eventId":{"type":["string","null"]},"payload":{"description":"The event's data"},"status":{"type":"string","description":"pending, delivered, failed or dead"},"attempts":{"type":"integer"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"responseCode":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/webhooks/deliveries/{id}/redeliver":{"post":{"summary":"Send a webhook delivery again","tags":["agent-payments"],"description":"Queues a dead (or failed) delivery again, due now, its attempts counted from zero; any other delivery is left as it is (`queued: false`). Returns whether it was queued.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Whether the delivery was queued again (only a dead or failed one is)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Whether the delivery was queued again (only a dead or failed one is)","properties":{"queued":{"type":"boolean"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/recurring/run":{"post":{"summary":"Run recurring mandates for the tenant","tags":["agent-payments"],"description":"Manually triggers the recurring-mandate scheduler for the tenant, charging any due recurring mandates (also runs as a cron). Returns the tick result.","responses":{"200":{"description":"What one pass of the recurring-mandate scheduler did","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"What one pass of the recurring-mandate scheduler did","properties":{"fired":{"type":"integer"},"completed":{"type":"integer"},"skipped":{"type":"integer"}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/agent-payments/llm/usage":{"get":{"summary":"Get the AI model's use","tags":["agent-payments"],"description":"The tenant's AI model use this month (UTC): the monthly cost cap, what the calls cost so far, whether the cap is reached, and the call log, newest first (`limit`, `before`). The log holds counts and cost, never the messages.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"date-time"},"in":"query","name":"before","required":false}],"responses":{"200":{"description":"The tenant's AI model use this month (UTC): its cap, what the calls cost so far, whether the cap is reached, and the call log, newest first (counts and cost, never content)","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The tenant's AI model use this month (UTC): its cap, what the calls cost so far, whether the cap is reached, and the call log, newest first (counts and cost, never content)","properties":{"capEur":{"type":"string","description":"The monthly cap, EUR"},"spentEur":{"type":"string","description":"What this month's calls cost so far, EUR"},"calls":{"type":"integer"},"limitReached":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string","format":"uuid"},"feature":{"type":"string","description":"chat or probe"},"agentId":{"type":["string","null"],"format":"uuid"},"provider":{"type":"string"},"tier":{"type":"string","description":"orchestration, cheap or fallback"},"deployment":{"type":["string","null"]},"status":{"type":"string","description":"pending, ok, filtered, timeout, unavailable, error, limit_reached or not_configured"},"promptTokens":{"type":["integer","null"]},"completionTokens":{"type":["integer","null"]},"costEur":{"type":"string","description":"EUR"},"latencyMs":{"type":["integer","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"endedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"400":{"description":"A platform administrator named no ?tenantId=","content":{"application/json":{"schema":{"type":"object","description":"A platform administrator named no ?tenantId=","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"401":{"description":"No valid access token","content":{"application/json":{"schema":{"type":"object","description":"No valid access token","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"403":{"description":"The role does not hold the route's permission","content":{"application/json":{"schema":{"type":"object","description":"The role does not hold the route's permission","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"404":{"description":"The module is off for the deployment or for the tenant","content":{"application/json":{"schema":{"type":"object","description":"The module is off for the deployment or for the tenant","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"422":{"description":"The body, query or id is not valid","content":{"application/json":{"schema":{"type":"object","description":"The body, query or id is not valid","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}},"423":{"description":"The tenant or user is frozen","content":{"application/json":{"schema":{"type":"object","description":"The tenant or user is frozen","properties":{"statusCode":{"type":"integer","description":"The HTTP status"},"error":{"type":"string","description":"The error's name, or the route's own message"},"message":{"type":"string"},"details":{"description":"An object (for example `{ code }`) or, for a validation error, an array"}},"additionalProperties":true}}}}}}},"/v1/admin/tenants/{id}/freezes":{"post":{"summary":"Freeze a user or a wallet of the tenant","tags":["tenants"],"description":"The tenant's Owner, Admin and Security Admin, on their own tenant (Aurea administrators on any): its users (never one's own account, never a platform account) and its wallets; never the tenant itself. In force on every instance when this answers (it waits about a second after writing): a frozen tenant answers 423 `TENANT_FROZEN` to every authenticated request of its users and to its API key, a frozen user 423 `USER_FROZEN` to every authenticated request, and a frozen wallet 423 `WALLET_FROZEN` at every signing point and in the MPC relay (a wallet is its address in its tenant: every chain's row of it); a frozen `account` 423 `ACCOUNT_FROZEN` there for every wallet it holds (a user's default account: the user's wallets that are in no account). 404 `FREEZE_TARGET_NOT_FOUND`, 409 `ALREADY_FROZEN`, 403 `FREEZE_SELF`, 400 `FREEZE_UNTIL_PAST`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["target","id","reason"],"properties":{"target":{"type":"string","enum":["user","wallet","account"]},"id":{"type":"string","format":"uuid","description":"The tenant's, user's or wallet's id; for `account`, the account's (a user's default account has the user's id)."},"reason":{"type":"string","minLength":1,"maxLength":500},"until":{"type":"string","format":"date-time","description":"When the freeze ends by itself; in the future. Leave it out: until lifted."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","target","targetId","tenantId","reason","frozenBy","frozenByRole","frozenByPlatform","frozenAt","until","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"target":{"type":"string","enum":["tenant","user","wallet","account"]},"targetId":{"type":"string","format":"uuid"},"tenantId":{"type":["string","null"],"format":"uuid","description":"Null for a platform account."},"reason":{"type":"string"},"frozenBy":{"type":["string","null"],"format":"uuid"},"frozenByRole":{"type":"string"},"frozenByPlatform":{"type":"boolean","description":"An Aurea administrator froze it: only one lifts it."},"frozenAt":{"type":"string","format":"date-time"},"until":{"type":["string","null"],"format":"date-time","description":"Null: until lifted."},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List the tenant's freezes","tags":["tenants"],"description":"The tenant's freezes (its own included), newest first. Readers: who reads the tenant's users and activity log.","parameters":[{"schema":{"type":"string","enum":["tenant","user","wallet","account"]},"in":"query","name":"target","required":false},{"schema":{"type":"string","enum":["active","lifted","all"],"default":"active"},"in":"query","name":"status","required":false,"description":"active: in force now; lifted: lifted, or past its `until`; all: both."},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","target","targetId","tenantId","reason","frozenBy","frozenByRole","frozenByPlatform","frozenAt","until","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"target":{"type":"string","enum":["tenant","user","wallet","account"]},"targetId":{"type":"string","format":"uuid"},"tenantId":{"type":["string","null"],"format":"uuid","description":"Null for a platform account."},"reason":{"type":"string"},"frozenBy":{"type":["string","null"],"format":"uuid"},"frozenByRole":{"type":"string"},"frozenByPlatform":{"type":"boolean","description":"An Aurea administrator froze it: only one lifts it."},"frozenAt":{"type":"string","format":"date-time"},"until":{"type":["string","null"],"format":"date-time","description":"Null: until lifted."},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/freezes/{freezeId}/lift":{"post":{"summary":"Lift a freeze of the tenant's user or wallet","tags":["tenants"],"description":"The tenant's Owner, Admin and Security Admin, on their own tenant. Never the tenant's own freeze, nor one an Aurea administrator placed (403 `FREEZE_LIFT_PLATFORM_ONLY`), nor one of one's own account or wallet (403 `FREEZE_SELF`). In force on every instance when this answers. 404 `FREEZE_NOT_FOUND`, 409 `FREEZE_NOT_ACTIVE`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reason"],"properties":{"reason":{"type":"string","minLength":1,"maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"freezeId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","target","targetId","tenantId","reason","frozenBy","frozenByRole","frozenByPlatform","frozenAt","until","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"target":{"type":"string","enum":["tenant","user","wallet","account"]},"targetId":{"type":"string","format":"uuid"},"tenantId":{"type":["string","null"],"format":"uuid","description":"Null for a platform account."},"reason":{"type":"string"},"frozenBy":{"type":["string","null"],"format":"uuid"},"frozenByRole":{"type":"string"},"frozenByPlatform":{"type":"boolean","description":"An Aurea administrator froze it: only one lifts it."},"frozenAt":{"type":"string","format":"date-time"},"until":{"type":["string","null"],"format":"date-time","description":"Null: until lifted."},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/quarantines":{"post":{"summary":"Quarantine a pending operation of the tenant","tags":["tenants"],"description":"The tenant's Owner, Admin and Security Admin, on their own tenant. Held before anything is signed or sent, until lifted (423 `OPERATION_QUARANTINED`): an Earn operation waiting for its client's signatures (`earn_operation`, held at its broadcast and at the MPC signing of its steps), a bank ramp payout waiting for its deposit from one of the tenant's wallets (`bank_payout`, held at every signing point that would send the deposit), an agent payment waiting for an approval (`agent_execution`, held at its approval). 409 `OPERATION_NOT_PENDING` for anything else, `OPERATION_NOT_QUARANTINABLE` for a payout the Hub signs nothing for. 404 `OPERATION_NOT_FOUND`, 409 `ALREADY_QUARANTINED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["operation","id","reason"],"properties":{"operation":{"type":"string","enum":["earn_operation","bank_payout","agent_execution"]},"id":{"type":"string","format":"uuid","description":"The operation's id."},"reason":{"type":"string","minLength":1,"maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","operation","operationId","tenantId","walletId","reason","quarantinedBy","quarantinedByRole","quarantinedByPlatform","quarantinedAt","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"operation":{"type":"string","enum":["earn_operation","bank_payout","agent_execution","operation","inbound_transfer"]},"operationId":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet that would sign the operation, when there is one."},"reason":{"type":"string"},"quarantinedBy":{"type":["string","null"],"format":"uuid"},"quarantinedByRole":{"type":"string"},"quarantinedByPlatform":{"type":"boolean"},"quarantinedAt":{"type":"string","format":"date-time"},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List the tenant's quarantines","tags":["tenants"],"description":"The tenant's quarantined operations, newest first.","parameters":[{"schema":{"type":"string","enum":["earn_operation","bank_payout","agent_execution","operation","inbound_transfer"]},"in":"query","name":"operation","required":false},{"schema":{"type":"string","enum":["active","lifted","all"],"default":"active"},"in":"query","name":"status","required":false,"description":"active: in force now; lifted: lifted, or past its `until`; all: both."},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","operation","operationId","tenantId","walletId","reason","quarantinedBy","quarantinedByRole","quarantinedByPlatform","quarantinedAt","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"operation":{"type":"string","enum":["earn_operation","bank_payout","agent_execution","operation","inbound_transfer"]},"operationId":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet that would sign the operation, when there is one."},"reason":{"type":"string"},"quarantinedBy":{"type":["string","null"],"format":"uuid"},"quarantinedByRole":{"type":"string"},"quarantinedByPlatform":{"type":"boolean"},"quarantinedAt":{"type":"string","format":"date-time"},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/quarantines/{quarantineId}/lift":{"post":{"summary":"Lift a quarantine of the tenant's operation","tags":["tenants"],"description":"The tenant's Owner, Admin and Security Admin, on their own tenant; never one an Aurea administrator placed (403 `FREEZE_LIFT_PLATFORM_ONLY`). The operation goes on as before from where it waited. 404 `QUARANTINE_NOT_FOUND`, 409 `QUARANTINE_NOT_ACTIVE`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reason"],"properties":{"reason":{"type":"string","minLength":1,"maxLength":500}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"quarantineId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","operation","operationId","tenantId","walletId","reason","quarantinedBy","quarantinedByRole","quarantinedByPlatform","quarantinedAt","active","liftedAt","liftedBy","liftedByRole","liftReason"],"properties":{"id":{"type":"string","format":"uuid"},"operation":{"type":"string","enum":["earn_operation","bank_payout","agent_execution","operation","inbound_transfer"]},"operationId":{"type":"string","format":"uuid"},"tenantId":{"type":"string","format":"uuid"},"walletId":{"type":["string","null"],"format":"uuid","description":"The wallet that would sign the operation, when there is one."},"reason":{"type":"string"},"quarantinedBy":{"type":["string","null"],"format":"uuid"},"quarantinedByRole":{"type":"string"},"quarantinedByPlatform":{"type":"boolean"},"quarantinedAt":{"type":"string","format":"date-time"},"active":{"type":"boolean"},"liftedAt":{"type":["string","null"],"format":"date-time"},"liftedBy":{"type":["string","null"],"format":"uuid"},"liftedByRole":{"type":["string","null"]},"liftReason":{"type":["string","null"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/reports":{"post":{"summary":"Ask for a report","tags":["reports"],"description":"A file of the tenant's movements (its transactions as recorded, source transaction, and the transfers into its wallets Aurea recorded, source inbound_transfer, oldest first), balances (read now from the chains, per wallet, chain and asset), addresses (its wallets) or approvals (its operations' approval requests and decisions), in CSV or JSON, made in the background; read the report until it is ready, then download it through its signed link. Columns, in order — movements: source, id, createdAt, chain, isTestnet, txHash, type, status, direction, from, to, amount, tokenAddress, tokenSymbol, tokenDecimals, fee, blockNumber, blockTime, walletId, accountId, userId. balances: walletId, accountId, userId, chain, isTestnet, address, asset, symbol, decimals, balance, status, readAt. addresses: walletId, accountId, customerRefId, userId, chain, isTestnet, address, walletType, keyManagementScheme, isPrimary, label, createdAt, deactivatedAt. approvals: approvalId, operationId, status, origin, ruleName, threshold, chain, chainId, asset, amount, destination, initiatorUserId, approvals, rejections, decidedBy, createdAt, expiresAt, decidedAt. Amounts in the asset's smallest unit. 503 REPORTS_OFF while Aurea has reports switched off; 429 REPORTS_TOO_MANY with too many waiting; 400 REPORT_FILTER_INVALID. Recorded in the audit trail (report.requested).","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type","format"],"properties":{"type":{"type":"string","enum":["movements","balances","addresses","approvals"]},"format":{"type":"string","enum":["csv","json"]},"filters":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","format":"date-time","description":"Created at or after (movements, approvals only)"},"to":{"type":"string","format":"date-time","description":"Created before (movements, approvals only)"},"walletIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"}},"accountIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"},"description":"Accounts: a wallet's account, else its user's default account (whose id is the user's)"},"chains":{"type":"array","maxItems":20,"uniqueItems":true,"items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"description":"Chain names as wallets and tokens name them (gnosis, polygon, solana…)"}}}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["movements","balances","addresses","approvals"]},"format":{"type":"string","enum":["csv","json"]},"filters":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","format":"date-time","description":"Created at or after (movements, approvals only)"},"to":{"type":"string","format":"date-time","description":"Created before (movements, approvals only)"},"walletIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"}},"accountIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"},"description":"Accounts: a wallet's account, else its user's default account (whose id is the user's)"},"chains":{"type":"array","maxItems":20,"uniqueItems":true,"items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"description":"Chain names as wallets and tokens name them (gnosis, polygon, solana…)"}}},"status":{"type":"string","enum":["queued","running","ready","failed","expired"],"description":"queued → running → ready (download it) or failed (failureCode says why); ready → expired once its file was deleted"},"failureCode":{"type":["string","null"],"description":"REPORT_TOO_LARGE (more rows than the platform's limit: narrow the filters), REPORT_GENERATION_FAILED"},"rowCount":{"type":["integer","null"]},"byteSize":{"type":["integer","null"]},"sha256":{"type":["string","null"],"description":"The file's SHA-256, hex"},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When the file is deleted"},"downloads":{"type":"integer"},"download":{"type":["object","null"],"description":"While ready: a signed link to the file, for this tenant and this report, that works on its own — no authorization header — for five minutes (expiresAt); whoever holds it can download the file until then, so hand it only to whom it is meant for. Read the report again for a new one.","properties":{"url":{"type":"string","description":"Path and query on this API"},"expiresAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"get":{"summary":"List the tenant's reports","tags":["reports"],"description":"Newest first.","parameters":[{"schema":{"type":"string","enum":["queued","running","ready","failed","expired"]},"in":"query","name":"status","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"reports":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["movements","balances","addresses","approvals"]},"format":{"type":"string","enum":["csv","json"]},"filters":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","format":"date-time","description":"Created at or after (movements, approvals only)"},"to":{"type":"string","format":"date-time","description":"Created before (movements, approvals only)"},"walletIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"}},"accountIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"},"description":"Accounts: a wallet's account, else its user's default account (whose id is the user's)"},"chains":{"type":"array","maxItems":20,"uniqueItems":true,"items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"description":"Chain names as wallets and tokens name them (gnosis, polygon, solana…)"}}},"status":{"type":"string","enum":["queued","running","ready","failed","expired"],"description":"queued → running → ready (download it) or failed (failureCode says why); ready → expired once its file was deleted"},"failureCode":{"type":["string","null"],"description":"REPORT_TOO_LARGE (more rows than the platform's limit: narrow the filters), REPORT_GENERATION_FAILED"},"rowCount":{"type":["integer","null"]},"byteSize":{"type":["integer","null"]},"sha256":{"type":["string","null"],"description":"The file's SHA-256, hex"},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When the file is deleted"},"downloads":{"type":"integer"},"download":{"type":["object","null"],"description":"While ready: a signed link to the file, for this tenant and this report, that works on its own — no authorization header — for five minutes (expiresAt); whoever holds it can download the file until then, so hand it only to whom it is meant for. Read the report again for a new one.","properties":{"url":{"type":"string","description":"Path and query on this API"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"nextCursor":{"type":["string","null"]}}}}}}}}},"/v1/admin/tenants/{id}/reports/{reportId}":{"get":{"summary":"Get a report","tags":["reports"],"description":"Its status and, while ready, a new signed download link.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"reportId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["movements","balances","addresses","approvals"]},"format":{"type":"string","enum":["csv","json"]},"filters":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","format":"date-time","description":"Created at or after (movements, approvals only)"},"to":{"type":"string","format":"date-time","description":"Created before (movements, approvals only)"},"walletIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"}},"accountIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"string","format":"uuid"},"description":"Accounts: a wallet's account, else its user's default account (whose id is the user's)"},"chains":{"type":"array","maxItems":20,"uniqueItems":true,"items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,49}$"},"description":"Chain names as wallets and tokens name them (gnosis, polygon, solana…)"}}},"status":{"type":"string","enum":["queued","running","ready","failed","expired"],"description":"queued → running → ready (download it) or failed (failureCode says why); ready → expired once its file was deleted"},"failureCode":{"type":["string","null"],"description":"REPORT_TOO_LARGE (more rows than the platform's limit: narrow the filters), REPORT_GENERATION_FAILED"},"rowCount":{"type":["integer","null"]},"byteSize":{"type":["integer","null"]},"sha256":{"type":["string","null"],"description":"The file's SHA-256, hex"},"requestedBy":{"type":["string","null"],"format":"uuid"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When the file is deleted"},"downloads":{"type":"integer"},"download":{"type":["object","null"],"description":"While ready: a signed link to the file, for this tenant and this report, that works on its own — no authorization header — for five minutes (expiresAt); whoever holds it can download the file until then, so hand it only to whom it is meant for. Read the report again for a new one.","properties":{"url":{"type":"string","description":"Path and query on this API"},"expiresAt":{"type":"string","format":"date-time"}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/reports/{reportId}/download":{"get":{"summary":"Download a report","tags":["reports"],"description":"The report's file (text/csv or application/json, as an attachment), through the link its read answered, on its own: no authorization header, `expires` and `signature` as given. The link opens that tenant's report only, for five minutes; anyone holding it can download the file until then. 403 REPORT_LINK_INVALID, 410 REPORT_LINK_EXPIRED, 409 REPORT_NOT_READY, 410 REPORT_EXPIRED (the file was deleted), 410 REPORT_FILE_GONE; 429 past 30 downloads a minute from one address. Each download is recorded in the tenant's audit trail (report.downloaded).","parameters":[{"schema":{"type":"string","pattern":"^[0-9]{1,12}$"},"in":"query","name":"expires","required":true},{"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"in":"query","name":"signature","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"reportId","required":true}],"security":[],"responses":{"200":{"description":"The report's file as an attachment (content-disposition names it); `x-content-sha256` is its SHA-256 in hex.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"410":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/server-credentials":{"get":{"summary":"List the tenant's server credentials","tags":["tenants"],"description":"The tenant's Owner, Admin, Non-signing Admin and Security Admin, on their own tenant (Aurea administrators on any). Newest first; never a private key (there is none). 400 `SERVER_CREDENTIAL_CURSOR_INVALID`.","parameters":[{"schema":{"type":"string","enum":["all","active","expired","revoked"],"default":"all"},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"cursor","required":false},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","tenantId","name","role","status","publicKey","thumbprint","allowedIps","expiresAt","createdAt","createdBy","updatedAt","updatedBy","lastUsedAt","revokedAt","revokedBy","revokeReason","roleNarrows"],"properties":{"id":{"type":"string","format":"uuid","description":"The credential, and the `kid` of the tokens it signs."},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"status":{"type":"string","enum":["active","expired","revoked"],"description":"active: its tokens are accepted; expired: past `expiresAt`; revoked: for good."},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"allowedIps":{"type":"array","items":{"type":"string"},"description":"The networks its tokens are accepted from; empty: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"Null: no expiry."},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"],"format":"uuid"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last accepted token (written at most once a minute)."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"},"revokeReason":{"type":["string","null"]},"roleNarrows":{"type":"boolean","description":"Whether its role decides which tenant-signed routes its tokens reach: true for every credential registered since 06/10/2026 (its role must hold each route's permission, else 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`); false for one registered before, which reaches every tenant-signed route as the tenant's API key does. Never changes."},"testOnly":{"type":"boolean","description":"Present, `true`, only on a credential registered for test networks only: its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Never changes. Absent on every other credential."}}}},"nextCursor":{"type":["string","null"],"description":"Pass it as `cursor` for the next page; null on the last."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"post":{"summary":"Register a server credential (a public key)","tags":["tenants"],"description":"The tenant's Owner, Admin, Non-signing Admin and Security Admin, on their own tenant (Aurea administrators on any). The tenant generates a P-256 key pair and registers its public key; the Hub never sees the private key. Several credentials may be active at once (at most 10): to rotate, register the new key, move the server to it, revoke the old one. **Signing with a credential.** The tenant's server keeps the private key and sends `Authorization: Bearer <token>`, a compact JWS signed ES256 (JOSE r‖s signature): header `{ \"alg\": \"ES256\", \"typ\": \"aurea-server+jwt\", \"kid\": \"<credential id>\" }` (no other member); claims `{ \"uri\": \"<METHOD> <path and query exactly as sent>\", \"bodyHash\": \"<unpadded base64url SHA-256 of the exact body; of the empty string without one>\", \"nonce\": \"<16–128 of A–Z a–z 0–9 _ -, never reused>\", \"iat\": <seconds>, \"exp\": <seconds> }`, with `exp` after `iat` by 30 s at most (clock skew allowed: 10 s). It is accepted, instead of the HMAC headers (never with them: 400 `SERVER_AUTH_SCHEMES_CONFLICT`), on every route that takes the tenant's signature alone: sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, the card ramp's customers. Refusals are 401 with `details.code`: `SERVER_TOKEN_MALFORMED`, `SERVER_TOKEN_LIFETIME_INVALID`, `SERVER_TOKEN_NOT_YET_VALID`, `SERVER_TOKEN_EXPIRED`, `SERVER_CREDENTIAL_UNKNOWN`, `SERVER_TOKEN_SIGNATURE_INVALID`, `SERVER_CREDENTIAL_REVOKED`, `SERVER_CREDENTIAL_EXPIRED`, `SERVER_CREDENTIAL_TENANT_INACTIVE`, `SERVER_CREDENTIAL_IP_NOT_ALLOWED`, `SERVER_TOKEN_URI_MISMATCH`, `SERVER_TOKEN_BODY_MISMATCH`, `SERVER_TOKEN_REPLAYED`. A credential whose role narrows (`roleNarrows`) and does not hold the route's permission is refused 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`, with the permission in `details.permission` and in the challenge's `scope`. Refusals: 400 `SERVER_CREDENTIAL_KEY_INVALID`, `SERVER_CREDENTIAL_PRIVATE_KEY`, `SERVER_CREDENTIAL_NAME_INVALID`, `SERVER_CREDENTIAL_ROLE_INVALID`, `SERVER_CREDENTIAL_IP_INVALID`, `SERVER_CREDENTIAL_EXPIRY_INVALID`; 403 `SERVER_CREDENTIAL_ROLE_ABOVE_OWN`, `TEST_ONLY_CREDENTIALS_OFF`; 404 `TENANT_NOT_FOUND`; 409 `SERVER_CREDENTIAL_KEY_IN_USE` (a key is registered once, ever), `SERVER_CREDENTIAL_LIMIT`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name","role","publicKey"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"role":{"type":"string","maxLength":40,"description":"The tenant role the credential carries: tenantadmin, non_signing_admin, signer, approver, editor, viewer, auditor, security_admin, security_auditor — within the caller's own (403 `SERVER_CREDENTIAL_ROLE_ABOVE_OWN`). It reaches no permissioned route: a token reaches the routes the tenant's signature reaches. A credential registered since 06/10/2026 (`roleNarrows: true`) reaches only the tenant-signed routes whose permission its role holds: `GET /v1/tenant/public` every role; sign-up and sign-in (`/v1/auth/register`, `/login`, `/google`, `/apple`, `/forgot-password`) `tenant.users.write` (Admin, Non-signing Admin); `POST /v1/mpc/service/token` and the card ramp's customers (`/v1/ramp/card/customers/*`) `self.mpc.use` and `self.card_ramp.use` (Admin, Signer)."},"publicKey":{"type":"object","description":"The credential's P-256 public key as a JWK: `{ \"kty\": \"EC\", \"crv\": \"P-256\", \"x\": \"…\", \"y\": \"…\" }` (`x`, `y`: 32 bytes each, unpadded base64url). `alg` (\"ES256\"), `use` (\"sig\"), `kid`, `key_ops` and `ext` are accepted and dropped. Never the private key: a JWK with `d` is refused (400 `SERVER_CREDENTIAL_PRIVATE_KEY`).","properties":{"kty":{"type":"string","description":"\"EC\""},"crv":{"type":"string","description":"\"P-256\""},"x":{"type":"string"},"y":{"type":"string"}}},"allowedIps":{"type":"array","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":64},"description":"IPv4 or IPv6 networks (`203.0.113.0/24`, `2001:db8::/32`, or a bare address), at most 50; matched against the address the API sees the call come from. Empty or left out: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When its tokens stop being accepted: in the future, at most 5 years ahead. Null or left out: no expiry."},"testOnly":{"type":"boolean","description":"Optional. `true`: a credential for test networks only — its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Only where test-only credentials are switched on for the tenant, else 403 `TEST_ONLY_CREDENTIALS_OFF`. Left out or `false`: a credential as every other."}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","name","role","status","publicKey","thumbprint","allowedIps","expiresAt","createdAt","createdBy","updatedAt","updatedBy","lastUsedAt","revokedAt","revokedBy","revokeReason","roleNarrows"],"properties":{"id":{"type":"string","format":"uuid","description":"The credential, and the `kid` of the tokens it signs."},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"status":{"type":"string","enum":["active","expired","revoked"],"description":"active: its tokens are accepted; expired: past `expiresAt`; revoked: for good."},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"allowedIps":{"type":"array","items":{"type":"string"},"description":"The networks its tokens are accepted from; empty: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"Null: no expiry."},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"],"format":"uuid"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last accepted token (written at most once a minute)."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"},"revokeReason":{"type":["string","null"]},"roleNarrows":{"type":"boolean","description":"Whether its role decides which tenant-signed routes its tokens reach: true for every credential registered since 06/10/2026 (its role must hold each route's permission, else 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`); false for one registered before, which reaches every tenant-signed route as the tenant's API key does. Never changes."},"testOnly":{"type":"boolean","description":"Present, `true`, only on a credential registered for test networks only: its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Never changes. Absent on every other credential."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/server-credentials/{credentialId}":{"patch":{"summary":"Change a server credential's name, role, allow-list or expiry","tags":["tenants"],"description":"The tenant's Owner, Admin, Non-signing Admin and Security Admin, on their own tenant (Aurea administrators on any). Only the fields sent change. The key never changes: a new key is a new credential. A credential whose role is above the caller's is not changed by it (403 `SERVER_CREDENTIAL_ROLE_ABOVE_OWN`). 400 `SERVER_CREDENTIAL_NOTHING_TO_CHANGE` and the create route's input refusals; 404 `SERVER_CREDENTIAL_NOT_FOUND`; 409 `SERVER_CREDENTIAL_REVOKED`, `SERVER_CREDENTIAL_EXPIRED`.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"role":{"type":"string","maxLength":40,"description":"The tenant role the credential carries: tenantadmin, non_signing_admin, signer, approver, editor, viewer, auditor, security_admin, security_auditor — within the caller's own (403 `SERVER_CREDENTIAL_ROLE_ABOVE_OWN`). It reaches no permissioned route: a token reaches the routes the tenant's signature reaches. A credential registered since 06/10/2026 (`roleNarrows: true`) reaches only the tenant-signed routes whose permission its role holds: `GET /v1/tenant/public` every role; sign-up and sign-in (`/v1/auth/register`, `/login`, `/google`, `/apple`, `/forgot-password`) `tenant.users.write` (Admin, Non-signing Admin); `POST /v1/mpc/service/token` and the card ramp's customers (`/v1/ramp/card/customers/*`) `self.mpc.use` and `self.card_ramp.use` (Admin, Signer)."},"allowedIps":{"type":"array","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":64},"description":"IPv4 or IPv6 networks (`203.0.113.0/24`, `2001:db8::/32`, or a bare address), at most 50; matched against the address the API sees the call come from. Empty or left out: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When its tokens stop being accepted: in the future, at most 5 years ahead. Null or left out: no expiry."}}}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"credentialId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","name","role","status","publicKey","thumbprint","allowedIps","expiresAt","createdAt","createdBy","updatedAt","updatedBy","lastUsedAt","revokedAt","revokedBy","revokeReason","roleNarrows"],"properties":{"id":{"type":"string","format":"uuid","description":"The credential, and the `kid` of the tokens it signs."},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"status":{"type":"string","enum":["active","expired","revoked"],"description":"active: its tokens are accepted; expired: past `expiresAt`; revoked: for good."},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"allowedIps":{"type":"array","items":{"type":"string"},"description":"The networks its tokens are accepted from; empty: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"Null: no expiry."},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"],"format":"uuid"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last accepted token (written at most once a minute)."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"},"revokeReason":{"type":["string","null"]},"roleNarrows":{"type":"boolean","description":"Whether its role decides which tenant-signed routes its tokens reach: true for every credential registered since 06/10/2026 (its role must hold each route's permission, else 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`); false for one registered before, which reaches every tenant-signed route as the tenant's API key does. Never changes."},"testOnly":{"type":"boolean","description":"Present, `true`, only on a credential registered for test networks only: its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Never changes. Absent on every other credential."}}}}}},"202":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","content":{"application/json":{"schema":{"description":"Held for the quorum: nothing was done. Another administrator approves it (a tenant's own administrators: POST /v1/quorum/requests/{id}/approve), and the requester reads its answer once (POST /v1/quorum/requests/{id}/result).","type":"object","properties":{"state":{"type":"string","enum":["awaiting_quorum"]},"requestId":{"type":"string","format":"uuid"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}},"/v1/admin/tenants/{id}/server-credentials/{credentialId}/revoke":{"post":{"summary":"Revoke a server credential","tags":["tenants"],"description":"The tenant's Owner, Admin, Non-signing Admin and Security Admin, on their own tenant (Aurea administrators on any). For good: its tokens are refused on the next request (401 `SERVER_CREDENTIAL_REVOKED`) and it never changes again. 404 `SERVER_CREDENTIAL_NOT_FOUND`; 409 `SERVER_CREDENTIAL_REVOKED`. It runs at once for every caller (no Admin Quorum), and the tenant's webhook addresses that name `server_credential.revoked` are told, in both environments.","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["reason"],"properties":{"reason":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S"}}}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"path","name":"credentialId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","tenantId","name","role","status","publicKey","thumbprint","allowedIps","expiresAt","createdAt","createdBy","updatedAt","updatedBy","lastUsedAt","revokedAt","revokedBy","revokeReason","roleNarrows"],"properties":{"id":{"type":"string","format":"uuid","description":"The credential, and the `kid` of the tokens it signs."},"tenantId":{"type":"string","format":"uuid"},"name":{"type":"string"},"role":{"type":"string","enum":["tenantadmin","non_signing_admin","signer","approver","editor","viewer","auditor","security_admin","security_auditor"]},"status":{"type":"string","enum":["active","expired","revoked"],"description":"active: its tokens are accepted; expired: past `expiresAt`; revoked: for good."},"publicKey":{"type":"object","required":["kty","crv","x","y"],"properties":{"kty":{"type":"string"},"crv":{"type":"string"},"x":{"type":"string"},"y":{"type":"string"}}},"thumbprint":{"type":"string","description":"RFC 7638 SHA-256 thumbprint of the key, base64url."},"allowedIps":{"type":"array","items":{"type":"string"},"description":"The networks its tokens are accepted from; empty: any address."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"Null: no expiry."},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"],"format":"uuid"},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"],"format":"uuid"},"lastUsedAt":{"type":["string","null"],"format":"date-time","description":"The last accepted token (written at most once a minute)."},"revokedAt":{"type":["string","null"],"format":"date-time"},"revokedBy":{"type":["string","null"],"format":"uuid"},"revokeReason":{"type":["string","null"]},"roleNarrows":{"type":"boolean","description":"Whether its role decides which tenant-signed routes its tokens reach: true for every credential registered since 06/10/2026 (its role must hold each route's permission, else 403 `SERVER_CREDENTIAL_ROLE_NOT_ALLOWED`); false for one registered before, which reaches every tenant-signed route as the tenant's API key does. Never changes."},"testOnly":{"type":"boolean","description":"Present, `true`, only on a credential registered for test networks only: its tokens reach a route only when the request names a testnet — `isTestnet: true` in the query or body, and every `chainId` it carries a testnet's. A request for a mainnet, and a route that does not take the network from the request (sign-up and sign-in, `GET /v1/tenant/public`, the MPC service token, a record read or acted on by its id), answer 403 `TEST_ONLY_CREDENTIAL` with `details.network` (`mainnet` or `undetermined`); nothing is done and the token's nonce is not used. Never changes. Absent on every other credential."}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}},"423":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}},"servers":[{"url":"https://api.aureahub.com","description":"Production server"}],"tags":[{"name":"auth","description":"Authentication endpoints"},{"name":"users","description":"User management endpoints"},{"name":"wallets","description":"Blockchain wallet management endpoints"},{"name":"transactions","description":"Blockchain transaction endpoints"},{"name":"tokens","description":"Token registry and information endpoints"},{"name":"swap","description":"Token swaps: quotes, approvals, execution and broadcast"},{"name":"tenants","description":"Tenant management endpoints (user-facing)"},{"name":"admin","description":"Admin-only endpoints for tenant and system management"},{"name":"mpc","description":"Proprietary 2-of-3 MPC (TSS) wallet — non-custodial threshold wallet (DKG, threshold signing, recovery) + relay endpoints"},{"name":"bank-ramp-payin","description":"The bank ramp's EUR pay-in endpoints"},{"name":"bank-ramp-payout","description":"The bank ramp's fiat payout endpoints (crypto → fiat)"},{"name":"bank-ramp-currencies","description":"Currency and network pairs available with the bank ramp, per environment"},{"name":"bank-ramp-addresses","description":"Addresses outside Aurea a user proved they own, for the bank ramp's standalone mode"},{"name":"bank-ramp-customers","description":"The user's customer profile with the bank ramp: create it, read it, read it again from the bank ramp"},{"name":"bank-ramp-deposits","description":"The payments that arrived on the customer's IBAN with the bank ramp, each one minted to the customer's address"},{"name":"bank-ramp-payouts","description":"Payouts to a bank account from the customer's tokens, burned from one of its linked addresses once the address signed the bank ramp's message"},{"name":"bank-ramp-local","description":"Local currencies on the bank ramp: the user's verification and balances, pay-ins by local bank transfer or mobile money with an exact amount, withdrawals to a bank account, a mobile money number or a wallet, and sales of a stablecoin for local money"},{"name":"bank-ramp-desk","description":"The bank ramp's desk: quoted orders between a stablecoin and a bank account, to a bank or from a bank with a funding reference and a proof of payment"},{"name":"fiat-profiles","description":"Fiat accounts: the profiles of a tenant's end users and of the tenant itself, verified as people (KYC) or businesses (KYB) — their documents, beneficial owners and Canadian regulatory data"},{"name":"fiat-bank-accounts","description":"Fiat accounts: a profile's own bank accounts, their verification by small deposits, and its funding sources"},{"name":"fiat-beneficiaries","description":"Fiat accounts: the people and businesses a profile pays, with their bank accounts, screened before they are kept"},{"name":"fiat-fx","description":"Fiat accounts: the corridors (countries, currencies, purposes of payment) and FX quotes"},{"name":"fiat-balances","description":"Fiat accounts: a profile's multi-currency balances, their movements, top-ups from its own bank or card, withdrawals to its own bank and conversions between its balances"},{"name":"fiat-virtual-accounts","description":"Fiat accounts: virtual bank accounts a profile is paid into, their application, funding instructions, balance and movements"},{"name":"fiat-transfers","description":"Fiat accounts: transfers from a profile to its beneficiaries, and the documents they carry"},{"name":"fiat-me","description":"Fiat accounts: the signed-in end user's own profile and money"},{"name":"bank-ramp-iban","description":"The customer's euro IBAN with the bank ramp: ask for it, move it to another linked address, and the deposit instructions a payer follows"},{"name":"operations","description":"The operations the money routes start, with their public state"},{"name":"inbound-transfers","description":"The transfers into the tenant's EVM wallets from any address, read from the chain"},{"name":"reconciliation","description":"The tenant's wallets' balances against the Hub's records, at a block"},{"name":"reports","description":"Asynchronous reports of the tenant's movements, balances, addresses and approvals, in CSV or JSON, with signed download links"},{"name":"fees","description":"Fee levels of a chain, the most a wallet can send, and address checks"},{"name":"accounts","description":"The tenant's accounts: containers of its users' wallets on any chain, with the tenant's own customer reference, tags and users; the reverse lookup of an address; bulk creation"},{"name":"assets","description":"The asset and chain registry: the tenant's assets on every chain and network with their keys, custom assets registered by their contract (read on its chain), the tenant's own metadata, and a check of an asset against its contract"},{"name":"structures","description":"The tenant's account structure per network: segregated (one account per customer, nothing moves by itself) or omnibus — per-customer collection accounts, a treasury, a withdrawal pool, sweeps per policy, and the sub-ledger of each customer's balance reconciled with the chain"},{"name":"address-book","description":"The tenant's address book: its own wallets, external addresses and contracts its operations may send to — each added under an approval, active after a cooling period, an external one optionally proven by its owner's signature; one-time addresses off unless switched on through the tenant's quorum"},{"name":"gas-station","description":"The tenant's Gas Station: per chain and asset, a threshold, a target, caps and a maximum gas price for topping up its wallets from a funding wallet whose key is kept in a hardware security module; the top-ups and their alarms. Covers a tenant only once Aurea moves it to the station"},{"name":"policies","description":"The tenant's signing policy: versioned policy sets, validated, simulated on the tenant's history and published through the quorum. Evaluated and logged, not enforced; enforced for an institutional tenant (refusals POLICY_*; approvals: the approvals tag)"},{"name":"quorum","description":"The tenant's quorum: its own administrators' changes of users and roles, credentials and secrets, and custody, observed or held for another administrator's approval (where Aurea enables it; enforced for an institutional tenant)"},{"name":"approvals","description":"The operations an institutional tenant's policy holds for approval: the approvers' keys (ES256), inbox and signed decisions"},{"name":"groups","description":"The tenant's groups of users: named sets its policy rules can name as initiators, sources, approvers and designated signers (resolved to their members where the platform turned groups on). A group grants no permission"},{"name":"aggregated-transactions","description":"Unified transaction feed combining blockchain and bank ramp transactions"},{"name":"notifications","description":"Push notification device token management"},{"name":"swap-routes","description":"Swap route configuration endpoints"},{"name":"dapps","description":"dApp browser endpoints for the mobile dApp browser"},{"name":"gnosis","description":"Gnosis Pay banking integration"},{"name":"aave","description":"Aave yield operations (Lumen savings product)"},{"name":"lending","description":"Lending: EUR.e supplied to a lending pool from the user's wallets, its positions and rate history (the routes of /v1/aave/* under a neutral name)"},{"name":"cards","description":"Payment cards: the user's cards, their transactions and reveal token, activate, freeze, unfreeze, void (the card routes of /v1/gnosis/cards/* under a neutral name)"},{"name":"earn","description":"Earn: the yield products a tenant offers (Lumen first), deposits and withdrawals from custodial, client-side and MPC wallets"},{"name":"tokenized-assets","description":"Tokenized Assets: tokenized shares, ETFs and portfolios a tenant offers. Contact us for details: https://www.aureahub.com/contact"},{"name":"portfolio","description":"Portfolio performance"},{"name":"agent-payments","description":"Agentic Payments — AI agents, spend policies, mandates, policy-checked executions, commerce (Product A widget / Product B treasury), API keys, and webhooks. SDK: @aureahub/agent-pay."},{"name":"sandbox","description":"Sandbox testing endpoints"},{"name":"health","description":"Health check endpoints"}]}