{"openapi": "3.0.3", "info": {"title": "VATEX Pay Sandbox API", "version": "1.1.0", "description": "Consultas e cria\u00e7\u00e3o de cobran\u00e7as por empresa, somente sandbox. Sem d\u00e9bito por API."}, "servers": [{"url": "http://127.0.0.1:18080/api/integrations/v1"}], "tags": [{"name": "approvals", "description": "Guia: docs/APPROVALS.md"}, {"name": "limits", "description": "Guia: docs/LIMITS.md"}, {"name": "identity", "description": "Guia: docs/IDENTITY.md"}, {"name": "customers", "description": "Guia: docs/CUSTOMERS.md"}, {"name": "ledger", "description": "Guia: docs/LEDGER.md"}, {"name": "wallets", "description": "Guia: docs/WALLETS.md"}, {"name": "transfers", "description": "Guia: docs/TRANSFERS.md"}, {"name": "exchange", "description": "Guia: docs/EXCHANGE.md"}, {"name": "fiat", "description": "Guia: docs/FIAT-MOCK.md"}, {"name": "crypto", "description": "Guia: docs/CRYPTO.md"}, {"name": "lightning", "description": "Guia: docs/LIGHTNING.md"}, {"name": "business", "description": "Guia: docs/BUSINESS.md"}, {"name": "merchant", "description": "Guia: docs/MERCHANT.md"}, {"name": "developers", "description": "Guia: docs/DEVELOPER-API.md"}, {"name": "compliance", "description": "Guia: docs/COMPLIANCE.md"}, {"name": "operations", "description": "Guia: docs/OPERATIONS-SUPPORT.md"}, {"name": "reconciliation", "description": "Guia: docs/RECONCILIATION.md"}, {"name": "integrations", "description": "Guia: docs/DEVELOPER-API.md"}, {"name": "foundation", "description": "Guia: docs/OPERATIONS.md"}], "paths": {"/wallets": {"get": {"operationId": "integrations_api_integrations_v1_wallets_get", "tags": ["integrations"], "summary": "Consulta de integra\u00e7\u00e3o: wallets", "description": "Chave da pr\u00f3pria empresa, ativa e com scope; titular ativo e PJ aprovado. Sem filtros/corpo. Links/eventos limitados aos \u00faltimos 50. Registra DeveloperLog. Par\u00e2metros de consulta n\u00e3o podem ser repetidos, mesmo com valores iguais.", "security": [{"PartnerKey": []}], "x-guide": "docs/DEVELOPER-API.md", "x-authentication": "bearer", "responses": {"200": {"description": "Resultado local. Consulta, conclus\u00e3o ou repeti\u00e7\u00e3o aceita.", "content": {"application/json": {"schema": {"type": "object", "properties": {"wallets": {"type": "array", "items": {"$ref": "#/components/schemas/Object"}}, "simulated": {"type": "boolean"}, "request_id": {"type": "string", "format": "uuid"}}, "required": ["wallets", "simulated", "request_id"]}}}, "headers": {"X-Request-ID": {"description": "UUID gerado no servidor para correla\u00e7\u00e3o.", "schema": {"type": "string", "format": "uuid"}}}}, "400": {"description": "Entrada inv\u00e1lida. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Credenciais, sess\u00e3o ou desafio inv\u00e1lidos. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "403": {"description": "Permiss\u00e3o, CSRF, fator ou assinatura recusados. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Recurso inexistente ou n\u00e3o acess\u00edvel. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "M\u00e9todo n\u00e3o permitido. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Conflito de vers\u00e3o, estado ou idempot\u00eancia. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Corpo acima de 16 KiB. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "414": {"description": "Caminho/query excessivo. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Corpo comprimido n\u00e3o aceito. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "422": {"description": "Limite ou regra de neg\u00f3cio. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Limite de chamadas; respeite Retry-After. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}, "headers": {"Retry-After": {"schema": {"type": "string"}, "description": "Segundos at\u00e9 nova tentativa."}}}, "500": {"description": "Falha interna gen\u00e9rica. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Depend\u00eancia indispon\u00edvel ou API de neg\u00f3cio bloqueada em staging. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "x-required-scope": "wallets:read"}}, "/links": {"get": {"operationId": "integrations_api_integrations_v1_links_get", "tags": ["integrations"], "summary": "Consulta de integra\u00e7\u00e3o: links", "description": "Chave da pr\u00f3pria empresa, ativa e com scope; titular ativo e PJ aprovado. Sem filtros/corpo. Links/eventos limitados aos \u00faltimos 50. Registra DeveloperLog. links[].receipt inclui pricing conforme MerchantReceipt; somente merchant:read, sem ampliar autoriza\u00e7\u00e3o. Par\u00e2metros de consulta n\u00e3o podem ser repetidos, mesmo com valores iguais.", "security": [{"PartnerKey": []}], "x-guide": "docs/DEVELOPER-API.md", "x-authentication": "bearer", "responses": {"200": {"description": "Resultado local. Consulta, conclus\u00e3o ou repeti\u00e7\u00e3o aceita.", "content": {"application/json": {"schema": {"type": "object", "properties": {"links": {"type": "array", "items": {"$ref": "#/components/schemas/Object"}}, "simulated": {"type": "boolean"}, "request_id": {"type": "string", "format": "uuid"}}, "required": ["links", "simulated", "request_id"]}}}, "headers": {"X-Request-ID": {"description": "UUID gerado no servidor para correla\u00e7\u00e3o.", "schema": {"type": "string", "format": "uuid"}}}}, "400": {"description": "Entrada inv\u00e1lida. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Credenciais, sess\u00e3o ou desafio inv\u00e1lidos. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "403": {"description": "Permiss\u00e3o, CSRF, fator ou assinatura recusados. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Recurso inexistente ou n\u00e3o acess\u00edvel. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "M\u00e9todo n\u00e3o permitido. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Conflito de vers\u00e3o, estado ou idempot\u00eancia. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Corpo acima de 16 KiB. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "414": {"description": "Caminho/query excessivo. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Corpo comprimido n\u00e3o aceito. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "422": {"description": "Limite ou regra de neg\u00f3cio. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Limite de chamadas; respeite Retry-After. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}, "headers": {"Retry-After": {"schema": {"type": "string"}, "description": "Segundos at\u00e9 nova tentativa."}}}, "500": {"description": "Falha interna gen\u00e9rica. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Depend\u00eancia indispon\u00edvel ou API de neg\u00f3cio bloqueada em staging. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "x-required-scope": "merchant:read"}}, "/events": {"get": {"operationId": "integrations_api_integrations_v1_events_get", "tags": ["integrations"], "summary": "Consulta de integra\u00e7\u00e3o: events", "description": "Chave da pr\u00f3pria empresa, ativa e com scope; titular ativo e PJ aprovado. Sem filtros/corpo. Links/eventos limitados aos \u00faltimos 50. Registra DeveloperLog. Par\u00e2metros de consulta n\u00e3o podem ser repetidos, mesmo com valores iguais.", "security": [{"PartnerKey": []}], "x-guide": "docs/DEVELOPER-API.md", "x-authentication": "bearer", "responses": {"200": {"description": "Resultado local. Consulta, conclus\u00e3o ou repeti\u00e7\u00e3o aceita.", "content": {"application/json": {"schema": {"type": "object", "properties": {"events": {"type": "array", "items": {"$ref": "#/components/schemas/Object"}}, "simulated": {"type": "boolean"}, "request_id": {"type": "string", "format": "uuid"}}, "required": ["events", "simulated", "request_id"]}}}, "headers": {"X-Request-ID": {"description": "UUID gerado no servidor para correla\u00e7\u00e3o.", "schema": {"type": "string", "format": "uuid"}}}}, "400": {"description": "Entrada inv\u00e1lida. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Credenciais, sess\u00e3o ou desafio inv\u00e1lidos. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "403": {"description": "Permiss\u00e3o, CSRF, fator ou assinatura recusados. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Recurso inexistente ou n\u00e3o acess\u00edvel. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "M\u00e9todo n\u00e3o permitido. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Conflito de vers\u00e3o, estado ou idempot\u00eancia. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Corpo acima de 16 KiB. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "414": {"description": "Caminho/query excessivo. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Corpo comprimido n\u00e3o aceito. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "422": {"description": "Limite ou regra de neg\u00f3cio. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Limite de chamadas; respeite Retry-After. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}, "headers": {"Retry-After": {"schema": {"type": "string"}, "description": "Segundos at\u00e9 nova tentativa."}}}, "500": {"description": "Falha interna gen\u00e9rica. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Depend\u00eancia indispon\u00edvel ou API de neg\u00f3cio bloqueada em staging. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "x-required-scope": "events:read"}}, "/links/create": {"post": {"operationId": "integrations_api_integrations_v1_links_create_post", "tags": ["integrations"], "summary": "Criar cobran\u00e7a Merchant por integra\u00e7\u00e3o", "description": "Somente Bearer: cookie/senha n\u00e3o autorizam; sem CSRF. Empresa e ator definidos pela chave, sem business_id ou par\u00e2metros na URL. Titular ativo/verificado e PJ aprovado inclusive no replay. Padr\u00f5es SINGLE_ASSET e ZERO. Mesmas regras Merchant de limites, precis\u00e3o, cota\u00e7\u00e3o, custos e 24 horas de validade. N\u00e3o debita nem reserva saldo. Idempot\u00eancia por empresa/UUID compartilhada com portal e demais chaves da empresa; mesma solicita\u00e7\u00e3o normalizada recupera link com situa\u00e7\u00e3o atual, diferente retorna 409. Link, evento, auditoria e log s\u00e3o at\u00f4micos. 10 chamadas por chave/rota/5 min; repetir tamb\u00e9m consome o limite. Guia docs/INTEGRATION-MERCHANT-CREATE.md. Par\u00e2metros de consulta n\u00e3o podem ser repetidos, mesmo com valores iguais. Objeto JSON UTF-8 de at\u00e9 16 KiB e 32 n\u00edveis de objetos/arrays; campos repetidos, n\u00fameros n\u00e3o finitos e surrogates isolados s\u00e3o recusados com 400, antes da opera\u00e7\u00e3o.", "security": [{"PartnerKey": []}], "x-guide": "docs/DEVELOPER-API.md", "x-authentication": "bearer", "responses": {"200": {"description": "Resultado local. Consulta, conclus\u00e3o ou repeti\u00e7\u00e3o aceita.", "content": {"application/json": {"schema": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "business_name": {"type": "string"}, "description": {"type": "string"}, "asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "status": {"type": "string", "enum": ["OPEN", "PAID", "CANCELLED", "EXPIRED"]}, "expires_at": {"type": "string", "format": "date-time"}, "simulated": {"type": "boolean"}, "payment_mode": {"type": "string", "enum": ["SINGLE_ASSET", "MULTI_ASSET"]}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"]}, "checkout_path": {"type": "string"}, "qr_path": {"type": "string"}, "request_id": {"type": "string", "format": "uuid"}}, "additionalProperties": false, "required": ["id", "business_name", "description", "asset", "amount", "status", "expires_at", "simulated", "payment_mode", "pricing_mode", "checkout_path", "qr_path", "request_id"]}}}, "headers": {"X-Request-ID": {"description": "UUID gerado no servidor para correla\u00e7\u00e3o.", "schema": {"type": "string", "format": "uuid"}}}}, "400": {"description": "Entrada inv\u00e1lida. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Credenciais, sess\u00e3o ou desafio inv\u00e1lidos. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "403": {"description": "Permiss\u00e3o, CSRF, fator ou assinatura recusados. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Recurso inexistente ou n\u00e3o acess\u00edvel. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "M\u00e9todo n\u00e3o permitido. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Conflito de vers\u00e3o, estado ou idempot\u00eancia. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Corpo acima de 16 KiB. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "414": {"description": "Caminho/query excessivo. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Corpo comprimido n\u00e3o aceito. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "422": {"description": "Limite ou regra de neg\u00f3cio. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Limite de chamadas; respeite Retry-After. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}, "headers": {"Retry-After": {"schema": {"type": "string"}, "description": "Segundos at\u00e9 nova tentativa."}}}, "500": {"description": "Falha interna gen\u00e9rica. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Depend\u00eancia indispon\u00edvel ou API de neg\u00f3cio bloqueada em staging. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "x-required-scope": "merchant:create", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "settlement_asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "description": {"type": "string", "minLength": 2, "maxLength": 120}, "idempotency_key": {"type": "string", "format": "uuid"}, "payment_mode": {"type": "string", "enum": ["SINGLE_ASSET", "MULTI_ASSET"]}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"]}}, "additionalProperties": false, "required": ["asset", "settlement_asset", "amount", "description", "idempotency_key"]}}}}, "x-json-input": {"encoding": "UTF-8", "root": "object", "maxBytes": 16384, "maxDepth": 32, "duplicateMembers": "REJECT", "nonFiniteNumbers": "REJECT", "loneSurrogates": "REJECT"}}}, "/exchange/quote": {"post": {"operationId": "integrations_api_integrations_v1_exchange_quote_post", "tags": ["integrations"], "summary": "Cota\u00e7\u00e3o indicativa por integra\u00e7\u00e3o", "description": "Cota\u00e7\u00e3o mock de 60s, n\u00e3o execut\u00e1vel, entidade independente do portal. Sem saldo, reserva, d\u00e9bito ou consumo di\u00e1rio financeiro; limite por opera\u00e7\u00e3o vigente e cem novas cota\u00e7\u00f5es/empresa/24h. Mesmo pedido normalizado recupera snapshot original, inclusive expirado. Empresa/carteiras PJ derivadas da chave; nenhum ID de titular/conta no corpo. Revalidar acesso, aprova\u00e7\u00e3o e revis\u00e3o PJ no replay. Logs por chamada; falha de auditoria/log desfaz cria\u00e7\u00e3o. Guia docs/INTEGRATION-EXCHANGE-QUOTE-SPEC.md. Par\u00e2metros de consulta n\u00e3o podem ser repetidos, mesmo com valores iguais. Objeto JSON UTF-8 de at\u00e9 16 KiB e 32 n\u00edveis de objetos/arrays; campos repetidos, n\u00fameros n\u00e3o finitos e surrogates isolados s\u00e3o recusados com 400, antes da opera\u00e7\u00e3o.", "security": [{"PartnerKey": []}], "x-guide": "docs/DEVELOPER-API.md", "x-authentication": "bearer", "responses": {"200": {"description": "Resultado local. Consulta, conclus\u00e3o ou repeti\u00e7\u00e3o aceita.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiExchangeQuote"}}}, "headers": {"X-Request-ID": {"description": "UUID gerado no servidor para correla\u00e7\u00e3o.", "schema": {"type": "string", "format": "uuid"}}}}, "400": {"description": "Entrada inv\u00e1lida. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Credenciais, sess\u00e3o ou desafio inv\u00e1lidos. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "403": {"description": "Permiss\u00e3o, CSRF, fator ou assinatura recusados. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Recurso inexistente ou n\u00e3o acess\u00edvel. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "405": {"description": "M\u00e9todo n\u00e3o permitido. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Conflito de vers\u00e3o, estado ou idempot\u00eancia. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Corpo acima de 16 KiB. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "414": {"description": "Caminho/query excessivo. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Corpo comprimido n\u00e3o aceito. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "422": {"description": "Limite ou regra de neg\u00f3cio. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Limite de chamadas; respeite Retry-After. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}, "headers": {"Retry-After": {"schema": {"type": "string"}, "description": "Segundos at\u00e9 nova tentativa."}}}, "500": {"description": "Falha interna gen\u00e9rica. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Depend\u00eancia indispon\u00edvel ou API de neg\u00f3cio bloqueada em staging. Quando aplic\u00e1vel \u00e0 opera\u00e7\u00e3o.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "x-required-scope": "exchange:quote", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"asset_in": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "asset_out": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Total de entrada incluindo tarifa; positivo. Precis\u00e3o USD 2, USDC 6, BTC 8; sem expoente, sinal ou milhar."}, "idempotency_key": {"type": "string", "format": "uuid"}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"], "default": "ZERO"}}, "additionalProperties": false, "required": ["asset_in", "asset_out", "amount", "idempotency_key"]}}}}, "x-json-input": {"encoding": "UTF-8", "root": "object", "maxBytes": 16384, "maxDepth": 32, "duplicateMembers": "REJECT", "nonFiniteNumbers": "REJECT", "loneSurrogates": "REJECT"}}}}, "components": {"schemas": {"Error": {"type": "object", "properties": {"error": {"type": "string"}, "message": {"type": "string"}, "request_id": {"type": "string", "format": "uuid"}}, "required": ["error"]}, "Object": {"type": "object", "additionalProperties": true, "description": "Objeto espec\u00edfico do m\u00f3dulo. Consulte o guia indicado; campos adicionais podem estar presentes."}, "Message": {"type": "object", "properties": {"message": {"type": "string"}}, "required": ["message"]}, "Money": {"type": "object", "properties": {"minor": {"type": "string", "pattern": "^-?[0-9]+$"}, "formatted": {"type": "string"}}, "required": ["minor", "formatted"]}, "Wallet": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "profile_kind": {"type": "string", "enum": ["PF", "PJ"]}, "asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "decimals": {"type": "integer"}, "balance": {"$ref": "#/components/schemas/Money"}, "outgoing_blocked": {"type": "boolean"}, "account_outgoing_blocked": {"type": "boolean"}, "global_outgoing_blocked": {"type": "boolean"}}, "required": ["id", "profile_kind", "asset", "decimals", "balance", "outgoing_blocked", "account_outgoing_blocked", "global_outgoing_blocked"]}, "User": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "name": {"type": "string"}, "email": {"type": "string", "format": "email"}, "role": {"type": "string"}, "mfa_enabled": {"type": "boolean"}, "permissions": {"type": "array", "items": {"type": "string"}}}, "required": ["id", "name", "email", "role", "mfa_enabled", "permissions"]}, "Receipt": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "journal_id": {"type": "string", "format": "uuid"}, "status": {"type": "string"}, "simulated": {"type": "boolean", "enum": [true]}}, "additionalProperties": true}, "ProfilePF": {"type": "object", "properties": {"name": {"type": "string", "minLength": 2, "maxLength": 120}, "document_ref": {"type": "string", "pattern": "^TESTE-[A-Z0-9-]{3,40}$"}, "country": {"type": "string", "enum": ["BR", "SV", "US"]}, "phone": {"type": "string", "pattern": "^\\+999[0-9]{6,12}$"}, "synthetic_data": {"type": "boolean", "enum": [true]}, "birth_date": {"type": "string", "format": "date", "description": "Data fict\u00edcia entre 1900-01-01 e hoje."}}, "additionalProperties": false, "required": ["name", "document_ref", "country", "phone", "synthetic_data", "birth_date"]}, "ProfilePJ": {"type": "object", "properties": {"name": {"type": "string", "minLength": 2, "maxLength": 120}, "document_ref": {"type": "string", "pattern": "^TESTE-[A-Z0-9-]{3,40}$"}, "country": {"type": "string", "enum": ["BR", "SV", "US"]}, "phone": {"type": "string", "pattern": "^\\+999[0-9]{6,12}$"}, "synthetic_data": {"type": "boolean", "enum": [true]}, "representative": {"type": "object", "properties": {"name": {"type": "string", "minLength": 2, "maxLength": 120}, "document_ref": {"type": "string", "pattern": "^TESTE-[A-Z0-9-]{3,40}$"}}, "additionalProperties": false, "required": ["name", "document_ref"]}, "beneficial_owners": {"type": "array", "items": {"type": "object", "properties": {"name": {"type": "string", "minLength": 2, "maxLength": 120}, "document_ref": {"type": "string", "pattern": "^TESTE-[A-Z0-9-]{3,40}$"}, "percentage": {"type": "string", "pattern": "^[0-9]{1,3}(\\.[0-9]{1,2})?$"}}, "additionalProperties": false, "required": ["name", "document_ref", "percentage"]}, "minItems": 1, "maxItems": 10, "description": "Refer\u00eancias distintas; percentuais positivos que somam 100."}}, "additionalProperties": false, "required": ["name", "document_ref", "country", "phone", "synthetic_data", "representative", "beneficial_owners"]}, "KnownDevice": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "label": {"type": "string", "maxLength": 40}, "status": {"type": "string", "enum": ["ACTIVE", "REVOKED", "EXPIRED", "SECURITY_CHANGED"]}, "current": {"type": "boolean"}, "created_at": {"type": "string", "format": "date-time"}, "last_seen_at": {"type": "string", "format": "date-time"}, "expires_at": {"type": "string", "format": "date-time"}, "revoked_at": {"type": "string", "format": "date-time", "nullable": true}}, "additionalProperties": false, "description": "Reconhecimento informativo por cookie. N\u00e3o dispensa senha/MFA e n\u00e3o identifica hardware.", "required": ["id", "label", "status", "current", "created_at", "last_seen_at", "expires_at", "revoked_at"]}, "AccessNotice": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "label": {"type": "string", "maxLength": 40}, "kind": {"type": "string", "enum": ["KNOWN_BROWSER", "UNRECOGNIZED_BROWSER"]}, "created_at": {"type": "string", "format": "date-time"}, "read_at": {"type": "string", "format": "date-time", "nullable": true}}, "additionalProperties": false, "required": ["id", "label", "kind", "created_at", "read_at"]}, "KnownDeviceList": {"type": "object", "properties": {"devices": {"type": "array", "items": {"$ref": "#/components/schemas/KnownDevice"}, "maxItems": 50}, "next_cursor": {"type": "string", "nullable": true, "maxLength": 2048}, "limit": {"type": "integer", "enum": [50]}}, "additionalProperties": false, "required": ["devices", "next_cursor", "limit"]}, "AccessNoticeList": {"type": "object", "properties": {"access_notices": {"type": "array", "items": {"$ref": "#/components/schemas/AccessNotice"}, "maxItems": 50}, "next_cursor": {"type": "string", "nullable": true, "maxLength": 2048}, "limit": {"type": "integer", "enum": [50]}}, "additionalProperties": false, "required": ["access_notices", "next_cursor", "limit"]}, "KnownDeviceRemember": {"type": "object", "properties": {"device": {"$ref": "#/components/schemas/KnownDevice"}, "replayed": {"type": "boolean"}, "remembered": {"type": "boolean"}}, "additionalProperties": false, "required": ["device", "replayed", "remembered"]}, "ConversionTotals": {"type": "object", "properties": {"count": {"type": "integer", "minimum": 0}, "amount_in": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "amount_out": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "fee": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "spread": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "amount_in_minor": {"type": "string", "pattern": "^[0-9]+$"}, "amount_out_minor": {"type": "string", "pattern": "^[0-9]+$"}, "fee_minor": {"type": "string", "pattern": "^[0-9]+$"}, "spread_minor": {"type": "string", "pattern": "^[0-9]+$"}}, "additionalProperties": false, "description": "Totais exatos por par de ativos, em strings. amount_in e fee no ativo de origem; amount_out e spread no destino. D\u00e9bito j\u00e1 inclui tarifa e recebido j\u00e1 desconta spread. N\u00e3o somar ativos diferentes nem interpretar como saldo.", "required": ["count", "amount_in", "amount_out", "fee", "spread", "amount_in_minor", "amount_out_minor", "fee_minor", "spread_minor"]}, "ConversionSummary": {"type": "object", "properties": {"groups": {"type": "array", "items": {"type": "object", "properties": {"asset_in": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "asset_out": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "original": {"$ref": "#/components/schemas/ConversionTotals"}, "reversed": {"$ref": "#/components/schemas/ConversionTotals"}, "unreversed": {"$ref": "#/components/schemas/ConversionTotals"}}, "additionalProperties": false, "required": ["asset_in", "asset_out", "original", "reversed", "unreversed"]}, "maxItems": 6}, "filters": {"type": "object", "properties": {"asset_in": {"type": "string", "enum": ["ALL", "USD", "USDC", "BTC"]}, "asset_out": {"type": "string", "enum": ["ALL", "USD", "USDC", "BTC"]}, "from": {"type": "string", "description": "YYYY-MM-DD ou vazio."}, "to": {"type": "string", "description": "YYYY-MM-DD ou vazio."}}, "additionalProperties": false, "required": ["asset_in", "asset_out", "from", "to"]}, "captured_at": {"type": "string", "format": "date-time"}, "order_count": {"type": "integer", "minimum": 0}, "reversed_count": {"type": "integer", "minimum": 0}, "period_basis": {"type": "string", "enum": ["original-settlement"]}, "simulated": {"type": "boolean", "enum": [true]}}, "additionalProperties": false, "required": ["groups", "filters", "captured_at", "order_count", "reversed_count", "period_basis", "simulated"]}, "LightningPayment": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "status": {"type": "string", "enum": ["SUCCEEDED", "FAILED"]}, "journal_id": {"type": "string", "format": "uuid", "nullable": true}, "created_at": {"type": "string", "format": "date-time"}, "events": {"type": "array", "items": {"type": "string", "format": "uuid"}, "maxItems": 20, "description": "At\u00e9 20 primeiros IDs de entregas, ordenados por cria\u00e7\u00e3o/ID; n\u00e3o representa toda a trilha de auditoria."}}, "nullable": true, "additionalProperties": false, "required": ["id", "status", "journal_id", "created_at", "events"]}, "LightningMetadata": {"type": "object", "properties": {"representation": {"type": "string", "enum": ["DERIVED"]}, "network": {"type": "string", "enum": ["NONE"]}, "scenario": {"type": "string", "enum": ["success", "reject", "timeout"]}, "profile_revision": {"type": "integer", "minimum": 1}}, "additionalProperties": false, "description": "Metadados derivados de fatos persistidos e do contrato mock. N\u00e3o s\u00e3o metadados recebidos de um provedor externo.", "required": ["representation", "network", "scenario", "profile_revision"]}, "LightningInvoice": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "account_id": {"type": "string", "format": "uuid"}, "direction": {"type": "string", "enum": ["RECEIVE", "PAY"]}, "asset": {"type": "string", "enum": ["BTC"]}, "amount": {"type": "string", "pattern": "^[0-9]+\\.[0-9]{8}$"}, "satoshis": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "fee": {"type": "string", "enum": ["0.00000000"]}, "code": {"type": "string", "pattern": "^MOCK-LN-[A-F0-9]{32}$"}, "reference": {"type": "string", "pattern": "^LIGHTNING:[A-F0-9]{32}$"}, "scenario": {"type": "string", "enum": ["success", "reject", "timeout"]}, "created_at": {"type": "string", "format": "date-time"}, "expires_at": {"type": "string", "format": "date-time"}, "expired": {"type": "boolean"}, "simulated": {"type": "boolean", "enum": [true]}, "replayed": {"type": "boolean"}, "payment": {"$ref": "#/components/schemas/LightningPayment"}, "record_version": {"type": "string", "enum": ["lightning-record-v1"]}, "idempotency_key": {"type": "string", "format": "uuid"}, "updated_at": {"type": "string", "format": "date-time", "description": "\u00daltimo fato da opera\u00e7\u00e3o: maior entre cria\u00e7\u00e3o da invoice e do Payment. Consultas, reentregas, expira\u00e7\u00e3o e estorno n\u00e3o mudam esse campo."}, "status": {"type": "string", "enum": ["PENDING", "SUCCEEDED", "FAILED"]}, "source": {"type": "string", "pattern": "^MOCK-LN-(EXTERNAL|BTC-[A-F0-9]{32})$"}, "destination": {"type": "string", "pattern": "^MOCK-LN-(EXTERNAL|BTC-[A-F0-9]{32})$"}, "provider": {"type": "string", "enum": ["mock-lightning-v1"]}, "metadata": {"$ref": "#/components/schemas/LightningMetadata"}, "audit_subjects": {"type": "object", "properties": {"invoice_id": {"type": "string", "format": "uuid"}, "payment_id": {"type": "string", "format": "uuid", "nullable": true}}, "additionalProperties": false, "required": ["invoice_id", "payment_id"]}}, "additionalProperties": true, "description": "Registro pr\u00f3prio versionado, compat\u00edvel com invoices antigas. PENDING significa aus\u00eancia de resultado, inclusive se expired=true. Refer\u00eancias de origem/destino s\u00e3o fict\u00edcias; n\u00e3o s\u00e3o endere\u00e7os Lightning. audit_subjects aponta os sujeitos em AuditEvent, sem divulgar seus registros.", "required": ["id", "account_id", "direction", "asset", "amount", "satoshis", "fee", "code", "reference", "scenario", "created_at", "expires_at", "expired", "simulated", "replayed", "payment", "record_version", "idempotency_key", "updated_at", "status", "source", "destination", "provider", "metadata", "audit_subjects"]}, "LightningHistory": {"type": "object", "properties": {"invoices": {"type": "array", "items": {"$ref": "#/components/schemas/LightningInvoice"}, "maxItems": 20}, "limit": {"type": "integer", "enum": [20]}, "simulated": {"type": "boolean", "enum": [true]}}, "additionalProperties": false, "required": ["invoices", "limit", "simulated"]}, "BusinessDashboard": {"type": "object", "properties": {"business_id": {"type": "string", "format": "uuid"}, "captured_at": {"type": "string", "format": "date-time"}, "filters": {"type": "object", "properties": {"from": {"type": "string"}, "to": {"type": "string"}}, "additionalProperties": false, "required": ["from", "to"]}, "wallets": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "balance_at_capture": {"$ref": "#/components/schemas/Money"}, "period": {"type": "object", "properties": {"opening": {"$ref": "#/components/schemas/Money"}, "credits": {"$ref": "#/components/schemas/Money"}, "debits": {"$ref": "#/components/schemas/Money"}, "closing": {"$ref": "#/components/schemas/Money"}}, "additionalProperties": false, "required": ["opening", "credits", "debits", "closing"]}}, "additionalProperties": false, "required": ["id", "asset", "balance_at_capture", "period"]}}, "operations": {"type": "object", "properties": {"payments": {"type": "integer", "minimum": 0}, "conversions": {"type": "integer", "minimum": 0}, "reversals": {"type": "integer", "minimum": 0}}, "additionalProperties": false, "required": ["payments", "conversions", "reversals"]}, "team": {"type": "object", "properties": {"active_members": {"type": "integer", "minimum": 0}, "owners": {"type": "integer", "enum": [1]}}, "additionalProperties": false, "required": ["active_members", "owners"]}, "simulated": {"type": "boolean", "enum": [true]}}, "additionalProperties": false, "required": ["business_id", "captured_at", "filters", "wallets", "operations", "simulated"]}, "MerchantPricing": {"type": "object", "properties": {"policy": {"type": "string", "enum": ["merchant-zero-v1", "merchant-multi-zero-v1", "merchant-fees-v1"]}, "representation": {"type": "string", "enum": ["DERIVED"]}, "source_asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "settlement_asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount_in": {"$ref": "#/components/schemas/Money"}, "fee": {"$ref": "#/components/schemas/Money"}, "total_debit": {"$ref": "#/components/schemas/Money"}, "gross_amount_out": {"$ref": "#/components/schemas/Money"}, "spread": {"$ref": "#/components/schemas/Money"}, "net_amount_out": {"$ref": "#/components/schemas/Money"}, "rate_numerator": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "rate_denominator": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "rounding": {"type": "string", "enum": ["DOWN"]}, "input_rounding": {"type": "string", "enum": ["UP"]}, "cost_rounding": {"type": "string", "enum": ["UP"]}, "fee_bps": {"type": "integer", "enum": [50]}, "spread_bps": {"type": "integer", "enum": [0, 100]}}, "additionalProperties": false, "description": "Valores originais; ZERO preserva pol\u00edticas hist\u00f3ricas e FEES_V1 usa merchant-fees-v1. amount_in, fee e total_debit em source_asset; bruto, spread e l\u00edquido em settlement_asset. Taxas fict\u00edcias: BTC=60000 USD, USDC=1 USD. Em FEES_V1, fee=ceil(principal*0,5%) soma ao d\u00e9bito; spread=ceil(bruto*1%) reduz o destino somente com convers\u00e3o. ZERO mant\u00e9m custos zero. Sem reescrever registros antigos.", "required": ["policy", "representation", "source_asset", "settlement_asset", "amount_in", "fee", "total_debit", "gross_amount_out", "spread", "net_amount_out", "rate_numerator", "rate_denominator", "rounding"]}, "MerchantLightningInvoice": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "link_id": {"type": "string", "format": "uuid"}, "source": {"type": "string", "format": "uuid"}, "code": {"type": "string", "pattern": "^MOCK-MERCHANT-LN-[A-F0-9]{32}$"}, "provider": {"type": "string", "enum": ["mock-lightning-v1"]}, "asset": {"type": "string", "enum": ["BTC"]}, "satoshis": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "scenario": {"type": "string", "enum": ["success", "reject", "timeout"]}, "status": {"type": "string", "enum": ["PENDING", "SUCCEEDED", "FAILED"]}, "expired": {"type": "boolean"}, "created_at": {"type": "string", "format": "date-time"}, "expires_at": {"type": "string", "format": "date-time"}, "event_id": {"type": "string", "format": "uuid", "nullable": true}, "payment_id": {"type": "string", "format": "uuid", "nullable": true}, "replayed": {"type": "boolean"}, "simulated": {"type": "boolean", "enum": [true]}}, "additionalProperties": false, "description": "Invoice fict\u00edcia do pagador Merchant, financiada por sua carteira BTC. PENDING com expired=true n\u00e3o confirma pagamento. N\u00e3o \u00e9 BOLT11 nem recebimento externo.", "required": ["id", "link_id", "source", "code", "provider", "asset", "satoshis", "scenario", "status", "expired", "created_at", "expires_at", "event_id", "payment_id", "replayed", "simulated"]}, "MerchantLightningReceipt": {"type": "object", "properties": {"invoice_id": {"type": "string", "format": "uuid"}, "provider": {"type": "string", "enum": ["mock-lightning-v1"]}, "status": {"type": "string", "enum": ["SUCCEEDED"]}, "event_id": {"type": "string", "format": "uuid"}}, "nullable": true, "additionalProperties": false, "required": ["invoice_id", "provider", "status", "event_id"]}, "MerchantLightningFailed": {"type": "object", "properties": {"status": {"type": "string", "enum": ["FAILED"]}, "simulated": {"type": "boolean", "enum": [true]}, "replayed": {"type": "boolean"}, "lightning": {"$ref": "#/components/schemas/MerchantLightningInvoice"}, "message": {"type": "string"}}, "additionalProperties": false, "required": ["status", "simulated", "replayed", "lightning", "message"]}, "MerchantReceipt": {"type": "object", "properties": {"id": {"type": "string", "format": "uuid"}, "link_id": {"type": "string", "format": "uuid"}, "business_name": {"type": "string"}, "description": {"type": "string"}, "asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "settlement_asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "settlement_amount": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "journal_id": {"type": "string", "format": "uuid"}, "created_at": {"type": "string", "format": "date-time"}, "fee": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "status": {"type": "string", "enum": ["PAID"]}, "simulated": {"type": "boolean", "enum": [true]}, "replayed": {"type": "boolean"}, "pricing": {"$ref": "#/components/schemas/MerchantPricing"}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"]}, "payment_mode": {"type": "string", "enum": ["SINGLE_ASSET", "MULTI_ASSET"]}, "payment_asset": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "payment_amount": {"type": "string", "pattern": "^[0-9]+(\\.[0-9]+)?$", "description": "Valor decimal positivo como string, ponto decimal. Precis\u00e3o: USD 2, USDC 6, BTC 8; limites adicionais do m\u00f3dulo."}, "channel": {"type": "string", "enum": ["WALLET", "LIGHTNING_MOCK"]}, "lightning": {"$ref": "#/components/schemas/MerchantLightningReceipt"}}, "additionalProperties": false, "description": "Comprovante da opera\u00e7\u00e3o original. Estornos posteriores s\u00e3o lan\u00e7amentos separados e n\u00e3o reescrevem estes valores.", "required": ["id", "link_id", "business_name", "description", "asset", "amount", "settlement_asset", "settlement_amount", "journal_id", "created_at", "fee", "status", "simulated", "replayed", "pricing", "pricing_mode", "payment_mode", "payment_asset", "payment_amount", "channel", "lightning"]}, "MerchantPreview": {"type": "object", "properties": {"pricing": {"$ref": "#/components/schemas/MerchantPricing"}}, "additionalProperties": true, "description": "Campos existentes da cobran\u00e7a e pr\u00e9via assinada, acrescidos do detalhamento pricing. Validade de at\u00e9 60 segundos.", "required": ["pricing"]}, "ApiExchangeQuoteRequest": {"type": "object", "additionalProperties": false, "properties": {"asset_in": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "asset_out": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Total de entrada incluindo tarifa; positivo. Precis\u00e3o USD 2, USDC 6, BTC 8; sem expoente, sinal ou milhar."}, "idempotency_key": {"type": "string", "format": "uuid"}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"], "default": "ZERO"}}, "required": ["asset_in", "asset_out", "amount", "idempotency_key"]}, "ApiExchangeQuote": {"type": "object", "additionalProperties": false, "properties": {"id": {"type": "string", "format": "uuid"}, "asset_in": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "asset_out": {"type": "string", "enum": ["USD", "USDC", "BTC"]}, "amount_in": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "net_amount_in": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "gross_amount_out": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "amount_out": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "fee": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "spread": {"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "maxLength": 30, "description": "Decimal no ativo correspondente; precis\u00e3o e limites conferidos em runtime."}, "pricing_mode": {"type": "string", "enum": ["ZERO", "FEES_V1"]}, "fee_bps": {"type": "integer", "enum": [0, 50]}, "spread_bps": {"type": "integer", "enum": [0, 100]}, "rate_numerator": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "rate_denominator": {"type": "string", "pattern": "^[1-9][0-9]*$"}, "policy": {"type": "string", "enum": ["sandbox-fixed-v1"]}, "provider": {"type": "string", "enum": ["mock-liquidity-v1"]}, "reference": {"type": "string", "pattern": "^APIQUOTE:[0-9A-F]{32}$"}, "created_at": {"type": "string", "format": "date-time"}, "expires_at": {"type": "string", "format": "date-time"}, "expired": {"type": "boolean"}, "replayed": {"type": "boolean"}, "executable": {"type": "boolean", "enum": [false]}, "simulated": {"type": "boolean", "enum": [true]}, "request_id": {"type": "string", "format": "uuid"}}, "required": ["id", "asset_in", "asset_out", "amount_in", "net_amount_in", "gross_amount_out", "amount_out", "fee", "spread", "pricing_mode", "fee_bps", "spread_bps", "rate_numerator", "rate_denominator", "policy", "provider", "reference", "created_at", "expires_at", "expired", "replayed", "executable", "simulated", "request_id"]}}, "securitySchemes": {"Session": {"type": "apiKey", "in": "cookie", "name": "vatex_pay_session", "description": "Sess\u00e3o local; n\u00e3o \u00e9 chave de parceiro."}, "CsrfCookie": {"type": "apiKey", "in": "cookie", "name": "vatex_pay_csrf"}, "CsrfHeader": {"type": "apiKey", "in": "header", "name": "X-CSRFToken", "description": "Obter em GET /api/v1/csrf usando o mesmo cookie jar."}, "PartnerKey": {"type": "http", "scheme": "bearer", "bearerFormat": "vp_test_<id>.<secret>"}, "LightningSignature": {"type": "apiKey", "in": "header", "name": "X-Pay-Signature"}, "LightningTimestamp": {"type": "apiKey", "in": "header", "name": "X-Pay-Timestamp"}}}}