{
  "info": {
    "name": "CriptoCore API v2",
    "description": "CriptoCore API v2 — Guia de integração\nContrato: 2.0.0. Base: https://criptocore.net/api/v2\nDocumentação: https://criptocore.net/developers/\nOpenAPI: https://criptocore.net/developers/openapi.json\n\nCOMECE AQUI\n1. Entre na sua conta CriptoCore e abra Desenvolvedores.\n2. 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.\n3. Use Authorization: Bearer cc_live_... e Content-Type: application/json. Não precisa de cookie, sessão de navegador, x-criptocore-client ou fingerprint.\n4. Consulte GET /capabilities, GET /account, GET /balances e GET /assets.\n5. 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.\n6. Salve data.id antes de prosseguir. 202 é aceitação; acompanhe até a conclusão.\n\nNã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.\n\nDISPONIBILIDADE\nA 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.\n\nPERMISSÕES\nread: conta, saldo, tarifas, consultas/cotações, recursos e eventos.\npayments:write: criar operações de saída.\ncards:write: exigida junto de payments:write para emissão/recarga.\ndeposits:write: obter endereço de depósito.\nwebhooks:write: criar, atualizar, remover, testar webhooks e reenviar entregas.\nRevogaçã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.\n\nWHITELIST OPCIONAL DE IP\nConfiguração em Painel → Desenvolvedores, por conta, para todas as chaves.\nDesativada (padrão): qualquer IP pode iniciar saídas com uma chave válida e permissões suficientes.\nAtivada: 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.\nA 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.\nCadastre 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.\nGET /account informa a política. Alterá-la exige a sessão do titular; uma chave de pagamentos não pode remover essa proteção.\n\nVALORES E COTAÇÕES\ncents: inteiro em centavos de BRL. 10000 = R$ 100,00.\nSaldo: 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.\namount em depósitos é string decimal na moeda recebida. Não confunda com USDT ou BRL.\nmax_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.\nPara 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.\n\nIDEMPOTÊNCIA E RETOMADA\nPOST /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.\nMesma 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.\nErros 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.\nResposta nova: 202, Location: /api/v2/operations/{id}, Idempotent-Replayed: false.\nRepetição: 200, Idempotent-Replayed: true.\nreference é uma referência do seu sistema para busca; não substitui Idempotency-Key e não precisa ser única.\n\nESTADOS E POLLING\nGET /operations/{id} retorna o estado financeiro atualizado:\nprocessing: aceito/em processamento; continue consultando.\nreview: resposta do processador exige conciliação; continue consultando. Não refaça o pagamento.\ncompleted: transações concluídas. Consulte E2E e datas em transactions.\nfailed: 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.\nUma 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.\nRespeite 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.\nPaginação comum: limit=1..100 (padrão 25), cursor=next_cursor. Ordem decrescente por ID.\nEventos: 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.\n\nWEBHOOKS OPCIONAIS\nCRUD completo: POST/GET /webhooks, GET/PATCH/DELETE /webhooks/{id}.\nEventos: operation.created, operation.updated, deposit.updated, webhook.test.\noperation.* 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.\nPOST /webhooks/{id}/test enfileira um evento de teste sem movimentar saldo.\nPOST /webhooks/{id}/rotate-secret entrega um segredo novo uma única vez.\nAté 10 endpoints por conta; até 10 chaves ativas por conta.\nCadastre 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.\nDesativar/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.\n\nCALLBACK POR OPERAÇÃO\nEnvie 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.\nWebhook 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.\n\nASSINATURA E ENTREGA\nCabeçalhos: X-CriptoCore-Signature: t=<unix_seconds>,v1=<hex_hmac_sha256>\nX-CriptoCore-Delivery-Id identifica a entrega ao destino.\nAssinatura = HMAC-SHA256(segredo, timestamp + \".\" + corpo JSON cru em UTF-8).\nUse 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.\nLeia os bytes originais antes de qualquer JSON parser: JSON.stringify do objeto recebido pode mudar a assinatura.\nDepois 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.\nNã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.\nFalhas 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.\nGET /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.\n\nLIMITES, ERROS E VERSIONAMENTO\n120 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.\nDinheiro: 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.\nErros 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.\nChaves 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.\nIDs 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.\n\nEXEMPLO CURL\nexport CRIPTOCORE_API_KEY='SUA_CHAVE'\ncurl --fail-with-body https://criptocore.net/api/v2/balances \\\n  -H \"Authorization: Bearer $CRIPTOCORE_API_KEY\"\n\ncurl --fail-with-body https://criptocore.net/api/v2/quotes \\\n  -H \"Authorization: Bearer $CRIPTOCORE_API_KEY\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"operation\":{\"type\":\"pix\",\"cents\":10000,\"key\":\"recebedor@example.com\",\"keyType\":\"EMAIL\"}}'\n\nNa 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.\ncurl --fail-with-body https://criptocore.net/api/v2/operations \\\n  -H \"Authorization: Bearer $CRIPTOCORE_API_KEY\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: pedido-1042-pagamento-01' \\\n  -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\"}'\n\nEXEMPLO NODE.JS: VERIFICAÇÃO DE EVENTO\nimport { createHmac, timingSafeEqual } from 'node:crypto';\nexport function verify(rawBody, signatureHeader, secret, now = Math.floor(Date.now()/1000)) {\n  const match = /^t=(\\d+),v1=([a-f0-9]{64})$/.exec(signatureHeader || '');\n  if (!match || Math.abs(now - Number(match[1])) > 300) return false;\n  const expected = createHmac('sha256', secret).update(match[1] + '.').update(rawBody).digest();\n  const supplied = Buffer.from(match[2], 'hex');\n  return supplied.length === expected.length && timingSafeEqual(supplied, expected);\n}\n// rawBody deve ser Buffer com os bytes originais da requisição.\n// Só após verify=true: JSON.parse(rawBody.toString('utf8')), persistir event.id e retornar 200.\n\nEXEMPLO PYTHON: CONSULTA SEM MOVIMENTAR SALDO\nimport json, os, urllib.request\nrequest = urllib.request.Request(\n    'https://criptocore.net/api/v2/balances',\n    headers={'Authorization': 'Bearer ' + os.environ['CRIPTOCORE_API_KEY']})\nwith urllib.request.urlopen(request, timeout=15) as response:\n    result = json.load(response)\navailable_micros = int(result['data']['available_micros'])\n\nEXEMPLO PYTHON: VERIFICAÇÃO DE EVENTO\nimport hashlib, hmac, re, time\ndef verify(raw_body: bytes, signature_header: str, secret: str) -> bool:\n    match = re.fullmatch(r't=(\\d+),v1=([a-f0-9]{64})', signature_header or '')\n    if not match or abs(time.time() - int(match[1])) > 300:\n        return False\n    expected = hmac.new(secret.encode(), match[1].encode() + b'.' + raw_body, hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, match[2])\n\nORIENTAÇÕES PARA AGENTES DE IA\nLeia 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.\n\nReferências técnicas do contrato:\nOpenAPI 3.1.1: https://spec.openapis.org/oas/v3.1.1.html\nHTTPS/Node.js: https://nodejs.org/api/https.html\nProteção de destinos de webhook: https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html\n",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://criptocore.net/api/v2"
    },
    {
      "key": "api_key",
      "value": ""
    },
    {
      "key": "id",
      "value": ""
    },
    {
      "key": "idempotency_key",
      "value": ""
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Conta",
      "item": [
        {
          "name": "Consultar capacidades disponíveis",
          "request": {
            "method": "GET",
            "description": "Descubra as modalidades implementadas antes de montar sua integração. Uma capacidade implementada ainda pode sofrer pausa operacional ou limites da conta.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/capabilities",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "capabilities"
              ]
            }
          }
        },
        {
          "name": "Consultar conta e política de IP",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/account",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "account"
              ]
            }
          }
        },
        {
          "name": "Consultar saldo disponível",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/balances",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "balances"
              ]
            }
          }
        },
        {
          "name": "Consultar tarifas da conta",
          "request": {
            "method": "GET",
            "description": "As tarifas específicas da conta prevalecem. Para conhecer o custo completo de uma operação, use /quotes.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/fees",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "fees"
              ]
            }
          }
        },
        {
          "name": "Consultar cotação USDT/BRL",
          "request": {
            "method": "GET",
            "description": "Cotação de mercado informativa. O débito inclui o spread e as tarifas da conta.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/market",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "market"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Operações",
      "item": [
        {
          "name": "Simular custo antes de pagar",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/quotes",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "quotes"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"operation\": {\n    \"type\": \"pix\",\n    \"cents\": 10000,\n    \"key\": \"recebedor@example.com\",\n    \"keyType\": \"EMAIL\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Criar uma operação financeira",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_key}}"
              }
            ],
            "url": {
              "raw": "{{base_url}}/operations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "operations"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"operation\": {\n    \"type\": \"pix\",\n    \"cents\": 10000,\n    \"key\": \"recebedor@example.com\",\n    \"keyType\": \"EMAIL\"\n  },\n  \"max_debit_micros\": \"25000000\",\n  \"reference\": \"pedido-1042\",\n  \"metadata\": {\n    \"order_id\": \"1042\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Listar operações da API",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/operations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "operations"
              ]
            }
          }
        },
        {
          "name": "Consultar operação por polling",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/operations/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "operations",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "Ler Pix copia e cola",
          "request": {
            "method": "POST",
            "description": "Consulta dados do favorecido e o valor exigido pelo QR. cents = null permite escolher valor. Não paga.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/pix/decode",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "pix",
                "decode"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"SUBSTITUA\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Consultar boleto",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/boletos/quote",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "boletos",
                "quote"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"SUBSTITUA\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Disponibilidade dos saques cripto",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/withdrawals/crypto",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "withdrawals",
                "crypto"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Depósitos",
      "item": [
        {
          "name": "Listar moedas e redes",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/assets",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "assets"
              ]
            }
          }
        },
        {
          "name": "Obter endereço de depósito",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/deposit-addresses",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "deposit-addresses"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"asset\": \"USDT\",\n  \"network\": \"BSC\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Listar recebimentos cripto",
          "request": {
            "method": "GET",
            "description": "Inclui recebimentos da conta, inclusive ocultados no painel. Para atualizações, consulte o detalhe, /events ou webhook deposit.updated.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/deposits",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "deposits"
              ]
            }
          }
        },
        {
          "name": "Acompanhar depósito",
          "request": {
            "method": "GET",
            "description": "Polling a cada 5 segundos ou mais. Só considere disponível quando status=CREDITED. amount é decimal do ativo; creditedMicros é saldo USDT em micros.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/deposits/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "deposits",
                "{{id}}"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Extrato e cartões",
      "item": [
        {
          "name": "Listar extrato da conta",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/transactions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "transactions"
              ]
            }
          }
        },
        {
          "name": "Consultar lançamento",
          "request": {
            "method": "GET",
            "description": "Aceita o ID público CH-... ou o cursor_id interno retornado na listagem. Sempre limitado à conta da credencial.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/transactions/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "transactions",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "Listar cartões",
          "request": {
            "method": "GET",
            "description": "Retorna dados não sensíveis. Emissão e recarga passam por /operations. PAN/CVV e controles de bloqueio permanecem no painel autenticado.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/cards",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "cards"
              ]
            }
          }
        },
        {
          "name": "Consultar cartão",
          "request": {
            "method": "GET",
            "description": "Consulta saldo e estado sincronizados pelo processador de pagamentos. Não revela PAN ou CVV.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/cards/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "cards",
                "{{id}}"
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "Listar webhooks",
          "request": {
            "method": "GET",
            "description": "Webhooks são opcionais, por conta e compartilhados entre as chaves. Segredos existentes nunca são retornados.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks"
              ]
            }
          }
        },
        {
          "name": "Cadastrar webhook",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://sua-integracao.example/webhooks/criptocore\",\n  \"description\": \"Pedidos\",\n  \"events\": [\n    \"operation.updated\",\n    \"deposit.updated\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Consultar webhook",
          "request": {
            "method": "GET",
            "description": "Retorna configuração sem o segredo de assinatura.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "Atualizar webhook",
          "request": {
            "method": "PATCH",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks",
                "{{id}}"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Remover webhook",
          "request": {
            "method": "DELETE",
            "description": "Remove a configuração ativa e cancela entregas pendentes. Histórico permanece disponível. Eventos em trânsito podem chegar.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks/{{id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks",
                "{{id}}"
              ]
            }
          }
        },
        {
          "name": "Rotacionar segredo",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks/{{id}}/rotate-secret",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks",
                "{{id}}",
                "rotate-secret"
              ]
            }
          }
        },
        {
          "name": "Enviar evento de teste",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/webhooks/{{id}}/test",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "webhooks",
                "{{id}}",
                "test"
              ]
            }
          }
        },
        {
          "name": "Inspecionar entregas e tentativas",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/deliveries",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "deliveries"
              ]
            }
          }
        },
        {
          "name": "Reenviar entrega falhada",
          "request": {
            "method": "POST",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/deliveries/{{id}}/retry",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "deliveries",
                "{{id}}",
                "retry"
              ]
            }
          }
        },
        {
          "name": "Consumir eventos por polling",
          "request": {
            "method": "GET",
            "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.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/events",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "events"
              ]
            }
          }
        }
      ]
    }
  ]
}
