{
	"info": {
		"_postman_id": "lexxen-hub-api-v3",
		"name": "Lexxen Hub API",
		"description": "# Lexxen Hub API\n\nAPI Lexxen Hub via Brasil Bitcoin: envio de cripto, OTC, deposito/saque BRL e wallets de deposito.\n\n## Inicio Rapido\n\n1. Va em **Variables** e preencha `api_key` e `api_secret`\n2. Execute **Testar Autenticacao** (pasta Autenticacao) — deve retornar 200\n\n## Autenticacao\n\nHMAC-SHA256. Headers gerados automaticamente pelo pre-request script:\n- `X-API-Key`: sua API Key\n- `X-Timestamp`: unix timestamp em segundos\n- `X-Signature`: HMAC-SHA256(timestamp + method + path + body, api_secret)\n\n## Modulos\n\n- **🪙 Crypto** — Enviar USDT/BTC/ETH (TRC-20, ERC-20, Polygon). Modo direto ou via BRL com `auto_convert`.\n- **🔁 OTC** — Comprar/vender cripto direto contra saldo (sem envio externo). Fluxo cotar → executar.\n- **💸 Fiat (BRL)** — Deposito (gera QR PIX) e saque PIX. **Mesma titularidade obrigatoria.**\n- **📥 Deposito Cripto** — Gera/lista wallets de deposito por rede.\n- **💵 Saldo** — Consulta unificada.\n- **📡 Webhooks** — CRUD + historico de entregas + retry.\n\n## Idempotency-Key\n\nObrigatorio em POSTs financeiros (gerado automaticamente pelo Postman).\n\n## Webhooks\n\n- `transaction.created` / `approved` / `completed` / `failed`\n- `otc.buy.completed` / `otc.sell.completed` / `otc.failed`\n- `deposit.fiat.received` / `withdraw.fiat.completed`\n- `deposit.crypto.received`\n\nDocumentacao completa: https://cashout.lexxen.com/docs",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"variable": [
		{
			"key": "base_url",
			"value": "https://cashout.lexxen.com/api/v1",
			"description": "URL base da API. Altere para producao quando pronto."
		},
		{
			"key": "api_key",
			"value": "",
			"description": "Sua API Key (ex: lxn_abc123...)"
		},
		{
			"key": "api_secret",
			"value": "",
			"description": "Seu API Secret (usado para gerar HMAC, nunca enviado nos headers)"
		},
		{
			"key": "payout_id",
			"value": "",
			"description": "ID da ultima solicitacao criada (preenchido automaticamente)"
		},
		{
			"key": "webhook_id",
			"value": "",
			"description": "ID do ultimo webhook criado (preenchido automaticamente)"
		},
		{
			"key": "pix_to_wallet_id",
			"value": "",
			"description": "ID da última ordem pix-to-wallet criada (preenchido automaticamente)"
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					"// === HMAC-SHA256 Auto-Sign ===",
					"const apiKey = pm.collectionVariables.get('api_key');",
					"const apiSecret = pm.collectionVariables.get('api_secret');",
					"",
					"if (!apiKey || !apiSecret) {",
					"    console.warn('⚠️  Configure api_key e api_secret nas variaveis da collection!');",
					"    return;",
					"}",
					"",
					"const timestamp = Math.floor(Date.now() / 1000).toString();",
					"const method = pm.request.method;",
					"",
					"// Build path from base_url + request path",
					"const baseUrl = pm.collectionVariables.get('base_url') || 'https://cashout.lexxen.com/api/v1';",
					"const basePath = baseUrl.replace(/^https?:\\/\\/[^\\/]+/, '').replace(/^\\//, '');",
					"const urlParts = pm.request.url.path || [];",
					"let extraPath = urlParts.join('/');",
					"",
					"// Resolve Postman variables in path",
					"const payoutId = pm.collectionVariables.get('payout_id') || '';",
					"const webhookId = pm.collectionVariables.get('webhook_id') || '';",
					"const pixToWalletId = pm.collectionVariables.get('pix_to_wallet_id') || '';",
					"extraPath = extraPath.replace('{{payout_id}}', payoutId).replace('{{webhook_id}}', webhookId).replace('{{pix_to_wallet_id}}', pixToWalletId);",
					"",
					"const path = basePath ? basePath + '/' + extraPath : extraPath;",
					"const body = (pm.request.body && pm.request.body.raw) ? pm.request.body.raw : '';",
					"",
					"const payload = timestamp + method + path + body;",
					"const signature = CryptoJS.HmacSHA256(payload, apiSecret).toString(CryptoJS.enc.Hex);",
					"",
					"pm.request.headers.upsert({ key: 'X-API-Key', value: apiKey });",
					"pm.request.headers.upsert({ key: 'X-Timestamp', value: timestamp });",
					"pm.request.headers.upsert({ key: 'X-Signature', value: signature });",
					"pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' });",
					"pm.request.headers.upsert({ key: 'Accept', value: 'application/json' });",
					"",
					"console.log('🔐 HMAC signed: ' + method + ' ' + path);"
				]
			}
		}
	],
	"item": [
		{
			"name": "🔐 Autenticacao",
			"description": "Teste e documentacao de autenticacao HMAC-SHA256.\n\nOs headers de autenticacao sao gerados automaticamente pelo pre-request script da collection. Basta preencher `api_key` e `api_secret` nas variaveis.",
			"item": [
				{
					"name": "Testar Autenticacao",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Autenticacao OK - Status 200', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    console.log('✅ Autenticacao funcionando! Suas credenciais estao corretas.');",
									"} else {",
									"    console.error('❌ Falha na autenticacao. Verifique api_key e api_secret.');",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/balance",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"balance"
							]
						},
						"description": "**Primeiro passo!** Teste se suas credenciais estao corretas.\n\n1. Va em Variables e preencha `api_key` e `api_secret`\n2. Execute esta request\n3. Se retornar 200 — credenciais OK ✅\n4. Se retornar 401 — verifique as credenciais ❌\n\nOs headers HMAC (X-API-Key, X-Timestamp, X-Signature) sao gerados automaticamente."
					}
				},
				{
					"name": "📖 Como gerar assinatura (referencia)",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/balance",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"balance"
							]
						},
						"description": "# Como gerar a assinatura HMAC-SHA256\n\nA assinatura e gerada usando HMAC-SHA256. O processo e:\n\n## Formula\n```\npayload = timestamp + method + path + body\nsignature = HMAC-SHA256(payload, api_secret)\n```\n\n## Regras\n- **timestamp**: Unix em segundos (window de 60s)\n- **method**: HTTP method em UPPERCASE (GET, POST, DELETE)\n- **path**: SEM barra inicial, SEM query string (ex: `api/v1/balance`)\n- **body**: JSON raw para POST, string vazia para GET/DELETE\n- **Output**: hexadecimal lowercase\n\n## Exemplo GET\n```\ntimestamp = \"1710820800\"\nmethod    = \"GET\"\npath      = \"api/v1/balance\"\nbody      = \"\"\npayload   = \"1710820800GETapi/v1/balance\"\n```\n\n## Exemplo POST\n```\ntimestamp = \"1710820800\"\nmethod    = \"POST\"\npath      = \"api/v1/payouts\"\nbody      = '{\"type\":\"PIX\",\"amount\":100}'\npayload   = '1710820800POSTapi/v1/payouts{\"type\":\"PIX\",\"amount\":100}'\n```\n\n## Codigo Node.js\n```javascript\nconst crypto = require('crypto');\nconst timestamp = Math.floor(Date.now() / 1000).toString();\nconst payload = timestamp + method + path + body;\nconst signature = crypto.createHmac('sha256', apiSecret).update(payload).digest('hex');\n```\n\n## Codigo PHP\n```php\n$timestamp = (string) time();\n$payload = $timestamp . $method . $path . $body;\n$signature = hash_hmac('sha256', $payload, $apiSecret);\n```\n\n## Codigo Python\n```python\nimport hmac, hashlib, time\ntimestamp = str(int(time.time()))\npayload = timestamp + method + path + body\nsignature = hmac.new(api_secret.encode(), payload.encode(), hashlib.sha256).hexdigest()\n```"
					}
				}
			]
		},
		{
			"name": "🪙 Crypto",
			"description": "Operacoes de envio crypto.\n\n## Ativos suportados\n- `USDT` — Tether USD (principal)\n- `BTC` — Bitcoin\n- `ETH` — Ethereum\n\n## Redes suportadas\n| Codigo | Blockchain | Recomendacao |\n|--------|-----------|-------------|\n| `trx` | Tron (TRC-20) | ✅ Recomendado — taxas baixas |\n| `eth` | Ethereum (ERC-20) | Compatibilidade ampla |\n| `polygon` | Polygon | Taxas baixas |\n\n## Dois modos de envio\n1. **Direto**: Enviar X USDT (campo `amount`)\n2. **Via BRL**: Converter R$ X para USDT e enviar (campo `amount_brl`)\n\n## Fluxo\n1. Cotacao (opcional): `GET /crypto/quote`\n2. Criar: `POST /crypto/send`\n3. Aprovar: `POST /payouts/{id}/approve`\n4. Webhook `transaction.completed` com `blockchain_hash`",
			"item": [
				{
					"name": "📊 Cotacao (Quote)",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Cotacao obtida (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var json = pm.response.json();",
									"    var d = json.data;",
									"    console.log('💰 Precos:');",
									"    if (d.prices) {",
									"        console.log('  Market: R$ ' + (d.prices.market || 'N/A'));",
									"        console.log('  Lexxen: R$ ' + (d.prices.lexxen || 'N/A'));",
									"        console.log('  Client: R$ ' + (d.prices.client_final || 'N/A'));",
									"    }",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/crypto/quote?asset=USDT&markup_percent=2&amount_brl=1000&network=trx&quote_type=client_final",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"quote"
							],
							"query": [
								{
									"key": "asset",
									"value": "USDT",
									"description": "Obrigatorio: USDT, BTC ou ETH"
								},
								{
									"key": "markup_percent",
									"value": "2",
									"description": "Opcional: markup do cliente (0-100%)"
								},
								{
									"key": "amount_brl",
									"value": "1000",
									"description": "Opcional: valor BRL para simular conversao"
								},
								{
									"key": "network",
									"value": "trx",
									"description": "Opcional: trx, eth ou polygon"
								},
								{
									"key": "quote_type",
									"value": "client_final",
									"description": "Opcional: market, lexxen ou client_final"
								}
							]
						},
						"description": "Obtem cotacao em tempo real com simulacao de conversao BRL → Crypto.\n\n**Requer autenticacao via API Key (HMAC).**\n\n## Niveis de preco\n| Nivel | Descricao |\n|-------|----------|\n| `market` | Preco puro da exchange (menor) |\n| `lexxen` | Preco com spread da Lexxen |\n| `client_final` | Preco com markup do cliente em cima do lexxen (maior) |\n\n## Parametros\n- `asset` (obrigatorio): `USDT`, `BTC` ou `ETH`\n- `markup_percent` (opcional): percentual de markup (0-100). Default: 0\n- `amount_brl` (opcional): valor em BRL para simular conversao\n- `network` (opcional): `trx`, `eth` ou `polygon`\n- `quote_type` (opcional): `market`, `lexxen` ou `client_final`. Default: `client_final`\n\n## Dica\nUse esta cotacao para mostrar ao usuario final quanto USDT ele vai receber por X reais."
					}
				},
				{
					"name": "1️⃣ Enviar Crypto (direto em USDT)",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.request.headers.upsert({ key: 'Idempotency-Key', value: pm.variables.replaceIn('{{$guid}}') });"
								]
							}
						},
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"if (pm.response.code === 201) {",
									"    var json = pm.response.json();",
									"    if (json.data && json.data.id) {",
									"        pm.collectionVariables.set('payout_id', json.data.id);",
									"        console.log('✅ payout_id salvo: ' + json.data.id);",
									"        console.log('💡 Agora execute \"Aprovar Solicitacao Crypto\" para processar.');",
									"    }",
									"}",
									"",
									"pm.test('Solicitacao crypto criada (201)', function() {",
									"    pm.expect(pm.response.code).to.eql(201);",
									"});",
									"",
									"pm.test('Status PENDING_APPROVAL', function() {",
									"    var json = pm.response.json();",
									"    pm.expect(json.data.status).to.eql('PENDING_APPROVAL');",
									"});"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"amount\": 5,\n  \"asset\": \"USDT\",\n  \"network\": \"trx\",\n  \"destination\": \"TJYeasrz1dvZ3BqKLR...\",\n  \"description\": \"Saque USDT\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/crypto/send",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"send"
							]
						},
						"description": "Envia crypto diretamente especificando a quantidade.\n\n**Header obrigatorio:** `Idempotency-Key` (UUID — gerado automaticamente)\n\n## Campos\n| Campo | Tipo | Obrigatorio | Descricao |\n|-------|------|-------------|----------|\n| `amount` | number | Sim | Quantidade de crypto (min: 0.00000001) |\n| `asset` | string | Sim | `USDT`, `BTC` ou `ETH` |\n| `network` | string | Sim | `trx`, `eth` ou `polygon` |\n| `destination` | string | Sim | Endereco da wallet destino |\n| `description` | string | Nao | Descricao (max 255 chars) |\n\n## Redes e enderecos\n| Rede | Endereco comeca com |\n|------|--------------------|\n| `trx` | `T` (34 chars) |\n| `eth` | `0x` (42 chars) |\n| `polygon` | `0x` (42 chars) |\n\n⚠️ **CUIDADO:** Enviar para endereco na rede errada resulta em perda permanente!\n\n## Status inicial\n`PENDING_APPROVAL` — requer aprovacao\n\n## Webhook disparado\n`transaction.created`"
					}
				},
				{
					"name": "1️⃣ Enviar Crypto (via BRL)",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.request.headers.upsert({ key: 'Idempotency-Key', value: pm.variables.replaceIn('{{$guid}}') });"
								]
							}
						},
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"if (pm.response.code === 201) {",
									"    var json = pm.response.json();",
									"    if (json.data && json.data.id) {",
									"        pm.collectionVariables.set('payout_id', json.data.id);",
									"        console.log('✅ payout_id salvo: ' + json.data.id);",
									"        console.log('💡 Conversao: R$ ' + (json.data.amount_brl || '?') + ' → ' + json.data.amount + ' ' + json.data.asset);",
									"    }",
									"}",
									"",
									"pm.test('Solicitacao crypto via BRL criada (201)', function() {",
									"    pm.expect(pm.response.code).to.eql(201);",
									"});"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"amount_brl\": 1000,\n  \"asset\": \"USDT\",\n  \"network\": \"trx\",\n  \"destination\": \"TJYeasrz1dvZ3BqKLR...\",\n  \"markup_percent\": 2,\n  \"quote_type\": \"client_final\",\n  \"auto_convert\": true,\n  \"description\": \"Saque via BRL\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/crypto/send",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"send"
							]
						},
						"description": "Envia crypto convertendo BRL automaticamente usando cotacao em tempo real.\n\n**Header obrigatorio:** `Idempotency-Key` (UUID — gerado automaticamente)\n\n## Campos\n| Campo | Tipo | Obrigatorio | Descricao |\n|-------|------|-------------|----------|\n| `amount_brl` | number | Sim | Valor em BRL para converter (min: 0.01) |\n| `asset` | string | Sim | `USDT`, `BTC` ou `ETH` |\n| `network` | string | Sim | `trx`, `eth` ou `polygon` |\n| `destination` | string | Sim | Endereco da wallet destino |\n| `markup_percent` | number | Nao | Markup % sobre preco Lexxen (0-100) |\n| `quote_type` | string | Nao | `market`, `lexxen` ou `client_final` |\n| `auto_convert` | boolean | Nao | Se `true` e nao houver USDT, converte BRL→USDT via OTC antes de enviar. **Exige amount_brl >= 80,00** |\n| `description` | string | Nao | Descricao (max 255 chars) |\n\n## Como funciona\n1. API consulta cotacao em tempo real\n2. Converte BRL → USDT usando preco do `quote_type` escolhido\n3. Cria solicitacao com `amount` em crypto calculado\n\n## Auto-conversao (auto_convert: true)\n- **Minimo: R$ 80,00 em `amount_brl`** (limite OTC do provider)\n- Se voce ja tem saldo USDT suficiente: envia direto\n- Se falta USDT mas tem BRL: roda OTC (BRL→USDT) e depois envia\n- Se nem USDT nem BRL: retorna `INSUFFICIENT_BALANCE`\n- Detalhes da conversao retornam no webhook em `auto_conversion`\n\n## Erros possiveis\n| Status | Mensagem | Causa |\n|--------|----------|-------|\n| 422 | `Valor minimo para auto_convert (OTC) e R$ 80,00.` | amount_brl < 80 com auto_convert=true |\n| 422 | `Saldo insuficiente para aprovar` | USDT + BRL nao cobrem o valor |\n| 422 | `Falha na cotacao: ...` | Erro temporario na cotacao |\n| 500 | `Auto-conversao falhou na cotacao OTC: ...` | Provider nao retornou cotacao |\n| 500 | `Auto-conversao falhou ao executar OTC: ...` | Cotacao expirada ou saldo BRL insuficiente |\n\n## Exemplo\nR$ 1.000 com USDT a R$ 5,20 (client_final) → 192.30769230 USDT\n\n⚠️ Envie `amount` OU `amount_brl`, nunca ambos."
					}
				},
				{
					"name": "2️⃣ Aprovar Solicitacao Crypto",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.request.headers.upsert({ key: 'Idempotency-Key', value: pm.variables.replaceIn('{{$guid}}') });"
								]
							}
						},
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Solicitacao crypto aprovada (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    console.log('✅ Aprovada! Processamento iniciado na fila.');",
									"    console.log('📡 Webhook transaction.approved disparado.');",
									"    console.log('⏳ Apos processamento: transaction.completed (com blockchain hash)');",
									"    console.log('💡 Use \"Status Transacao (Hash)\" para acompanhar o hash.');",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"url": {
							"raw": "{{base_url}}/payouts/{{payout_id}}/approve",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"payouts",
								"{{payout_id}}",
								"approve"
							]
						},
						"description": "Aprova uma solicitacao crypto e envia para processamento.\n\n**Header obrigatorio:** `Idempotency-Key` (UUID — gerado automaticamente)\n\n## Pre-requisitos\n- Solicitacao em status `PENDING_APPROVAL`\n- Saldo >= amount + fee (taxa configurada, ex: 2 USDT)\n\n## Fluxo apos aprovacao\n```\nAPPROVED → PROCESSING → COMPLETED\n```\n\n## Como funciona (crypto)\n1. Aprovacao despacha transacao para fila assincrona\n2. Provider processa o envio\n3. Sistema inicia polling do hash (1x/min, ate 30 tentativas)\n4. Webhook `transaction.completed` enviado com `blockchain_hash` e `blockchain_explorer`\n\n## Webhooks\n- `transaction.approved` — imediato\n- `transaction.completed` — apos hash ser encontrado (pode levar minutos)\n\n## Taxas (exemplo com 2 USDT configurado)\n```\nValor enviado:  5 USDT (destinatario recebe 5 USDT limpo)\nProvider fee:   1 USDT (rede blockchain)\nLexxen fee:     1 USDT (transferido via P2P)\nTotal debitado: 7 USDT\n```"
					}
				},
				{
					"name": "🔍 Status Transacao (Hash)",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Status obtido (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var json = pm.response.json();",
									"    var d = json.data;",
									"    console.log('Status: ' + d.status);",
									"    console.log('Hash: ' + (d.hash || '⏳ Aguardando...'));",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/crypto/status/{{payout_id}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"status",
								"{{payout_id}}"
							]
						},
						"description": "Consulta o status atualizado de uma transacao crypto diretamente no provider.\n\n## Retorna\n- `status` — status no provider (pending, completed, etc)\n- `hash` — hash da transacao na blockchain (null se ainda nao confirmada)\n- `amount`, `coin`, `network`, `fee`\n\n## Quando usar\n- Webhook `transaction.completed` veio com `blockchain_hash: null`\n- Voce quer verificar manualmente se o hash ja esta disponivel\n- Debugging de transacoes\n\n## Dica\nO hash geralmente fica disponivel dentro de 1-5 minutos apos o envio."
					}
				},
				{
					"name": "📋 Listar Solicitacoes Crypto",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/payouts?type=CRYPTO",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"payouts"
							],
							"query": [
								{
									"key": "type",
									"value": "CRYPTO"
								}
							]
						},
						"description": "Lista todas as solicitacoes crypto com paginacao."
					}
				},
				{
					"name": "💼 Listar Wallets",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/crypto/wallets",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"wallets"
							]
						},
						"description": "Retorna as wallets disponiveis para operacao.\n\nUtil para verificar quais enderecos e ativos estao configurados."
					}
				},
				{
					"name": "💰 Saldo Crypto",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Saldo obtido (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var json = pm.response.json();",
									"    if (json.data && json.data.balances) {",
									"        json.data.balances.forEach(function(b) {",
									"            console.log(b.asset + ': ' + b.available + ' disponivel (free: ' + b.free + ', pending_fees: ' + b.pending_fees + ')');",
									"        });",
									"    }",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/crypto/balance",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"balance"
							]
						},
						"description": "Retorna saldo detalhado de crypto.\n\n## Campos por ativo\n| Campo | Descricao |\n|-------|----------|\n| `free` | Saldo total no provider |\n| `pending_fees` | Taxas pendentes de cobranca |\n| `available` | Saldo disponivel (free - pending_fees) |\n\nSomente ativos com saldo > 0 sao retornados."
					}
				}
			]
		},
		{
			"name": "🔁 OTC (Compra/Venda)",
			"description": "Comprar e vender cripto direto contra o saldo (sem envio externo).\n\nFluxo em 2 passos: cotar (`/quote`) e executar (`/execute`).\n\n- Cotacao expira em 5 segundos\n- Valor minimo: R$ 80,00\n- `markup_percent` = lucro do tenant na moeda destino\n- Webhooks: `otc.buy.completed`, `otc.sell.completed`, `otc.failed`",
			"item": [
				{
					"name": "1️⃣ Cotar Compra (BRL→Cripto)",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"asset\": \"USDT\",\n  \"amount_brl\": 1000.00,\n  \"markup_percent\": 1.5\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/otc/buy/quote",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"otc",
								"buy",
								"quote"
							]
						},
						"description": "Gera uma cotacao de compra de cripto usando BRL.\n\n**Body**\n| Campo | Tipo | Obrig. | Descricao |\n|-------|------|--------|-----------|\n| `asset` | string | Sim | `USDT`, `BTC` ou `ETH` |\n| `amount_brl` | number | Sim | Total BRL (min: 80,00) |\n| `markup_percent` | number | Nao | Lucro do tenant (0-100) |\n\n**Resposta:** `quote_id`, `expires_at` (5s), `price`, `price_with_markup`, `amount_crypto` bruto, `markup_amount`, `net_amount`.\n\n## Niveis de preco (voce sobe um nivel em cima da Lexxen)\n- `price` = **o que a Lexxen cobra de voce** por unidade (nosso custo no provider)\n- `price_with_markup` = `price * (1 + markup_percent/100)` = **o que voce cobra do seu usuario final**\n- `markup_amount` = seu lucro absoluto na moeda destino (USDT na compra, BRL na venda)\n- `net_amount` = gross - markup_amount = quanto vai pro saldo do tenant\n\n**Exemplo:** `price=5.85`, `markup_percent=1.5` -> `price_with_markup=5.93775`. Com `amount_brl=1000`: lucro 2,564 USDT, liquido 168,376 USDT.\n\nGuarde o `quote_id` e chame `/buy/execute` em ate 5 segundos."
					}
				},
				{
					"name": "2️⃣ Executar Compra",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"quote_id\": \"COLE_O_QUOTE_ID_AQUI\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/otc/buy/execute",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"otc",
								"buy",
								"execute"
							]
						},
						"description": "Executa a cotacao de compra. Debita BRL, credita `net_amount` USDT no saldo. `markup_amount` retido como lucro.\n\nDispara webhook `otc.buy.completed` com todos os detalhes."
					}
				},
				{
					"name": "1️⃣ Cotar Venda (Cripto→BRL)",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"asset\": \"USDT\",\n  \"amount\": 100.00,\n  \"markup_percent\": 1.5\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/otc/sell/quote",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"otc",
								"sell",
								"quote"
							]
						},
						"description": "Cotacao de venda. `amount` em cripto, retorno tem `amount_brl` que voce vai receber bruto, `markup_amount` (BRL) e `net_amount` (BRL liquido)."
					}
				},
				{
					"name": "2️⃣ Executar Venda",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"quote_id\": \"COLE_O_QUOTE_ID_AQUI\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/otc/sell/execute",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"otc",
								"sell",
								"execute"
							]
						},
						"description": "Executa a cotacao de venda. Debita cripto, credita `net_amount` BRL.\n\nDispara webhook `otc.sell.completed`."
					}
				},
				{
					"name": "🔍 Detalhes da Cotacao",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/otc/quotes/COLE_O_QUOTE_ID_AQUI",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"otc",
								"quotes",
								"COLE_O_QUOTE_ID_AQUI"
							]
						},
						"description": "Retorna o status atual da cotacao (`pending`, `executed`, `expired`, `failed`) e todos os detalhes."
					}
				}
			]
		},
		{
			"name": "💸 Fiat (BRL via PIX)",
			"description": "Deposito e saque de BRL via PIX usando Brasil Bitcoin.\n\n**Mesma titularidade obrigatoria** &mdash; tanto pagador (deposito) quanto titular da chave PIX (saque) precisam ter o mesmo CPF/CNPJ do tenant.\n\nWebhooks: `deposit.fiat.received`, `withdraw.fiat.completed`",
			"item": [
				{
					"name": "📥 Gerar QR Code de Deposito",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"value\": 250.00,\n  \"payer_document\": \"12312312323\",\n  \"custom_id\": \"pedido-9421\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/fiat/deposit",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"deposit"
							]
						},
						"description": "Gera QR Code PIX para receber BRL na conta do tenant.\n\n**Body**\n| Campo | Tipo | Obrig. | Descricao |\n|-------|------|--------|-----------|\n| `value` | number | Sim | Valor BRL (min: 1,00) |\n| `payer_document` | string | Sim | CPF/CNPJ do pagador (= tenant.document) |\n| `custom_id` | string | Nao | ID interno para correlacao |\n\nRetorna `payment_string` (copia-e-cola) e `qr_code` (base64 PNG). Quando o PIX cair, dispara webhook `deposit.fiat.received`.\n\n**Erros**\n- 422 `SAME_HOLDER_REQUIRED` &mdash; documento informado != tenant.document\n- 502 `PROVIDER_ERROR` &mdash; falha na Brasil Bitcoin"
					}
				},
				{
					"name": "📋 Listar Depositos",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/fiat/deposits",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"deposits"
							]
						}
					}
				},
				{
					"name": "🔍 Detalhes do Deposito",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/fiat/deposits/COLE_O_ID_AQUI",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"deposits",
								"COLE_O_ID_AQUI"
							]
						}
					}
				},
				{
					"name": "📤 Saque PIX (mesma titularidade)",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"value\": 100.00,\n  \"pix_key\": \"12312312323\",\n  \"holder_document\": \"12312312323\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/fiat/withdraw",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"withdraw"
							]
						},
						"description": "Saque PIX em BRL para chave de mesma titularidade.\n\n**Body**\n| Campo | Tipo | Obrig. | Descricao |\n|-------|------|--------|-----------|\n| `value` | number | Sim | Valor BRL |\n| `pix_key` | string | Sim | Chave PIX destino (CPF, CNPJ, email, telefone, EVP) |\n| `holder_document` | string | Sim | CPF/CNPJ do titular da chave (= tenant.document) |\n\nValida documento + saldo BRL antes de chamar o provider. Dispara webhook `withdraw.fiat.completed`.\n\n**Erros**\n- 422 `SAME_HOLDER_REQUIRED`\n- 422 `INSUFFICIENT_BALANCE`\n- 502 `PROVIDER_ERROR`"
					}
				},
				{
					"name": "📋 Listar Saques",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/fiat/withdrawals",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"withdrawals"
							]
						}
					}
				},
				{
					"name": "🔍 Detalhes do Saque",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/fiat/withdrawals/COLE_O_ID_AQUI",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"fiat",
								"withdrawals",
								"COLE_O_ID_AQUI"
							]
						}
					}
				}
			]
		},
		{
			"name": "🚀 PIX-to-Wallet",
			"description": "Rota agregadora: BRL via PIX → cripto → wallet externa, com aprovação humana.\n\n**Fluxo:**\n1. Criar ordem (gera QR PIX) → status `AWAITING_DEPOSIT`\n2. Pagador faz o PIX → webhook `pix_to_wallet.deposit_received` → ordem em `PENDING_APPROVAL`\n3. Aprovar → cota OTC + envia cripto → webhook `pix_to_wallet.completed` com `blockchain_hash`\n\n**Slippage:** `min_amount_out` é piso de proteção. Se a cotação retornar abaixo, ordem vai para `FAILED_POST_DEPOSIT` e BRL fica como saldo do tenant.",
			"item": [
				{
					"name": "1️⃣ Criar Ordem (gera QR PIX)",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Ordem criada (201)', function() {",
									"    pm.expect(pm.response.code).to.eql(201);",
									"});",
									"",
									"if (pm.response.code === 201) {",
									"    var json = pm.response.json();",
									"    var d = json.data;",
									"    pm.collectionVariables.set('pix_to_wallet_id', d.id);",
									"    console.log('✅ Ordem criada: ' + d.id);",
									"    console.log('   Status: ' + d.status);",
									"    console.log('   PIX copia-e-cola: ' + (d.pix && d.pix.payment_string ? d.pix.payment_string.substring(0, 40) + '...' : 'N/A'));",
									"    console.log('   custom_id (BB): ' + (d.pix && d.pix.custom_id));",
									"    console.log('   expires_at: ' + d.expires_at);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Idempotency-Key",
								"value": "{{$guid}}",
								"description": "Obrigatório. UUID gerado a cada request (replay retorna mesma resposta em 24h)."
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"amount_brl\": 1500.00,\n  \"asset\": \"USDT\",\n  \"network\": \"trx\",\n  \"destination_address\": \"TXY1234567890wallet\",\n  \"min_amount_out\": \"499.50\",\n  \"markup_percent\": 0.5,\n  \"description\": \"Order #4231\",\n  \"expires_in_seconds\": 86400\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/pix-to-wallet",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"pix-to-wallet"
							]
						},
						"description": "Cria ordem pix-to-wallet e retorna QR Code PIX para pagamento.\n\n## Body\n- `amount_brl` (numeric, min R$ 80, **required**) — valor esperado em BRL.\n- `asset` (`USDT|BTC|ETH`, **required**) — cripto alvo da conversão.\n- `network` (`trx|eth|polygon`, **required**) — rede do envio.\n- `destination_address` (string sem espaços, max 255, **required**) — wallet externa.\n- `min_amount_out` (numeric > 0, **required**) — piso de slippage. Cotação abaixo desse valor falha com `failure_reason=SLIPPAGE`.\n- `markup_percent` (numeric 0-100, opcional)\n- `description` (string max 255, opcional)\n- `expires_in_seconds` (integer 300-259200, opcional, default 86400 = 24h)\n\n## Headers obrigatórios\n- `Idempotency-Key` — UUID. Replays em até 24h retornam a mesma resposta.\n\n## Response 201\nRetorna `data.pix.qr_code` (base64) e `data.pix.payment_string` (copia-e-cola). Use o `custom_id` para amarrar com o webhook BB."
					}
				},
				{
					"name": "2️⃣ Aprovar Ordem (após PIX cair)",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Ordem aprovada (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var d = pm.response.json().data;",
									"    console.log('✅ Aprovada: ' + d.id + ' | status=' + d.status);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Idempotency-Key",
								"value": "{{$guid}}",
								"description": "Obrigatório."
							}
						],
						"body": {
							"mode": "raw",
							"raw": "",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/pix-to-wallet/{{pix_to_wallet_id}}/approve",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"pix-to-wallet",
								"{{pix_to_wallet_id}}",
								"approve"
							]
						},
						"description": "Aprova manualmente a conversão+envio. Pré-condição: ordem em `PENDING_APPROVAL` (PIX já caiu).\n\nA aprovação enfileira `ProcessPixToWalletJob` que cota OTC, valida slippage contra `min_amount_out`, consome a quote no provider e envia a cripto para a wallet de destino.\n\n## Erros\n- `404 ORDER_NOT_FOUND`\n- `409 INVALID_STATE` — ordem não está em PENDING_APPROVAL"
					}
				},
				{
					"name": "3️⃣ Rejeitar Ordem",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Idempotency-Key",
								"value": "{{$guid}}",
								"description": "Obrigatório."
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"reason\": \"Tenant cancelou apos verificar valor\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/pix-to-wallet/{{pix_to_wallet_id}}/reject",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"pix-to-wallet",
								"{{pix_to_wallet_id}}",
								"reject"
							]
						},
						"description": "Rejeita a ordem ainda em `PENDING_APPROVAL`. **NÃO faz refund automático** — o BRL já creditado fica como saldo do tenant (consultável via `GET /v1/balance`).\n\n## Body\n- `reason` (string, max 255, opcional)"
					}
				},
				{
					"name": "🔍 Consultar Ordem",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/pix-to-wallet/{{pix_to_wallet_id}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"pix-to-wallet",
								"{{pix_to_wallet_id}}"
							]
						},
						"description": "Detalhe completo da ordem: status, fiat_deposit_id, otc_quote_id, transaction_request_id, provider_send_id, blockchain_hash, failure_reason, e timestamps de cada transição."
					}
				},
				{
					"name": "📋 Listar Ordens",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/pix-to-wallet?status=PENDING_APPROVAL&per_page=15",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"pix-to-wallet"
							],
							"query": [
								{
									"key": "status",
									"value": "PENDING_APPROVAL",
									"description": "Opcional. AWAITING_DEPOSIT | PENDING_APPROVAL | APPROVED | PROCESSING | COMPLETED | REJECTED | EXPIRED | FAILED_POST_DEPOSIT"
								},
								{
									"key": "asset",
									"value": "USDT",
									"description": "Opcional. USDT | BTC | ETH",
									"disabled": true
								},
								{
									"key": "from",
									"value": "2026-05-01",
									"description": "Opcional. Data inicial (>=).",
									"disabled": true
								},
								{
									"key": "to",
									"value": "2026-05-31",
									"description": "Opcional. Data final (<=).",
									"disabled": true
								},
								{
									"key": "per_page",
									"value": "15",
									"description": "Default 15, max 100."
								}
							]
						},
						"description": "Listagem paginada das ordens do tenant. Filtros: `status`, `asset`, `from`, `to`, `per_page`."
					}
				}
			]
		},
		{
			"name": "📥 Deposito Cripto",
			"description": "Receber cripto na sua conta. A wallet e por **rede** (TRC20 atende USDT/USDC/etc na Tron, etc).\n\nWebhook: `deposit.crypto.received` quando algo cair na wallet.",
			"item": [
				{
					"name": "🆕 Obter ou Gerar Endereco",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"coin\": \"USDT\",\n  \"network\": \"trx\"\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/crypto/wallets/address",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"crypto",
								"wallets",
								"address"
							]
						},
						"description": "Se ja existe wallet para a rede, devolve o endereco. Senao, cria via provider e devolve.\n\nResposta tem `created: true|false` indicando se acabou de gerar."
					}
				}
			]
		},
		{
			"name": "💵 Saldo",
			"description": "Consulta de saldo unificado.",
			"item": [
				{
					"name": "Saldo Unificado",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Saldo obtido (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/balance",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"balance"
							]
						},
						"description": "Retorna o saldo unificado:\n- **PIX**: saldo em BRL\n- **Crypto**: saldos por ativo (USDT, BTC, ETH)\n\nUse esta chamada para uma visao geral rapida de todos os fundos."
					}
				}
			]
		},
		{
			"name": "📡 Webhooks",
			"description": "Gerenciamento de webhooks para receber notificacoes de eventos.\n\n## Eventos disponiveis\n| Evento | Quando |\n|--------|--------|\n| `transaction.created` | Solicitacao criada |\n| `transaction.approved` | Solicitacao aprovada |\n| `transaction.completed` | Transacao concluida (crypto: com hash) |\n| `transaction.failed` | Transacao falhou |\n\n## Validacao de assinatura\nTodo webhook inclui `X-Webhook-Signature` (HMAC-SHA256 do body).\nValide usando o `secret` retornado ao criar o webhook.\n\n## Retentativas\n6 tentativas: imediata → 10s → 30s → 1min → 5min → 15min\n\nSeu endpoint deve retornar HTTP 2xx em ate 15 segundos.",
			"item": [
				{
					"name": "Criar Webhook",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"if (pm.response.code === 201) {",
									"    var json = pm.response.json();",
									"    if (json.data && json.data.id) {",
									"        pm.collectionVariables.set('webhook_id', json.data.id);",
									"        console.log('✅ webhook_id salvo: ' + json.data.id);",
									"    }",
									"    if (json.secret) {",
									"        console.log('🔑 GUARDE O SECRET! Ele nao sera exibido novamente:');",
									"        console.log('   Secret: ' + json.secret);",
									"    }",
									"}",
									"",
									"pm.test('Webhook criado (201)', function() {",
									"    pm.expect(pm.response.code).to.eql(201);",
									"});"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"url\": \"https://seu-servidor.com/webhook\",\n  \"events\": [\n    \"transaction.created\",\n    \"transaction.approved\",\n    \"transaction.completed\",\n    \"transaction.failed\"\n  ]\n}",
							"options": {
								"raw": {
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{base_url}}/webhooks",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks"
							]
						},
						"description": "Cria um webhook para receber notificacoes de eventos.\n\n## Campos\n| Campo | Tipo | Obrigatorio | Descricao |\n|-------|------|-------------|----------|\n| `url` | string | Sim | URL HTTPS do seu endpoint |\n| `events` | array | Nao | Eventos para escutar (todos se omitido) |\n\n## Eventos disponiveis\n- `transaction.created` — solicitacao criada (PENDING_APPROVAL)\n- `transaction.approved` — solicitacao aprovada (APPROVED)\n- `transaction.completed` — transacao concluida (COMPLETED)\n- `transaction.failed` — transacao falhou (FAILED)\n\n## Resposta\nInclui o `secret` para validacao de assinatura.\n\n⚠️ **IMPORTANTE:** Guarde o `secret` — ele nao sera exibido novamente!\n\n## Validacao\nTodo webhook enviado inclui:\n- `X-Webhook-Signature`: HMAC-SHA256(body, secret)\n- `X-Webhook-Event`: nome do evento\n\nValide a assinatura antes de processar o webhook."
					}
				},
				{
					"name": "Listar Webhooks",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/webhooks",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks"
							]
						},
						"description": "Lista todos os webhooks cadastrados com seus eventos e status."
					}
				},
				{
					"name": "Detalhes Webhook",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/webhooks/{{webhook_id}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks",
								"{{webhook_id}}"
							]
						},
						"description": "Retorna detalhes de um webhook incluindo:\n- URL e eventos configurados\n- Status (ativo/inativo)\n- Historico de entregas (com response codes e timestamps)"
					}
				},
				{
					"name": "Remover Webhook",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{base_url}}/webhooks/{{webhook_id}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks",
								"{{webhook_id}}"
							]
						},
						"description": "Remove um webhook. As notificacoes para este endpoint serao interrompidas imediatamente.\n\n**Resposta:** 204 No Content"
					}
				},
				{
					"name": "📋 Historico de Entregas",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Entregas listadas (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var json = pm.response.json();",
									"    var deliveries = json.data || [];",
									"    console.log('Total de entregas: ' + deliveries.length);",
									"    deliveries.forEach(function(d) {",
									"        var status = d.delivered_at ? '✅' : '❌';",
									"        console.log(status + ' [' + d.event + '] HTTP ' + (d.response_code || 'N/A') + ' - ID: ' + d.id);",
									"    });",
									"    if (deliveries.length > 0) {",
									"        console.log('💡 Para redisparar, use \"Redisparar Webhook\" com o delivery ID.');",
									"    }",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/webhooks/{{webhook_id}}/deliveries",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks",
								"{{webhook_id}}",
								"deliveries"
							]
						},
						"description": "Lista o historico de entregas de um webhook.\n\nRetorna as ultimas 100 entregas com:\n- `id` — ID da entrega (usar no retry)\n- `event` — evento (transaction.created, etc)\n- `response_code` — HTTP status do seu servidor\n- `attempts` — numero de tentativas\n- `delivered_at` — data/hora da entrega (null = nao entregue)\n- `payload` — dados enviados no webhook\n- `created_at` — quando foi criado\n\n## Quando usar\n- Debuggar problemas de entrega\n- Verificar quais eventos foram enviados\n- Encontrar o `id` de uma entrega para redisparar"
					}
				},
				{
					"name": "🔄 Redisparar Webhook",
					"event": [
						{
							"listen": "test",
							"script": {
								"type": "text/javascript",
								"exec": [
									"pm.test('Webhook redisparado (200)', function() {",
									"    pm.expect(pm.response.code).to.eql(200);",
									"});",
									"",
									"if (pm.response.code === 200) {",
									"    var json = pm.response.json();",
									"    console.log('✅ ' + json.message);",
									"    console.log('Evento: ' + json.event);",
									"}"
								]
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"url": {
							"raw": "{{base_url}}/webhooks/{{webhook_id}}/deliveries/1/retry",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"webhooks",
								"{{webhook_id}}",
								"deliveries",
								"1",
								"retry"
							]
						},
						"description": "Redispara um webhook que falhou ou que voce quer reenviar.\n\n## Como usar\n1. Liste entregas: `GET /webhooks/{id}/deliveries`\n2. Copie o `id` da entrega que quer reenviar\n3. Substitua o `1` na URL pelo ID da entrega\n4. Execute esta request\n\nO webhook sera reenviado com o **mesmo evento e payload** original.\n\n## Quando usar\n- Seu endpoint estava fora do ar e perdeu webhooks\n- Voce quer reprocessar um evento no seu sistema\n- Debug de integracao"
					}
				}
			]
		}
	]
}
