CriptoCore API v2 — Guia de integração Contrato: 2.0.0. Base: https://criptocore.net/api/v2 Documentação: https://criptocore.net/developers/ OpenAPI: https://criptocore.net/developers/openapi.json COMECE AQUI 1. Entre na sua conta CriptoCore e abra Desenvolvedores. 2. Crie uma chave com as permissões necessárias. Copie o token e o callback_secret: aparecem apenas uma vez. Armazene no backend, em um gerenciador de segredos. Não coloque no navegador, aplicativo público, URL ou repositório. 3. Use Authorization: Bearer cc_live_... e Content-Type: application/json. Não precisa de cookie, sessão de navegador, x-criptocore-client ou fingerprint. 4. Consulte GET /capabilities, GET /account, GET /balances e GET /assets. 5. Para pagar, envie operation a POST /quotes. Revise debit_micros e envie esse valor como max_debit_micros a POST /operations, com uma Idempotency-Key persistida pelo seu sistema. 6. Salve data.id antes de prosseguir. 202 é aceitação; acompanhe até a conclusão. Não há sandbox público. Operações usam saldo real. Consultas, cotações e webhook.test não transferem dinheiro. Não teste pagamentos automaticamente ao importar a coleção Postman. DISPONIBILIDADE A API disponibiliza o que o CriptoCore executa: Pix por chave, Pix copia e cola, boletos, emissão e recarga de cartões, depósitos de cripto suportados e extrato. Saques de cripto para carteira externa continuam indisponíveis: /withdrawals/crypto retorna 409 CRYPTO_WITHDRAWALS_UNAVAILABLE sem débito. /assets informa withdrawal_enabled=false. Não prometa essa funcionalidade a seus usuários. Dados sensíveis do cartão, bloqueio de cartões e gestão de credenciais continuam no painel. PERMISSÕES read: conta, saldo, tarifas, consultas/cotações, recursos e eventos. payments:write: criar operações de saída. cards:write: exigida junto de payments:write para emissão/recarga. deposits:write: obter endereço de depósito. webhooks:write: criar, atualizar, remover, testar webhooks e reenviar entregas. Revogação e expiração impedem novas chamadas. Operações já aceitas continuam sendo executadas e notificadas. Webhooks pertencem à conta; qualquer chave da conta com a permissão adequada pode gerenciá-los. WHITELIST OPCIONAL DE IP Configuração em Painel → Desenvolvedores, por conta, para todas as chaves. Desativada (padrão): qualquer IP pode iniciar saídas com uma chave válida e permissões suficientes. Ativada: somente IPv4/IPv6 cadastrados podem iniciar saídas. Outros recebem 403 IP_NOT_ALLOWED, antes de qualquer débito. Lista vazia não pode ser ativada. São até 32 IPs exatos, sem CIDR ou porta. A política vale para toda modalidade de saída, inclusive a rota reservada para saques cripto. Não bloqueia consultas, recebimentos ou entregas de eventos. Não torna a API anônima: autenticação, escopos, saldo, limites e bloqueios da conta continuam valendo. Cadastre o IP público de saída do seu servidor/NAT. O IP do navegador pode ser diferente. O servidor deriva o IP do proxy confiável; enviar X-Forwarded-For ou CF-Connecting-IP manualmente não permite escolher a origem. GET /account informa a política. Alterá-la exige a sessão do titular; uma chave de pagamentos não pode remover essa proteção. VALORES E COTAÇÕES cents: inteiro em centavos de BRL. 10000 = R$ 100,00. Saldo: micros de USDT. 1000000 = 1 USDT. available_micros, debit_micros e debited_micros são strings decimais. Use BigInt/Decimal. Campos legados explicitamente em camelCase (walletDeltaMicros, creditedMicros) são inteiros JSON. amount em depósitos é string decimal na moeda recebida. Não confunda com USDT ou BRL. max_debit_micros é obrigatório e inclui tarifas e spread. Uma cotação indicativa não congela a taxa. Se o valor ultrapassar o teto, retorna 409 DEBIT_CEILING_EXCEEDED e reverte toda a operação. Para boletos, consulte POST /boletos/quote; use data.quoteId como operation.quoteId e data.cents como operation.cents. Para Pix copia e cola, consulte /pix/decode; se cents não for null, respeite esse valor. IDEMPOTÊNCIA E RETOMADA POST /operations exige Idempotency-Key com 16–128 caracteres: A-Z, a-z, 0-9, hífen ou sublinhado. Use um UUID ou um identificador persistente por intenção de pagamento. Mesma chave e payload semanticamente igual (ordem dos campos JSON não importa) devolvem a mesma operação, sem outro débito, mesmo sob concorrência. Outro corpo com a mesma chave retorna 409 IDEMPOTENCY_CONFLICT. O escopo é a conta, inclusive entre suas chaves de API. A associação persiste sem expiração automática. Erros anteriores ao commit não criam a operação. Em timeout, conexão interrompida ou 5xx, primeiro consulte por ID ou reference; repita o POST usando a MESMA chave e o MESMO corpo. Nunca gere uma nova chave automaticamente para uma tentativa de resultado desconhecido. Resposta nova: 202, Location: /api/v2/operations/{id}, Idempotent-Replayed: false. Repetição: 200, Idempotent-Replayed: true. reference é uma referência do seu sistema para busca; não substitui Idempotency-Key e não precisa ser única. ESTADOS E POLLING GET /operations/{id} retorna o estado financeiro atualizado: processing: aceito/em processamento; continue consultando. review: resposta do processador exige conciliação; continue consultando. Não refaça o pagamento. completed: transações concluídas. Consulte E2E e datas em transactions. failed: uma ou mais transações falharam. Consulte failureReason, refund e refundedMicros. Emissão de cartão com recarga pode ter sucesso parcial; examine cada transação. Uma devolução posterior pode atualizar uma operação concluída. debited_micros representa o débito original; o saldo atual vem de /balances e devoluções estão no extrato. Respeite Retry-After: 5 nas consultas individuais. A listagem de operações usa a última fotografia do worker; o detalhe atualiza imediatamente. O worker observa operações pendentes aproximadamente a cada 5s e concluídas a cada 5min para possíveis devoluções. Paginação comum: limit=1..100 (padrão 25), cursor=next_cursor. Ordem decrescente por ID. Eventos: GET /events?after=0&limit=100, ordem crescente por sequence. Persista pagination.next_cursor só depois de processar os eventos. Se has_more=true, busque a próxima página sem esperar; quando falso, espere pelo menos 5s. next_cursor permanece igual quando não há novidade. WEBHOOKS OPCIONAIS CRUD completo: POST/GET /webhooks, GET/PATCH/DELETE /webhooks/{id}. Eventos: operation.created, operation.updated, deposit.updated, webhook.test. operation.* cobre operações criadas pela API. deposit.updated cobre alterações observadas nos depósitos da conta após ativar integrações. Alterações muito rápidas podem resultar em uma notificação com o estado final. Confirmações de blocos intermediárias ficam disponíveis por polling. POST /webhooks/{id}/test enfileira um evento de teste sem movimentar saldo. POST /webhooks/{id}/rotate-secret entrega um segredo novo uma única vez. Até 10 endpoints por conta; até 10 chaves ativas por conta. Cadastre URLs HTTPS públicas na porta 443, sem credenciais embutidas ou fragmentos. Hosts locais, privados, metadados de nuvem e destinos cujo DNS resolve para IP privado são recusados. DNS é revalidado em cada tentativa. Redirecionamentos não são seguidos. O certificado TLS deve ser válido. Desativar/remover cancela entregas pendentes. Alterar a URL cancela entregas para a URL anterior. Uma entrega já em trânsito pode chegar. Reativar não reenvia o histórico automaticamente; use polling ou reenviamento de uma entrega cancelada. CALLBACK POR OPERAÇÃO Envie callback_url no mesmo nível de operation em POST /operations. Não exige cadastrar webhook. Recebe operation.created e operation.updated usando o callback_secret exibido quando a chave foi criada. O segredo é capturado com a operação: revogar a chave não cancela callbacks de operações já aceitas. A URL do callback não é editável depois do aceite. Webhook e callback podem coexistir. O mesmo event.id pode chegar a ambos; implemente deduplicação compartilhada se ambos acionarem o mesmo fluxo de negócio. Sem callback_url e sem webhooks, tudo funciona por polling. ASSINATURA E ENTREGA Cabeçalhos: X-CriptoCore-Signature: t=,v1= X-CriptoCore-Delivery-Id identifica a entrega ao destino. Assinatura = HMAC-SHA256(segredo, timestamp + "." + corpo JSON cru em UTF-8). Use o segredo literal ccwh_..., sem decodificar o prefixo. Faça comparação em tempo constante; rejeite timestamp mais de 300 segundos distante do relógio atual. Sincronize o relógio do receptor. Leia os bytes originais antes de qualquer JSON parser: JSON.stringify do objeto recebido pode mudar a assinatura. Depois de validar, persista event.id em índice único e enfileire o processamento local. Responda 2xx em até 10s. Processamento do negócio ocorre depois da persistência. Repetições válidas também recebem 2xx. Não há garantia de ordem ou de entrega única. O contrato é de tentativas com possibilidade de repetição; após esgotar o ciclo, a entrega fica failed e precisa de retry manual ou reconciliação por polling. Falhas de conexão e respostas fora de 2xx geram até sete novas tentativas após 30s, 2min, 10min, 30min, 2h, 6h e 24h, em relação à tentativa anterior. O event.id permanece estável e a assinatura usa um timestamp novo a cada tentativa. GET /deliveries?event_id=... mostra o histórico operacional. POST /deliveries/{id}/retry aceita failed/canceled e reinicia o ciclo. Não reenfileira entregas em andamento nem já confirmadas. Um webhook removido/inativo não aceita retry. Segredos rotacionados podem coexistir por 5min no receptor para aceitar entregas antigas em trânsito. LIMITES, ERROS E VERSIONAMENTO 120 requisições/minuto por conta, compartilhadas entre chaves; até 30 novas operações/minuto. Até 300 requisições/minuto por IP no serviço. Consultas de boleto: 20/dia por conta. Respostas 429 informam Retry-After; aplique espera com jitter, sem loop agressivo. X-RateLimit-Limit/Remaining/Reset descrevem o limite da conta nas chamadas autenticadas. Dinheiro: valem os mesmos limites diários por identidade, saldo, tarifas, disponibilidade e conciliação do painel. /account informa o limite vigente; /quotes calcula o custo. Erros JSON: {"error":{"code":"IP_NOT_ALLOWED","message":"...","request_id":"..."}}. 400 validação; 401 chave; 403 permissão/IP/conta; 404 inexistente ou recurso alheio; 409 conflito; 422 operação recusada; 429 limite; 503 indisponibilidade. 5xx de resultado incerto exige consultar e preservar a Idempotency-Key. Chaves não autenticam as rotas privadas /api/v1 do painel. A API de integração é exclusivamente /api/v2. Não reutilize sessões web em automações. IDs são opacos. Campos adicionais podem ser acrescentados sem alterar a versão; clientes devem ignorá-los. Campos obrigatórios e seus significados não mudam dentro de v2. Requisições com campos desconhecidos são rejeitadas. EXEMPLO CURL export CRIPTOCORE_API_KEY='SUA_CHAVE' curl --fail-with-body https://criptocore.net/api/v2/balances \ -H "Authorization: Bearer $CRIPTOCORE_API_KEY" curl --fail-with-body https://criptocore.net/api/v2/quotes \ -H "Authorization: Bearer $CRIPTOCORE_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"operation":{"type":"pix","cents":10000,"key":"recebedor@example.com","keyType":"EMAIL"}}' Na confirmação, substitua max_debit_micros pelo custo revisado retornado em /quotes. O exemplo não deve ser executado sem revisar o favorecido e o valor. curl --fail-with-body https://criptocore.net/api/v2/operations \ -H "Authorization: Bearer $CRIPTOCORE_API_KEY" \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: pedido-1042-pagamento-01' \ -d '{"operation":{"type":"pix","cents":10000,"key":"recebedor@example.com","keyType":"EMAIL"},"max_debit_micros":"25000000","reference":"pedido-1042","callback_url":"https://sua-integracao.example/criptocore/callback"}' EXEMPLO NODE.JS: VERIFICAÇÃO DE EVENTO import { createHmac, timingSafeEqual } from 'node:crypto'; export function verify(rawBody, signatureHeader, secret, now = Math.floor(Date.now()/1000)) { const match = /^t=(\d+),v1=([a-f0-9]{64})$/.exec(signatureHeader || ''); if (!match || Math.abs(now - Number(match[1])) > 300) return false; const expected = createHmac('sha256', secret).update(match[1] + '.').update(rawBody).digest(); const supplied = Buffer.from(match[2], 'hex'); return supplied.length === expected.length && timingSafeEqual(supplied, expected); } // rawBody deve ser Buffer com os bytes originais da requisição. // Só após verify=true: JSON.parse(rawBody.toString('utf8')), persistir event.id e retornar 200. EXEMPLO PYTHON: CONSULTA SEM MOVIMENTAR SALDO import json, os, urllib.request request = urllib.request.Request( 'https://criptocore.net/api/v2/balances', headers={'Authorization': 'Bearer ' + os.environ['CRIPTOCORE_API_KEY']}) with urllib.request.urlopen(request, timeout=15) as response: result = json.load(response) available_micros = int(result['data']['available_micros']) EXEMPLO PYTHON: VERIFICAÇÃO DE EVENTO import hashlib, hmac, re, time def verify(raw_body: bytes, signature_header: str, secret: str) -> bool: match = re.fullmatch(r't=(\d+),v1=([a-f0-9]{64})', signature_header or '') if not match or abs(time.time() - int(match[1])) > 300: return False expected = hmac.new(secret.encode(), match[1].encode() + b'.' + raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, match[2]) ORIENTAÇÕES PARA AGENTES DE IA Leia este guia e o OpenAPI antes de gerar código. Não invente suporte on-chain, sandbox, cartão sensível, endpoints ou nomes de rede. Valide /capabilities e /assets com a credencial da conta. Nunca exponha chaves, segredos ou dados financeiros em logs. Use timeouts, paginação, escopos mínimos e Idempotency-Key persistente. Ofereça webhook, callback ou polling conforme a infraestrutura do integrador; nenhum é obrigatório. Não prometa pagamento concluído a partir de HTTP 202. Reconcilie operações review/processing por ID e nunca dispare outra saída por presumir falha. Referências técnicas do contrato: OpenAPI 3.1.1: https://spec.openapis.org/oas/v3.1.1.html HTTPS/Node.js: https://nodejs.org/api/https.html Proteção de destinos de webhook: https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html REFERÊNCIA COMPLETA DOS ENDPOINTS GET /api/v2/capabilities Consultar capacidades disponíveis Permissão: read Descubra as modalidades implementadas antes de montar sua integração. Uma capacidade implementada ainda pode sofrer pausa operacional ou limites da conta. GET /api/v2/account Consultar conta e política de IP Permissão: read Retorna os escopos da chave, IPs permitidos e limite diário compartilhado com o painel. Configurar a whitelist e emitir/revogar credenciais exige a sessão do titular em Desenvolvedores. GET /api/v2/balances Consultar saldo disponível Permissão: read Saldo único em USDT. Valores já debitados para operações pendentes não compõem available_micros. Nenhum campo representa saldo reservado fictício. GET /api/v2/fees Consultar tarifas da conta Permissão: read As tarifas específicas da conta prevalecem. Para conhecer o custo completo de uma operação, use /quotes. GET /api/v2/market Consultar cotação USDT/BRL Permissão: read Cotação de mercado informativa. O débito inclui o spread e as tarifas da conta. POST /api/v2/quotes Simular custo antes de pagar Permissão: read Não movimenta saldo nem garante disponibilidade do beneficiário. Use debit_micros como max_debit_micros ao confirmar. A cotação é indicativa; alterações que excedam o teto causam 409 sem débito. Exemplo de corpo: { "operation": { "type": "pix", "cents": 10000, "key": "recebedor@example.com", "keyType": "EMAIL" } } POST /api/v2/operations Criar uma operação financeira Permissão: payments:write Pix por chave, Pix copia e cola, boleto, emissão ou recarga de cartão. card/topup exigem também cards:write. A whitelist é verificada antes do preparo e novamente na transação financeira. 202 significa aceita, não paga. Consulte GET /operations/{id}. Idempotência por conta: mesma chave e mesmo corpo devolvem a operação; outro corpo gera 409. A chave permanece vinculada à operação, sem expiração automática. Callback, webhooks e polling podem coexistir. Não aceita depósito simulado, compra fictícia ou bloqueio por alternância. Exemplo de corpo: { "operation": { "type": "pix", "cents": 10000, "key": "recebedor@example.com", "keyType": "EMAIL" }, "max_debit_micros": "25000000", "reference": "pedido-1042", "metadata": { "order_id": "1042" } } GET /api/v2/operations Listar operações da API Permissão: read Lista operações criadas pela API, com o último estado observado pelo worker. Consulte o detalhe para atualização imediata. reference permite buscar uma referência do seu sistema. GET /api/v2/operations/{id} Consultar operação por polling Permissão: read Atualiza o estado e retorna transações, falhas, devoluções e E2E quando disponíveis. Respeite Retry-After: 5. processing/review não autorizam criar outro pagamento. completed/failed encerram o processamento atual; eventual estorno posterior continua visível. POST /api/v2/pix/decode Ler Pix copia e cola Permissão: read Consulta dados do favorecido e o valor exigido pelo QR. cents = null permite escolher valor. Não paga. POST /api/v2/boletos/quote Consultar boleto Permissão: read Até 20 consultas por conta por dia, compartilhadas com o painel. Use data.quoteId como quoteId e o valor retornado em cents ao criar a operação. POST /api/v2/withdrawals/crypto Disponibilidade dos saques cripto Permissão: payments:write Saques on-chain ainda não estão implementados no CriptoCore. Sempre retorna 409 CRYPTO_WITHDRAWALS_UNAVAILABLE sem débito; com whitelist ativa, IP não permitido retorna 403 antes disso. Consulte /capabilities e withdrawal_enabled em /assets. GET /api/v2/assets Listar moedas e redes Permissão: read Use o identificador network exato. Verifique deposit_enabled antes de pedir um endereço. Redes e taxas são consultadas na configuração atual. POST /api/v2/deposit-addresses Obter endereço de depósito Permissão: deposits:write Operação naturalmente idempotente: reutiliza o endereço ativo da família. Envie apenas a moeda/rede escolhida; não use endereços de outra rede. Quando memo_required=true, o memo/tag é obrigatório. O depósito é convertido em saldo USDT após confirmação e custódia. quote pode ser null; a cotação definitiva ocorre no crédito. Exemplo de corpo: { "asset": "USDT", "network": "BSC" } GET /api/v2/deposits Listar recebimentos cripto Permissão: read Inclui recebimentos da conta, inclusive ocultados no painel. Para atualizações, consulte o detalhe, /events ou webhook deposit.updated. GET /api/v2/deposits/{id} Acompanhar depósito Permissão: read Polling a cada 5 segundos ou mais. Só considere disponível quando status=CREDITED. amount é decimal do ativo; creditedMicros é saldo USDT em micros. GET /api/v2/transactions Listar extrato da conta Permissão: read Inclui painel e API. cents e walletDeltaMicros são assinados. Para devolução, consulte o lançamento associado. Não some debited_micros novamente ao saldo retornado. GET /api/v2/transactions/{id} Consultar lançamento Permissão: read Aceita o ID público CH-... ou o cursor_id interno retornado na listagem. Sempre limitado à conta da credencial. GET /api/v2/cards Listar cartões Permissão: read Retorna dados não sensíveis. Emissão e recarga passam por /operations. PAN/CVV e controles de bloqueio permanecem no painel autenticado. GET /api/v2/cards/{id} Consultar cartão Permissão: read Consulta saldo e estado sincronizados pelo processador de pagamentos. Não revela PAN ou CVV. GET /api/v2/webhooks Listar webhooks Permissão: read Webhooks são opcionais, por conta e compartilhados entre as chaves. Segredos existentes nunca são retornados. POST /api/v2/webhooks Cadastrar webhook Permissão: webhooks:write Até 10 por conta. Retorna secret uma única vez. Destino HTTPS público, porta 443; endereços privados e redirecionamentos não são aceitos. Assine apenas os eventos necessários. Exemplo de corpo: { "url": "https://sua-integracao.example/webhooks/criptocore", "description": "Pedidos", "events": [ "operation.updated", "deposit.updated" ] } GET /api/v2/webhooks/{id} Consultar webhook Permissão: read Retorna configuração sem o segredo de assinatura. PATCH /api/v2/webhooks/{id} Atualizar webhook Permissão: webhooks:write Envie ao menos um campo. A lista events substitui a anterior. enabled=false pausa novos eventos e cancela entregas pendentes. Alterar a URL cancela entregas para o endereço antigo. Entregas já em trânsito podem chegar. Reativar não reproduz eventos passados automaticamente. DELETE /api/v2/webhooks/{id} Remover webhook Permissão: webhooks:write Remove a configuração ativa e cancela entregas pendentes. Histórico permanece disponível. Eventos em trânsito podem chegar. POST /api/v2/webhooks/{id}/rotate-secret Rotacionar segredo Permissão: webhooks:write Retorna o novo segredo uma única vez e atualiza entregas pendentes. Mantenha o segredo anterior por 5 minutos para validar entregas em trânsito. POST /api/v2/webhooks/{id}/test Enviar evento de teste Permissão: webhooks:write Enfileira webhook.test apenas neste endpoint ativo, mesmo que esse tipo não esteja nas assinaturas. Não movimenta dinheiro. Consulte /deliveries pelo event_id. GET /api/v2/deliveries Inspecionar entregas e tentativas Permissão: read Inclui webhooks e callbacks. Respostas 2xx confirmam entrega. Após falhas, tentativas em 30s, 2min, 10min, 30min, 2h, 6h e 24h, contados desde a tentativa anterior. Até 8 tentativas por ciclo, timeout de 10s. Não há garantia de ordem ou entrega única. POST /api/v2/deliveries/{id}/retry Reenviar entrega falhada Permissão: webhooks:write Somente failed/canceled, sem tentativa em andamento. Reinicia o ciclo de tentativas para o mesmo event.id. Para webhook, usa URL e segredo atuais. Webhook removido/inativo não pode reenviar. Callback usa o segredo e a URL capturados na operação. GET /api/v2/events Consumir eventos por polling Permissão: read Ordem crescente por sequence. Comece after=0; processe e persista next_cursor somente após salvar os eventos. Retome com after=next_cursor. Cursor e sequence são strings decimais; não converta para Number. Eventos existem mesmo sem webhook. Operações são observadas normalmente a cada 5s; depósitos têm atraso de aproximadamente 1–2 minutos. Transições muito rápidas podem aparecer apenas como estado final. OPENAPI 3.1.1 — SCHEMAS E CONTRATO COMPLETO { "openapi": "3.1.1", "info": { "title": "CriptoCore API", "version": "2.0.0", "description": "Integrações financeiras com autenticação Bearer, idempotência, whitelist de IP opcional para saídas, webhooks assinados, callback por operação e polling. Produção: dinheiro real. Não há ambiente sandbox público. Moedas/redes e disponibilidade devem ser consultadas em /assets e /capabilities. Campos monetários e nomenclatura dos recursos são descritos explicitamente em cada schema." }, "servers": [ { "url": "https://criptocore.net/api/v2", "description": "Produção" } ], "tags": [ { "name": "Conta" }, { "name": "Operações" }, { "name": "Depósitos" }, { "name": "Extrato e cartões" }, { "name": "Webhooks" } ], "security": [ { "ApiKey": [] } ], "paths": { "/capabilities": { "get": { "operationId": "get__capabilities", "tags": [ "Conta" ], "summary": "Consultar capacidades disponíveis", "description": "Descubra as modalidades implementadas antes de montar sua integração. Uma capacidade implementada ainda pode sofrer pausa operacional ou limites da conta.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "api_version": { "type": "string", "description": "" }, "operations": { "type": "object", "properties": { "pix": { "type": "boolean" }, "pixqr": { "type": "boolean" }, "boleto": { "type": "boolean" }, "card": { "type": "boolean" }, "topup": { "type": "boolean" }, "crypto_withdrawal": { "const": false } }, "required": [ "pix", "pixqr", "boleto", "card", "topup", "crypto_withdrawal" ], "additionalProperties": false }, "notifications": { "type": "object", "properties": { "webhooks": { "const": true }, "callback_url": { "const": true }, "polling": { "const": true } }, "required": [ "webhooks", "callback_url", "polling" ], "additionalProperties": false }, "ip_whitelist": { "const": "optional" }, "docs": { "type": "string", "description": "" } }, "required": [ "api_version", "operations", "notifications", "ip_whitelist", "docs" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/account": { "get": { "operationId": "get__account", "tags": [ "Conta" ], "summary": "Consultar conta e política de IP", "description": "Retorna os escopos da chave, IPs permitidos e limite diário compartilhado com o painel. Configurar a whitelist e emitir/revogar credenciais exige a sessão do titular em Desenvolvedores.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "name": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "scopes": { "type": "array", "items": { "type": "string", "description": "" } }, "ip_whitelist": { "type": "object", "properties": { "enabled": { "type": "boolean" }, "ips": { "type": "array", "items": { "type": "string", "description": "" } } }, "required": [ "enabled", "ips" ], "additionalProperties": false }, "daily_limit": { "type": "object", "properties": { "blocked": { "type": "boolean" }, "limitCents": { "type": "integer", "description": "" }, "usedCents": { "type": "integer", "description": "" }, "remainingCents": { "type": "integer", "description": "" }, "resetsAt": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "blocked", "limitCents", "usedCents", "remainingCents", "resetsAt" ], "additionalProperties": false } }, "required": [ "id", "name", "scopes", "ip_whitelist", "daily_limit" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/balances": { "get": { "operationId": "get__balances", "tags": [ "Conta" ], "summary": "Consultar saldo disponível", "description": "Saldo único em USDT. Valores já debitados para operações pendentes não compõem available_micros. Nenhum campo representa saldo reservado fictício.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Balance" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/fees": { "get": { "operationId": "get__fees", "tags": [ "Conta" ], "summary": "Consultar tarifas da conta", "description": "As tarifas específicas da conta prevalecem. Para conhecer o custo completo de uma operação, use /quotes.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "pix": { "$ref": "#/components/schemas/FeeTerms" }, "pixQr": { "$ref": "#/components/schemas/FeeTerms" }, "boleto": { "$ref": "#/components/schemas/FeeTerms" }, "cardIssue": { "$ref": "#/components/schemas/FeeTerms" }, "cardTopup": { "$ref": "#/components/schemas/FeeTerms" }, "cardPurchase": { "$ref": "#/components/schemas/FeeTerms" }, "brlSpreadPpm": { "type": "integer", "description": "Spread da conversão em ppm." } }, "required": [ "pix", "pixQr", "boleto", "cardIssue", "cardTopup", "cardPurchase", "brlSpreadPpm" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/market": { "get": { "operationId": "get__market", "tags": [ "Conta" ], "summary": "Consultar cotação USDT/BRL", "description": "Cotação de mercado informativa. O débito inclui o spread e as tarifas da conta.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "usdt_brl": { "type": "string", "description": "" }, "quoted_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "usdt_brl", "quoted_at" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/quotes": { "post": { "operationId": "post__quotes", "tags": [ "Operações" ], "summary": "Simular custo antes de pagar", "description": "Não movimenta saldo nem garante disponibilidade do beneficiário. Use debit_micros como max_debit_micros ao confirmar. A cotação é indicativa; alterações que excedam o teto causam 409 sem débito.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "operation": { "$ref": "#/components/schemas/PaymentInput" } }, "required": [ "operation" ], "additionalProperties": false }, "example": { "operation": { "type": "pix", "cents": 10000, "key": "recebedor@example.com", "keyType": "EMAIL" } } } } }, "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Quote" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/operations": { "post": { "operationId": "post__operations", "tags": [ "Operações" ], "summary": "Criar uma operação financeira", "description": "Pix por chave, Pix copia e cola, boleto, emissão ou recarga de cartão. card/topup exigem também cards:write. A whitelist é verificada antes do preparo e novamente na transação financeira. 202 significa aceita, não paga. Consulte GET /operations/{id}. Idempotência por conta: mesma chave e mesmo corpo devolvem a operação; outro corpo gera 409. A chave permanece vinculada à operação, sem expiração automática. Callback, webhooks e polling podem coexistir. Não aceita depósito simulado, compra fictícia ou bloqueio por alternância.\n\nPermissão: `payments:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "Idempotency-Key", "in": "header", "required": true, "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{16,128}$" }, "example": "pedido-1042-pagamento-01" } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateOperation" }, "example": { "operation": { "type": "pix", "cents": 10000, "key": "recebedor@example.com", "keyType": "EMAIL" }, "max_debit_micros": "25000000", "reference": "pedido-1042", "metadata": { "order_id": "1042" } } } } }, "responses": { "200": { "description": "Repetição idempotente, sem novo débito.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Operation" } }, "required": [ "data" ], "additionalProperties": false } } } }, "202": { "description": "Aceito para processamento assíncrono.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Operation" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } }, "callbacks": { "operationUpdates": { "{$request.body#/callback_url}": { "post": { "description": "Assinatura: X-CriptoCore-Signature = t=UNIX,v1=HMAC_SHA256(callback_secret, t + \".\" + corpo_cru). Janela recomendada de 300s. Deduplicar por event.id.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Event" } } } }, "responses": { "200": { "description": "Recebido e persistido." } } } } } } }, "get": { "operationId": "get__operations", "tags": [ "Operações" ], "summary": "Listar operações da API", "description": "Lista operações criadas pela API, com o último estado observado pelo worker. Consulte o detalhe para atualização imediata. reference permite buscar uma referência do seu sistema.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "cursor", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "description": "next_cursor da página anterior. Ordem decrescente por ID." }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } }, { "name": "reference", "in": "query", "schema": { "type": "string", "maxLength": 128 } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Operation" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/operations/{id}": { "get": { "operationId": "get__operations_id_", "tags": [ "Operações" ], "summary": "Consultar operação por polling", "description": "Atualiza o estado e retorna transações, falhas, devoluções e E2E quando disponíveis. Respeite Retry-After: 5. processing/review não autorizam criar outro pagamento. completed/failed encerram o processamento atual; eventual estorno posterior continua visível.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Operation" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/pix/decode": { "post": { "operationId": "post__pix_decode", "tags": [ "Operações" ], "summary": "Ler Pix copia e cola", "description": "Consulta dados do favorecido e o valor exigido pelo QR. cents = null permite escolher valor. Não paga.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "code": { "type": "string", "description": "", "minLength": 20, "maxLength": 2000 } }, "required": [ "code" ], "additionalProperties": false } } } }, "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "beneficiary": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "institution": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "dynamic": { "type": "boolean" }, "cents": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] } }, "required": [ "beneficiary", "institution", "dynamic", "cents" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/boletos/quote": { "post": { "operationId": "post__boletos_quote", "tags": [ "Operações" ], "summary": "Consultar boleto", "description": "Até 20 consultas por conta por dia, compartilhadas com o painel. Use data.quoteId como quoteId e o valor retornado em cents ao criar a operação.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "code": { "type": "string", "description": "", "minLength": 40, "maxLength": 80 } }, "required": [ "code" ], "additionalProperties": false } } } }, "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/BoletoQuote" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/withdrawals/crypto": { "post": { "operationId": "post__withdrawals_crypto", "tags": [ "Operações" ], "summary": "Disponibilidade dos saques cripto", "description": "Saques on-chain ainda não estão implementados no CriptoCore. Sempre retorna 409 CRYPTO_WITHDRAWALS_UNAVAILABLE sem débito; com whitelist ativa, IP não permitido retorna 403 antes disso. Consulte /capabilities e withdrawal_enabled em /assets.\n\nPermissão: `payments:write`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Modalidade indisponível, sem débito.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/assets": { "get": { "operationId": "get__assets", "tags": [ "Depósitos" ], "summary": "Listar moedas e redes", "description": "Use o identificador network exato. Verifique deposit_enabled antes de pedir um endereço. Redes e taxas são consultadas na configuração atual.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Asset" } } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/deposit-addresses": { "post": { "operationId": "post__deposit_addresses", "tags": [ "Depósitos" ], "summary": "Obter endereço de depósito", "description": "Operação naturalmente idempotente: reutiliza o endereço ativo da família. Envie apenas a moeda/rede escolhida; não use endereços de outra rede. Quando memo_required=true, o memo/tag é obrigatório. O depósito é convertido em saldo USDT após confirmação e custódia. quote pode ser null; a cotação definitiva ocorre no crédito.\n\nPermissão: `deposits:write`.", "security": [ { "ApiKey": [] } ], "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "asset": { "type": "string", "description": "", "example": "USDT" }, "network": { "type": "string", "description": "Consulte /assets." } }, "required": [ "asset", "network" ], "additionalProperties": false }, "example": { "asset": "USDT", "network": "BSC" } } } }, "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/DepositAddress" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/deposits": { "get": { "operationId": "get__deposits", "tags": [ "Depósitos" ], "summary": "Listar recebimentos cripto", "description": "Inclui recebimentos da conta, inclusive ocultados no painel. Para atualizações, consulte o detalhe, /events ou webhook deposit.updated.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "cursor", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "description": "next_cursor da página anterior. Ordem decrescente por ID." }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Deposit" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/deposits/{id}": { "get": { "operationId": "get__deposits_id_", "tags": [ "Depósitos" ], "summary": "Acompanhar depósito", "description": "Polling a cada 5 segundos ou mais. Só considere disponível quando status=CREDITED. amount é decimal do ativo; creditedMicros é saldo USDT em micros.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Deposit" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/transactions": { "get": { "operationId": "get__transactions", "tags": [ "Extrato e cartões" ], "summary": "Listar extrato da conta", "description": "Inclui painel e API. cents e walletDeltaMicros são assinados. Para devolução, consulte o lançamento associado. Não some debited_micros novamente ao saldo retornado.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "cursor", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "description": "next_cursor da página anterior. Ordem decrescente por ID." }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Transaction" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/transactions/{id}": { "get": { "operationId": "get__transactions_id_", "tags": [ "Extrato e cartões" ], "summary": "Consultar lançamento", "description": "Aceita o ID público CH-... ou o cursor_id interno retornado na listagem. Sempre limitado à conta da credencial.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Transaction" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/cards": { "get": { "operationId": "get__cards", "tags": [ "Extrato e cartões" ], "summary": "Listar cartões", "description": "Retorna dados não sensíveis. Emissão e recarga passam por /operations. PAN/CVV e controles de bloqueio permanecem no painel autenticado.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Card" } } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/cards/{id}": { "get": { "operationId": "get__cards_id_", "tags": [ "Extrato e cartões" ], "summary": "Consultar cartão", "description": "Consulta saldo e estado sincronizados pelo processador de pagamentos. Não revela PAN ou CVV.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Card" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/webhooks": { "get": { "operationId": "get__webhooks", "tags": [ "Webhooks" ], "summary": "Listar webhooks", "description": "Webhooks são opcionais, por conta e compartilhados entre as chaves. Segredos existentes nunca são retornados.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "cursor", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "description": "next_cursor da página anterior. Ordem decrescente por ID." }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Webhook" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } }, "post": { "operationId": "post__webhooks", "tags": [ "Webhooks" ], "summary": "Cadastrar webhook", "description": "Até 10 por conta. Retorna secret uma única vez. Destino HTTPS público, porta 443; endereços privados e redirecionamentos não são aceitos. Assine apenas os eventos necessários.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookInput" }, "example": { "url": "https://sua-integracao.example/webhooks/criptocore", "description": "Pedidos", "events": [ "operation.updated", "deposit.updated" ] } } } }, "responses": { "201": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Webhook" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/webhooks/{id}": { "get": { "operationId": "get__webhooks_id_", "tags": [ "Webhooks" ], "summary": "Consultar webhook", "description": "Retorna configuração sem o segredo de assinatura.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Webhook" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } }, "patch": { "operationId": "patch__webhooks_id_", "tags": [ "Webhooks" ], "summary": "Atualizar webhook", "description": "Envie ao menos um campo. A lista events substitui a anterior. enabled=false pausa novos eventos e cancela entregas pendentes. Alterar a URL cancela entregas para o endereço antigo. Entregas já em trânsito podem chegar. Reativar não reproduz eventos passados automaticamente.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string", "description": "HTTPS público, porta 443, sem credenciais ou fragmento.", "format": "uri", "maxLength": 2048 }, "description": { "type": "string", "description": "", "maxLength": 160, "default": "" }, "events": { "type": "array", "items": { "type": "string", "enum": [ "operation.created", "operation.updated", "deposit.updated", "webhook.test" ] }, "minItems": 1, "maxItems": 4 }, "enabled": { "type": "boolean", "default": true } }, "required": [], "additionalProperties": false, "minProperties": 1 } } } }, "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Webhook" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } }, "delete": { "operationId": "delete__webhooks_id_", "tags": [ "Webhooks" ], "summary": "Remover webhook", "description": "Remove a configuração ativa e cancela entregas pendentes. Histórico permanece disponível. Eventos em trânsito podem chegar.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "204": { "description": "Removido, sem corpo." }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/webhooks/{id}/rotate-secret": { "post": { "operationId": "post__webhooks_id_rotate_secret", "tags": [ "Webhooks" ], "summary": "Rotacionar segredo", "description": "Retorna o novo segredo uma única vez e atualiza entregas pendentes. Mantenha o segredo anterior por 5 minutos para validar entregas em trânsito.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "secret": { "type": "string", "description": "" } }, "required": [ "id", "secret" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/webhooks/{id}/test": { "post": { "operationId": "post__webhooks_id_test", "tags": [ "Webhooks" ], "summary": "Enviar evento de teste", "description": "Enfileira webhook.test apenas neste endpoint ativo, mesmo que esse tipo não esteja nas assinaturas. Não movimenta dinheiro. Consulte /deliveries pelo event_id.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "202": { "description": "Aceito para processamento assíncrono.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/Event" } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/deliveries": { "get": { "operationId": "get__deliveries", "tags": [ "Webhooks" ], "summary": "Inspecionar entregas e tentativas", "description": "Inclui webhooks e callbacks. Respostas 2xx confirmam entrega. Após falhas, tentativas em 30s, 2min, 10min, 30min, 2h, 6h e 24h, contados desde a tentativa anterior. Até 8 tentativas por ciclo, timeout de 10s. Não há garantia de ordem ou entrega única.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "cursor", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "description": "next_cursor da página anterior. Ordem decrescente por ID." }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } }, { "name": "webhook_id", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } }, { "name": "event_id", "in": "query", "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Delivery" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/deliveries/{id}/retry": { "post": { "operationId": "post__deliveries_id_retry", "tags": [ "Webhooks" ], "summary": "Reenviar entrega falhada", "description": "Somente failed/canceled, sem tentativa em andamento. Reinicia o ciclo de tentativas para o mesmo event.id. Para webhook, usa URL e segredo atuais. Webhook removido/inativo não pode reenviar. Callback usa o segredo e a URL capturados na operação.\n\nPermissão: `webhooks:write`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } } ], "responses": { "202": { "description": "Aceito para processamento assíncrono.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "status": { "const": "pending" } }, "required": [ "id", "status" ], "additionalProperties": false } }, "required": [ "data" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/events": { "get": { "operationId": "get__events", "tags": [ "Webhooks" ], "summary": "Consumir eventos por polling", "description": "Ordem crescente por sequence. Comece after=0; processe e persista next_cursor somente após salvar os eventos. Retome com after=next_cursor. Cursor e sequence são strings decimais; não converta para Number. Eventos existem mesmo sem webhook. Operações são observadas normalmente a cada 5s; depósitos têm atraso de aproximadamente 1–2 minutos. Transições muito rápidas podem aparecer apenas como estado final.\n\nPermissão: `read`.", "security": [ { "ApiKey": [] } ], "parameters": [ { "name": "after", "in": "query", "schema": { "type": "string", "pattern": "^\\d{1,19}$", "default": "0" } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 } } ], "responses": { "200": { "description": "Sucesso.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Event" } }, "pagination": { "$ref": "#/components/schemas/Pagination" } }, "required": [ "data", "pagination" ], "additionalProperties": false } } }, "headers": { "X-Request-Id": { "schema": { "type": "string" } }, "Retry-After": { "schema": { "type": "integer" }, "description": "Tempo mínimo até a próxima consulta, quando presente." } } }, "400": { "description": "Validação", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Chave inválida", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Escopo, conta ou IP sem autorização", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "description": "Recurso inexistente ou de outra conta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "409": { "description": "Conflito", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "422": { "description": "Operação recusada", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "description": "Limite excedido; respeite Retry-After", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "500": { "description": "Erro interno; consulte antes de repetir", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "503": { "description": "Serviço indisponível", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } } }, "components": { "securitySchemes": { "ApiKey": { "type": "http", "scheme": "bearer", "bearerFormat": "cc_live_...", "description": "Crie uma chave em Painel → Desenvolvedores. Envie somente no cabeçalho Authorization, nunca na URL." } }, "schemas": { "Error": { "type": "object", "properties": { "error": { "type": "object", "properties": { "code": { "type": "string", "description": "Código estável para tratamento automático." }, "message": { "type": "string", "description": "Explicação para humanos." }, "request_id": { "type": "string", "description": "Envie este identificador ao suporte." }, "details": { "type": "array", "items": { "type": "object", "properties": { "field": { "type": "string", "description": "" }, "message": { "type": "string", "description": "" } }, "required": [ "field", "message" ], "additionalProperties": false } } }, "required": [ "code", "message", "request_id" ], "additionalProperties": false } }, "required": [ "error" ], "additionalProperties": false }, "Pagination": { "type": "object", "properties": { "has_more": { "type": "boolean" }, "next_cursor": { "anyOf": [ { "type": "string", "description": "Envie em cursor; para /events, envie em after." }, { "type": "null" } ] } }, "required": [ "has_more", "next_cursor" ], "additionalProperties": false }, "PaymentInput": { "oneOf": [ { "type": "object", "properties": { "type": { "const": "pix" }, "cents": { "type": "integer", "description": "Inteiro em centavos de BRL. 10000 = R$ 100,00.", "minimum": 1, "maximum": 100000000, "example": 10000 }, "key": { "type": "string", "description": "Chave Pix.", "maxLength": 160 }, "keyType": { "type": "string", "description": "Dica de tipo; o formato da chave é validado.", "enum": [ "CPF", "CNPJ", "EMAIL", "PHONE", "RANDOM", "cpf", "cnpj", "email", "phone", "random" ] }, "name": { "type": "string", "description": "Nome opcional do favorecido.", "maxLength": 80 }, "document": { "type": "string", "description": "CPF/CNPJ opcional do favorecido.", "maxLength": 20 } }, "required": [ "type", "cents", "key" ], "additionalProperties": false }, { "type": "object", "properties": { "type": { "const": "pixqr" }, "cents": { "type": "integer", "description": "Inteiro em centavos de BRL. 10000 = R$ 100,00.", "minimum": 1, "maximum": 100000000, "example": 10000 }, "code": { "type": "string", "description": "Pix copia e cola completo.", "minLength": 20, "maxLength": 2000 }, "name": { "type": "string", "description": "Nome opcional.", "maxLength": 80 } }, "required": [ "type", "cents", "code" ], "additionalProperties": false }, { "type": "object", "properties": { "type": { "const": "boleto" }, "cents": { "type": "integer", "description": "Inteiro em centavos de BRL. 10000 = R$ 100,00.", "minimum": 1, "maximum": 100000000, "example": 10000 }, "code": { "type": "string", "description": "Linha digitável de boleto.", "minLength": 40, "maxLength": 80 }, "quoteId": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "name": { "type": "string", "description": "Beneficiário; opcional, consultado no provedor.", "maxLength": 80 } }, "required": [ "type", "cents", "code" ], "additionalProperties": false }, { "type": "object", "properties": { "type": { "const": "card" }, "name": { "type": "string", "description": "Apelido do cartão.", "minLength": 1, "maxLength": 60 }, "color": { "type": "string", "description": "Cor do cartão.", "enum": [ "green", "black", "lilac" ], "default": "green" }, "holderName": { "type": "string", "description": "Nome e sobrenome impressos.", "minLength": 3, "maxLength": 60 }, "initialLoadCents": { "type": "integer", "description": "Recarga inicial opcional em centavos.", "minimum": 500, "maximum": 5000000 } }, "required": [ "type", "name", "holderName" ], "additionalProperties": false }, { "type": "object", "properties": { "type": { "const": "topup" }, "cents": { "type": "integer", "description": "Inteiro em centavos de BRL. 10000 = R$ 100,00.", "minimum": 1, "maximum": 100000000, "example": 10000 }, "cardId": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } }, "required": [ "type", "cents", "cardId" ], "additionalProperties": false } ], "discriminator": { "propertyName": "type" } }, "CreateOperation": { "type": "object", "properties": { "operation": { "$ref": "#/components/schemas/PaymentInput" }, "max_debit_micros": { "type": "string", "description": "Teto total de débito, incluindo tarifas. Obtenha debit_micros em /quotes. Se excedido, a transação inteira é revertida.", "pattern": "^[1-9]\\d{0,12}$" }, "reference": { "type": "string", "description": "Referência de seu sistema, pesquisável. Não é chave de idempotência.", "minLength": 1, "maxLength": 128 }, "callback_url": { "type": "string", "description": "Opcional. URL HTTPS pública, porta 443. Usa o callback_secret da chave que criou a operação. Independente dos webhooks cadastrados.", "format": "uri", "maxLength": 2048 }, "metadata": { "type": "object", "maxProperties": 20, "additionalProperties": { "type": "string", "maxLength": 256 }, "default": {} } }, "required": [ "operation", "max_debit_micros" ], "additionalProperties": false }, "Operation": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "type": { "type": "string", "description": "", "enum": [ "pix", "pixqr", "boleto", "card", "topup" ] }, "status": { "type": "string", "description": "processing: aguarde; review: conciliação, não refaça; completed: concluída; failed: confira as devoluções em transactions. Uma emissão com recarga pode concluir parcialmente.", "enum": [ "processing", "review", "completed", "failed" ] }, "reference": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "metadata": { "type": "object", "additionalProperties": { "type": "string" } }, "card_id": { "anyOf": [ { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, { "type": "null" } ] }, "created_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "transactions": { "type": "array", "items": { "$ref": "#/components/schemas/Transaction" } }, "debited_micros": { "type": "string", "description": "Inteiro decimal em micros de USDT. 1000000 = 1 USDT. Use BigInt ou Decimal.", "pattern": "^\\d+$", "example": "20000000" } }, "required": [ "id", "type", "status", "reference", "metadata", "card_id", "created_at", "transactions", "debited_micros" ], "additionalProperties": false }, "Transaction": { "type": "object", "properties": { "id": { "type": "string", "description": "ID público do lançamento (CH-...)." }, "kind": { "type": "string", "description": "" }, "title": { "type": "string", "description": "" }, "subtitle": { "type": "string", "description": "" }, "cents": { "type": "integer", "description": "Valor em BRL, negativo para saída, inclui tarifa." }, "time": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "detail": { "type": "string", "description": "" }, "fee": { "type": "integer", "description": "Tarifa em centavos." }, "status": { "type": "string", "description": "", "enum": [ "PENDING", "COMPLETE", "FAILED", "REVIEW" ] }, "cardId": { "anyOf": [ { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, { "type": "null" } ] }, "cardAmountCents": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "usdtBrl": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "walletDeltaMicros": { "type": "integer", "description": "Variação assinada do saldo em micros." }, "failureReason": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "refund": { "anyOf": [ { "type": "string", "description": "ID público do lançamento de devolução." }, { "type": "null" } ] }, "refundedMicros": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "refundedAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "deposit": { "type": "null" }, "end_to_end_id": { "anyOf": [ { "type": "string", "description": "Identificador Pix E2E. Presente nas operações." }, { "type": "null" } ] }, "settled_at": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "cursor_id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } }, "required": [ "id", "kind", "cents", "status", "time", "walletDeltaMicros" ], "additionalProperties": false }, "Quote": { "type": "object", "properties": { "amount_cents": { "type": "integer", "description": "" }, "fee_cents": { "type": "integer", "description": "" }, "total_cents": { "type": "integer", "description": "" }, "debit_micros": { "type": "string", "description": "Inteiro decimal em micros de USDT. 1000000 = 1 USDT. Use BigInt ou Decimal.", "pattern": "^\\d+$", "example": "20000000" }, "usdt_brl": { "type": "string", "description": "" }, "quoted_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "indicative": { "const": true } }, "required": [ "amount_cents", "fee_cents", "total_cents", "debit_micros", "usdt_brl", "quoted_at", "indicative" ], "additionalProperties": false }, "BoletoQuote": { "type": "object", "properties": { "quoteId": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "type": { "type": "string", "description": "", "enum": [ "boleto", "tributo" ] }, "barcode": { "type": "string", "description": "" }, "digitableLine": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "beneficiary": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "beneficiaryDocument": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "bank": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "dueDate": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "paymentLimitDate": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "onDemand": { "type": "boolean" }, "amounts": { "type": "object", "properties": { "original": { "type": "number" }, "discount": { "type": "number" }, "interest": { "type": "number" }, "fine": { "type": "number" }, "rebate": { "type": "number" }, "final": { "type": "number" } }, "required": [ "original", "discount", "interest", "fine", "rebate", "final" ], "additionalProperties": false }, "cents": { "type": "integer", "description": "Inteiro em centavos de BRL. 10000 = R$ 100,00.", "minimum": 1, "maximum": 100000000, "example": 10000 }, "payable": { "type": "boolean" }, "paymentWindow": { "anyOf": [ { "type": "object", "properties": { "open": { "type": "boolean" }, "reason": { "type": "string", "description": "" } }, "required": [ "open" ], "additionalProperties": false }, { "type": "null" } ] }, "expiresAt": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "quoteId", "type", "barcode", "digitableLine", "beneficiary", "beneficiaryDocument", "bank", "dueDate", "paymentLimitDate", "onDemand", "amounts", "cents", "payable", "paymentWindow", "expiresAt" ], "additionalProperties": false }, "Balance": { "type": "object", "properties": { "asset": { "const": "USDT" }, "available_micros": { "type": "string", "description": "Inteiro decimal em micros de USDT. 1000000 = 1 USDT. Use BigInt ou Decimal.", "pattern": "^\\d+$", "example": "20000000" }, "decimals": { "const": 6 }, "updated_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "asset", "available_micros", "decimals", "updated_at" ], "additionalProperties": false }, "WebhookInput": { "type": "object", "properties": { "url": { "type": "string", "description": "HTTPS público, porta 443, sem credenciais ou fragmento.", "format": "uri", "maxLength": 2048 }, "description": { "type": "string", "description": "", "maxLength": 160, "default": "" }, "events": { "type": "array", "items": { "type": "string", "enum": [ "operation.created", "operation.updated", "deposit.updated", "webhook.test" ] }, "minItems": 1, "maxItems": 4 }, "enabled": { "type": "boolean", "default": true } }, "required": [ "url", "events" ], "additionalProperties": false }, "Webhook": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "url": { "type": "string", "description": "", "format": "uri" }, "description": { "type": "string", "description": "" }, "events": { "type": "array", "items": { "type": "string", "description": "", "enum": [ "operation.created", "operation.updated", "deposit.updated", "webhook.test" ] } }, "enabled": { "type": "boolean" }, "created_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "updated_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "secret": { "type": "string", "description": "Somente na criação. Guarde para verificar X-CriptoCore-Signature." } }, "required": [ "id", "url", "description", "events", "enabled", "created_at", "updated_at" ], "additionalProperties": false }, "Event": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "type": { "type": "string", "description": "", "enum": [ "operation.created", "operation.updated", "deposit.updated", "webhook.test" ] }, "api_version": { "const": "2.0" }, "created_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "data": { "oneOf": [ { "$ref": "#/components/schemas/Operation" }, { "$ref": "#/components/schemas/Deposit" }, { "type": "object", "properties": { "message": { "type": "string", "description": "" }, "webhook_id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" } }, "required": [ "message", "webhook_id" ], "additionalProperties": false } ] }, "sequence": { "type": "string", "description": "Apenas na consulta /events. Cursor incremental por conta.", "pattern": "^\\d+$" } }, "required": [ "id", "type", "api_version", "created_at", "data" ], "additionalProperties": false }, "Delivery": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "event_id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "webhook_id": { "anyOf": [ { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, { "type": "null" } ] }, "type": { "type": "string", "description": "", "enum": [ "webhook", "callback" ] }, "status": { "type": "string", "description": "", "enum": [ "pending", "retry", "delivered", "failed", "canceled" ] }, "attempts": { "type": "integer", "description": "" }, "next_attempt_at": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "last_http_status": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "last_error": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "delivered_at": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "created_at": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "id", "event_id", "webhook_id", "type", "status", "attempts", "next_attempt_at", "last_http_status", "last_error", "delivered_at", "created_at" ], "additionalProperties": false }, "Asset": { "type": "object", "properties": { "asset": { "type": "string", "description": "" }, "network": { "type": "string", "description": "Identificador exato aceito em /deposit-addresses." }, "network_name": { "type": "string", "description": "" }, "decimals": { "type": "integer", "description": "" }, "deposit_enabled": { "type": "boolean" }, "withdrawal_enabled": { "const": false }, "minimum_units": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "confirmations": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "fee_percent": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "fee_fixed_micros": { "anyOf": [ { "type": "string", "description": "Inteiro decimal em micros de USDT. 1000000 = 1 USDT. Use BigInt ou Decimal.", "pattern": "^\\d+$", "example": "20000000" }, { "type": "null" } ] } }, "required": [ "asset", "network", "network_name", "decimals", "deposit_enabled", "withdrawal_enabled", "minimum_units", "confirmations", "fee_percent", "fee_fixed_micros" ], "additionalProperties": false }, "DepositAddress": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "asset": { "type": "string", "description": "" }, "network": { "type": "string", "description": "" }, "address": { "type": "string", "description": "" }, "memo": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "memo_required": { "type": "boolean" }, "quote": { "anyOf": [ { "type": "object", "properties": { "rate": { "type": "string", "description": "" }, "usdtBrl": { "type": "string", "description": "" }, "source": { "type": "string", "description": "" }, "quotedAt": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" } }, "required": [ "rate", "usdtBrl", "source", "quotedAt" ], "additionalProperties": false }, { "type": "null" } ] } }, "required": [ "id", "asset", "network", "address", "memo", "memo_required", "quote" ], "additionalProperties": false }, "Deposit": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "asset": { "type": "string", "description": "" }, "network": { "type": "string", "description": "" }, "networkLabel": { "type": "string", "description": "" }, "amount": { "type": "string", "description": "Quantidade decimal do ativo; nunca converter para float." }, "status": { "type": "string", "description": "CREDITED é o estado de crédito em saldo. HELD/REJECTED requerem análise; não significam saque ou devolução.", "enum": [ "DETECTED", "CONFIRMING", "CONFIRMED", "SECURING", "SECURED", "CREDITED", "BELOW_MINIMUM", "PAIR_DISABLED", "HELD", "REJECTED" ] }, "txHash": { "type": "string", "description": "" }, "depositAddress": { "type": "string", "description": "" }, "memo": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "confirmations": { "type": "integer", "description": "" }, "requiredConfirmations": { "type": "integer", "description": "" }, "remainingConfirmations": { "type": "integer", "description": "" }, "creditedMicros": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "grossMicros": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "feeMicros": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "holdReason": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "delayed": { "type": "boolean" }, "rate": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "createdAt": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "updatedAt": { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, "creditedAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "transactionId": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "explorer": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "initialQuote": {}, "rateSource": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "usdtBrl": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "creditedCents": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "amountBasis": { "type": "string", "description": "" }, "fromAddress": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "contract": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "blockNumber": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "confirmationPhase": { "type": "string", "description": "" }, "verifiedAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "sweptAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] }, "securedAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] } }, "required": [ "id", "asset", "network", "networkLabel", "amount", "status", "txHash", "depositAddress", "memo", "confirmations", "requiredConfirmations", "remainingConfirmations", "creditedMicros", "grossMicros", "feeMicros", "holdReason", "delayed", "rate", "createdAt", "updatedAt", "creditedAt", "transactionId", "explorer", "initialQuote", "rateSource", "usdtBrl", "creditedCents", "amountBasis", "fromAddress", "contract", "blockNumber", "confirmationPhase", "verifiedAt", "sweptAt", "securedAt" ], "additionalProperties": false }, "Card": { "type": "object", "properties": { "id": { "type": "string", "description": "Identificador opaco ULID de 26 caracteres.", "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$", "example": "01K79A6VJW6QRK8GH2Y3FNSD5P" }, "name": { "type": "string", "description": "" }, "last4": { "type": "string", "description": "" }, "balance": { "type": "integer", "description": "Saldo em centavos." }, "frozen": { "type": "boolean" }, "color": { "type": "string", "description": "" }, "status": { "type": "string", "description": "" }, "real": { "type": "boolean" }, "pending": { "type": "integer", "description": "" }, "holderName": { "anyOf": [ { "type": "string", "description": "" }, { "type": "null" } ] }, "syncedAt": { "anyOf": [ { "type": "string", "description": "Data e hora UTC, ISO 8601.", "format": "date-time" }, { "type": "null" } ] } }, "required": [ "id", "name", "last4", "balance", "frozen", "color", "status", "real", "pending", "holderName", "syncedAt" ], "additionalProperties": false }, "FeeTerms": { "type": "object", "properties": { "ratePpm": { "type": "integer", "description": "Percentual em partes por milhão. 30000 = 3%." }, "fixed": { "type": "integer", "description": "Tarifa fixa em centavos." }, "min": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "max": { "anyOf": [ { "type": "integer", "description": "" }, { "type": "null" } ] }, "source": { "type": "string", "description": "" } }, "required": [ "ratePpm", "fixed", "min", "max", "source" ], "additionalProperties": false } } } }