{"openapi":"3.1.0","info":{"title":"GhostPay Mesh API","description":"\n## GhostPay Mesh — API de Pagamentos Offline Criptográficos\n\nSistema de pagamentos e transferências **offline-first**, criptografado de ponta a ponta, \ncom **anonimato forte** e liquidação posterior automática.\n\n### Conceito\nO sistema transfere **Promessas de Liquidação Criptográficas (PLC)** — títulos digitais \ncriptografados que circulam offline via BLE, NFC ou QR Code.\n\n### Criptografia\n- **Ed25519** — Assinaturas digitais\n- **XChaCha20-Poly1305** — Encriptação de payload\n- **SHA-256** — Hashing e encadeamento\n\n### Autenticação\nTodas as requisições que criam/modificam PLCs devem incluir o header `X-Device-ID`.\n\n### Limites\n- Máximo por PLC: per internal configuration\n- Limite diário: per configuration\n- TTL: 1h a 168h (7 dias)\n\n### Suporte\n- Documentação: Este Swagger + Portal Web\n- Realtime: Supabase Broadcast\n- Webhooks: Pix, Boleto, Supabase\n    ","version":"0.1.0"},"paths":{"/api/v1/plc/create":{"post":{"tags":["PLC"],"summary":"Create Plc","description":"Cria nova Promessa de Liquidação Criptográfica.","operationId":"create_plc_api_v1_plc_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePLCRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePLCResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/limits/{device_id}":{"get":{"tags":["PLC"],"summary":"Get Plc Limits","description":"Limite efetivo progressivo (score + volume) para o dispositivo.","operationId":"get_plc_limits_api_v1_plc_limits__device_id__get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/limits/increase-request":{"post":{"tags":["PLC"],"summary":"Request Plc Limit Increase","description":"Solicita aumento acima do teto automático (requer análise admin).","operationId":"request_plc_limit_increase_api_v1_plc_limits_increase_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LimitIncreaseBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/issuer/{issuer_pubkey}/active":{"get":{"tags":["PLC"],"summary":"List Active Plcs For Issuer","description":"Lista PLCs ativas do emissor — recuperação quando o create commitou\nmas a resposta não chegou ao app.","operationId":"list_active_plcs_for_issuer_api_v1_plc_issuer__issuer_pubkey__active_get","parameters":[{"name":"issuer_pubkey","in":"path","required":true,"schema":{"type":"string","title":"Issuer Pubkey"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/{token_id}/status":{"get":{"tags":["PLC"],"summary":"Get Plc Status","description":"Obtém status de uma PLC.","operationId":"get_plc_status_api_v1_plc__token_id__status_get","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PLCStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/{token_id}/chain":{"get":{"tags":["PLC"],"summary":"Get Plc Chain","description":"Obtém cadeia de transferências de uma PLC.","operationId":"get_plc_chain_api_v1_plc__token_id__chain_get","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChainEntry"},"title":"Response Get Plc Chain Api V1 Plc  Token Id  Chain Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plc/{token_id}/cancel":{"post":{"tags":["PLC"],"summary":"Cancel Plc","description":"Cancela uma PLC ativa. Apenas o emissor ou portador atual pode cancelar.\nO valor volta para o saldo disponível (PROMISED → AVAILABLE).\nSó pode cancelar PLCs com status ISSUED (não transferidas/resgatadas).","operationId":"cancel_plc_api_v1_plc__token_id__cancel_post","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelPLCRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/transfer/":{"post":{"tags":["Transfer"],"summary":"Transfer Plc","description":"Registra transferência de PLC entre portadores.","operationId":"transfer_plc_api_v1_transfer__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferPLCRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferPLCResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redeem/":{"post":{"tags":["Redemption"],"summary":"Redeem Plc","description":"Resgata PLC - inicia processo de liquidação.","operationId":"redeem_plc_api_v1_redeem__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPLCRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPLCResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["Admin"],"summary":"Get Stats","description":"Dashboard: estatísticas gerais do sistema.","operationId":"get_stats_api_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/plcs":{"get":{"tags":["Admin"],"summary":"List Plcs","description":"Lista PLCs com filtro opcional por status.","operationId":"list_plcs_api_v1_admin_plcs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plcs/{token_id}/detail":{"get":{"tags":["Admin"],"summary":"Get Plc Detail","description":"Detalhes completos de uma PLC incluindo cadeia.","operationId":"get_plc_detail_api_v1_admin_plcs__token_id__detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/risk-flags":{"get":{"tags":["Admin"],"summary":"List Risk Flags","description":"Lista flags de risco.","operationId":"list_risk_flags_api_v1_admin_risk_flags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"resolved","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Resolved"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RiskFlagResponse"},"title":"Response List Risk Flags Api V1 Admin Risk Flags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/risk-flags/{flag_id}/resolve":{"post":{"tags":["Admin"],"summary":"Resolve Risk Flag","description":"Marca flag de risco como resolvida.","operationId":"resolve_risk_flag_api_v1_admin_risk_flags__flag_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"flag_id","in":"path","required":true,"schema":{"type":"string","title":"Flag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/expire-tokens":{"post":{"tags":["Admin"],"summary":"Expire Tokens","description":"Expira PLCs vencidas (com ledger, locks e risk flags).","operationId":"expire_tokens_api_v1_admin_expire_tokens_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/generate-keypair":{"get":{"tags":["Admin"],"summary":"Generate Keypair","description":"Gera par de chaves Ed25519 (para testes).","operationId":"generate_keypair_api_v1_admin_generate_keypair_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ledger/transactions":{"get":{"tags":["Admin"],"summary":"List Ledger Transactions","description":"Lista transações do ledger com filtros.","operationId":"list_ledger_transactions_api_v1_admin_ledger_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tx_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Type"}},{"name":"reference_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/ledger/accounts":{"get":{"tags":["Admin"],"summary":"List Accounts","description":"Lista todas as contas com snapshots de saldo.","operationId":"list_accounts_api_v1_admin_ledger_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ledger/stats":{"get":{"tags":["Admin"],"summary":"Ledger Stats","description":"KPIs do ledger.","operationId":"ledger_stats_api_v1_admin_ledger_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/redemptions":{"get":{"tags":["Admin"],"summary":"List Redemptions","description":"Lista redemptions com filtros.","operationId":"list_redemptions_api_v1_admin_redemptions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/webhooks":{"get":{"tags":["Admin"],"summary":"List Webhooks","description":"Lista eventos de webhook recebidos.","operationId":"list_webhooks_api_v1_admin_webhooks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounts/{account_id}/freeze":{"post":{"tags":["Admin"],"summary":"Freeze Account","description":"Congela uma conta (FROZEN).","operationId":"freeze_account_api_v1_admin_accounts__account_id__freeze_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/accounts/{account_id}/unfreeze":{"post":{"tags":["Admin"],"summary":"Unfreeze Account","description":"Descongela uma conta (ACTIVE).","operationId":"unfreeze_account_api_v1_admin_accounts__account_id__unfreeze_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/pending-payments":{"post":{"tags":["Admin"],"summary":"Reconcile Pending Payments","description":"Reconcilia pagamentos PENDING_PAYMENT verificando status real no ASAAS.\nPara pagamentos RECEIVED/CONFIRMED no ASAAS, executa settlement no ledger.\nPara pagamentos OVERDUE/REFUNDED, marca como FAILED e reverte PLC.","operationId":"reconcile_pending_payments_api_v1_admin_reconcile_pending_payments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"Se True, apenas mostra o que seria feito","default":true,"title":"Dry Run"},"description":"Se True, apenas mostra o que seria feito"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/fix-balance/{owner_id}":{"post":{"tags":["Admin"],"summary":"Fix Balance","description":"Recalcula snapshot de saldo a partir das entries do ledger.\nCorrige inconsistências de snapshot.","operationId":"fix_balance_api_v1_admin_reconcile_fix_balance__owner_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/fix-failed-pending":{"post":{"tags":["Admin"],"summary":"Fix Failed Pending","description":"Corrige PENDING negativo causado por redeem_failed em redemptions\nque nunca tiveram redeem_requested (PENDING nunca foi creditado).\nAdiciona crédito compensatório em PENDING para zerar.","operationId":"fix_failed_pending_api_v1_admin_reconcile_fix_failed_pending_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/fix-charge-settlements":{"post":{"tags":["Admin"],"summary":"Fix Charge Settlements","description":"Corrige liquidacoes de cobranças Pix (charges) que foram processadas\nincorretamente como payouts via redeem_settled.\n\nO redeem_settled debita PENDING do usuario e credita SYSTEM AVAILABLE,\nmas para cobranças (charges = depositos) o correto é:\n- Creditar AVAILABLE do usuario (deposito recebido)\n- Debitar SYSTEM AVAILABLE (sistema fornece os fundos)\n- Zerar PENDING do usuario (reverter o debito incorreto)\n\nPara cada redemption SETTLED com metodo PIX (charge):\n1. Reversa do PENDING: Debit System AVAILABLE, Credit User PENDING\n2. Deposito real: Debit System AVAILABLE, Credit User AVAILABLE","operationId":"fix_charge_settlements_api_v1_admin_reconcile_fix_charge_settlements_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/pending-deposits":{"post":{"tags":["Admin"],"summary":"Reconcile Pending Deposits","description":"Reconcilia depósitos PENDING verificando status real no ASAAS.","operationId":"reconcile_pending_deposits_api_v1_admin_reconcile_pending_deposits_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/pending-transfers":{"post":{"tags":["Admin"],"summary":"Reconcile Pending Transfers","description":"Reconcilia saques/transferências Pix pendentes verificando status real no ASAAS.","operationId":"reconcile_pending_transfers_api_v1_admin_reconcile_pending_transfers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/webhooks/diagnostics":{"get":{"tags":["Admin"],"summary":"Webhook Diagnostics","description":"Diagnóstico de saúde dos webhooks.","operationId":"webhook_diagnostics_api_v1_admin_webhooks_diagnostics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/accounts/public":{"get":{"tags":["Admin","Admin"],"summary":"Get Public Accounts","description":"Lista todas as contas de usuários com seus saldos.","operationId":"get_public_accounts_api_v1_admin_accounts_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reconcile/recalculate-snapshots":{"post":{"tags":["Admin","Admin"],"summary":"Recalculate All Snapshots","description":"Recalcula todos os snapshots de saldo a partir dos entries do ledger.","operationId":"recalculate_all_snapshots_api_v1_admin_reconcile_recalculate_snapshots_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reconcile/fix-negative-balances":{"post":{"tags":["Admin","Admin"],"summary":"Fix Negative Balances","description":"Corrige contas com saldos negativos via ajuste contábil.","operationId":"fix_negative_balances_api_v1_admin_reconcile_fix_negative_balances_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reconcile/release-expired-promises":{"post":{"tags":["Admin","Admin"],"summary":"Release Expired Promises","description":"Libera saldo PROMISED de promessas expiradas.","operationId":"release_expired_promises_api_v1_admin_reconcile_release_expired_promises_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/accounts/{owner_id}/detail":{"get":{"tags":["Admin","Admin"],"summary":"Get Account Detail","description":"Retorna detalhes completos de uma conta: saldo, transações e promessas.","operationId":"get_account_detail_api_v1_admin_accounts__owner_id__detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reconcile/cancel-stale-charges":{"post":{"tags":["Admin","Admin"],"summary":"Cancel Stale Charges","description":"Cancela cobranças ASAAS pendentes/vencidas.","operationId":"cancel_stale_charges_api_v1_admin_reconcile_cancel_stale_charges_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reconcile/cancel-all-pending-charges":{"post":{"tags":["Admin","Admin"],"summary":"Cancel All Pending Charges","description":"Cancela TODAS as cobranças ASAAS pendentes.","operationId":"cancel_all_pending_charges_api_v1_admin_reconcile_cancel_all_pending_charges_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/monitor/penalty-logs":{"get":{"tags":["Admin"],"summary":"Get Penalty Logs","description":"Lista logs de penalização de webhooks.","operationId":"get_penalty_logs_api_v1_admin_monitor_penalty_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitor/operations":{"get":{"tags":["Admin"],"summary":"Get Operation Logs","description":"Lista logs de operações do sistema.","operationId":"get_operation_logs_api_v1_admin_monitor_operations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"operation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitor/dashboard":{"get":{"tags":["Admin"],"summary":"Get Monitor Dashboard","description":"Dashboard de monitoramento: status de webhooks, penalidades e operações.","operationId":"get_monitor_dashboard_api_v1_admin_monitor_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/monitor/remove-penalty/{webhook_id}":{"post":{"tags":["Admin"],"summary":"Manual Remove Penalty","description":"Remove manualmente o backoff de um webhook penalizado.","operationId":"manual_remove_penalty_api_v1_admin_monitor_remove_penalty__webhook_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitor/check-webhooks":{"post":{"tags":["Admin"],"summary":"Trigger Webhook Check","description":"Executa verificação manual dos webhooks ASAAS.","operationId":"trigger_webhook_check_api_v1_admin_monitor_check_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/monitor/process-queue":{"post":{"tags":["Admin"],"summary":"Trigger Queue Processing","description":"Processa manualmente a fila de penalidades.","operationId":"trigger_queue_processing_api_v1_admin_monitor_process_queue_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/monitor/inbox/stats":{"get":{"tags":["Admin"],"summary":"Inbox Stats","description":"Estatísticas da inbox de webhooks.","operationId":"inbox_stats_api_v1_admin_monitor_inbox_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/monitor/inbox/events":{"get":{"tags":["Admin"],"summary":"Inbox Events","description":"Lista eventos da inbox de webhooks.","operationId":"inbox_events_api_v1_admin_monitor_inbox_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitor/inbox/reprocess-dead":{"post":{"tags":["Admin"],"summary":"Inbox Reprocess Dead","description":"Reprocessa eventos dead-letter da inbox.","operationId":"inbox_reprocess_dead_api_v1_admin_monitor_inbox_reprocess_dead_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/monitor/inbox/process-now":{"post":{"tags":["Admin"],"summary":"Inbox Process Now","description":"Dispara processamento imediato da inbox.","operationId":"inbox_process_now_api_v1_admin_monitor_inbox_process_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/queues/stats":{"get":{"tags":["Admin"],"summary":"Queue Stats","description":"Estatísticas agregadas de todas as filas de processamento.","operationId":"queue_stats_api_v1_admin_queues_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reputation/stats":{"get":{"tags":["Admin"],"summary":"Reputation Stats","description":"Reputation score statistics.","operationId":"reputation_stats_api_v1_admin_reputation_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reputation/list":{"get":{"tags":["Admin"],"summary":"Reputation List","description":"List reputation scores with optional tier filter.","operationId":"reputation_list_api_v1_admin_reputation_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tier","in":"query","required":false,"schema":{"type":"string","title":"Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"score","title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Sort Dir"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reputation/{owner_id}":{"get":{"tags":["Admin"],"summary":"Reputation Detail","description":"Get detailed reputation score for a user.","operationId":"reputation_detail_api_v1_admin_reputation__owner_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reputation/{owner_id}/history":{"get":{"tags":["Admin"],"summary":"Reputation History","description":"Get reputation event history for a user.","operationId":"reputation_history_api_v1_admin_reputation__owner_id__history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-limits/pending":{"get":{"tags":["Admin"],"summary":"List Pending Plc Limit Increases","description":"Lista pedidos de aumento de limite PLC aguardando análise.","operationId":"list_pending_plc_limit_increases_api_v1_admin_plc_limits_pending_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-limits/{device_id}":{"get":{"tags":["Admin"],"summary":"Admin Plc Limit Detail","description":"Limite efetivo progressivo de um dispositivo.","operationId":"admin_plc_limit_detail_api_v1_admin_plc_limits__device_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-limits/requests/{request_id}/decide":{"post":{"tags":["Admin"],"summary":"Decide Plc Limit Increase","description":"Aprova ou rejeita pedido de aumento acima do teto automático.","operationId":"decide_plc_limit_increase_api_v1_admin_plc_limits_requests__request_id__decide_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LimitIncreaseDecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/canary/status":{"get":{"tags":["Admin"],"summary":"Canary Status","description":"Retorna status das flags de canary/dry-run e elegibilidade de um usuário.\n\nSeguro: mesh_id e device_id são truncados nos logs e na resposta.\nNão expõe CPF, chave Pix, access_token ou listas completas.","operationId":"canary_status_api_v1_admin_canary_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mesh_id","in":"query","required":false,"schema":{"type":"string","description":"mesh_id para verificar elegibilidade","title":"Mesh Id"},"description":"mesh_id para verificar elegibilidade"},{"name":"device_id","in":"query","required":false,"schema":{"type":"string","description":"device_id para verificar elegibilidade","title":"Device Id"},"description":"device_id para verificar elegibilidade"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/acquisition":{"get":{"tags":["Admin"],"summary":"Get Acquisition Analytics","description":"Dashboard privado: aquisição / AI discovery (super_admin only).","operationId":"get_acquisition_analytics_api_v1_admin_acquisition_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","default":"7d","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/supabase":{"post":{"tags":["Webhooks"],"summary":"Supabase Webhook","description":"Webhook do Supabase para eventos de banco de dados. Requer token de autenticação.","operationId":"supabase_webhook_api_v1_webhooks_supabase_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/transfer/validate":{"post":{"tags":["Webhooks"],"summary":"Validate Transfer Webhook","description":"Webhook de validação de transferência ASAAS. Requer token de autenticação.\n\nASAAS envia um POST 5s após criação da transferência.\nDevemos responder {\"status\": \"APPROVED\"} ou {\"status\": \"REFUSED\"}.\nSe falhar 3x, a transferência é cancelada automaticamente.\n\nConfigure esta URL no ASAAS:\nMenu > Integrações > Mecanismos de segurança\nURL: https://<domain>/api/v1/webhooks/transfer/validate","operationId":"validate_transfer_webhook_api_v1_webhooks_transfer_validate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/payment/pix":{"post":{"tags":["Webhooks"],"summary":"Pix Webhook","description":"Webhook Pix — ACK rápido (200) + armazenamento raw + processamento assíncrono.\nRequer token de autenticação no header `asaas-access-token`.\nIdempotência garantida pelo event_id na inbox.","operationId":"pix_webhook_api_v1_webhooks_payment_pix_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/payment/boleto":{"post":{"tags":["Webhooks"],"summary":"Boleto Webhook","description":"Webhook Boleto — ACK rápido (200) + armazenamento raw + processamento assíncrono.\nRequer token de autenticação no header `asaas-access-token`.\nIdempotência garantida pelo event_id na inbox.","operationId":"boleto_webhook_api_v1_webhooks_payment_boleto_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Auth"],"summary":"Login","description":"Autentica o super-admin e retorna um JWT de curta duração (15 minutos).","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__auth__LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify":{"get":{"tags":["Auth"],"summary":"Verify","description":"Valida o JWT do header Authorization e retorna informações do usuário.","operationId":"verify_api_v1_auth_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/redemption/pix":{"post":{"tags":["Redemption ASAAS"],"summary":"Redeem Via Pix","description":"Inicia resgate de PLC via Pix.\nCria cobrança no ASAAS e retorna QR Code Pix.\nO pagamento é confirmado via webhook.","operationId":"redeem_via_pix_api_v1_redemption_pix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedemptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixRedemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redemption/boleto":{"post":{"tags":["Redemption ASAAS"],"summary":"Redeem Via Boleto","description":"Inicia resgate de PLC via Boleto.\nCria cobrança no ASAAS e retorna linha digitável.\nO pagamento é confirmado via webhook.","operationId":"redeem_via_boleto_api_v1_redemption_boleto_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedemptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoletoRedemptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redemption/webhook/asaas":{"post":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Asaas Webhook","description":"Webhook ASAAS — duplo fluxo:\n\n1. **Autorização Externa síncrona** (body com ``type=TRANSFER|BILL|...``\n   e sem ``event``): ASAAS pergunta antes de executar uma transferência\n   Pix/boleto/etc. Responde ``{\"status\": \"APPROVED\"}`` sem exigir token —\n   essas chamadas NÃO incluem o ``asaas-access-token`` configurado pra\n   notificações, e rejeitar com 401 fazia o ASAAS interpretar como\n   \"Autorização externa foi recusada\" e cancelar a transferência.\n\n2. **Notificação assíncrona** (body com ``event=PAYMENT_RECEIVED``,\n   ``TRANSFER_DONE``, etc.): ASAAS avisa que algo aconteceu. Aqui sim\n   exigimos ``asaas-access-token`` válido (configurado no painel +\n   ``ASAAS_WEBHOOK_TOKEN`` no Railway). Token ausente/inválido → 401.\n\nIdempotência + processamento estão em ``_write_to_inbox`` + inbox worker.","operationId":"asaas_webhook_api_v1_redemption_webhook_asaas_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/payment/{payment_id}":{"get":{"tags":["Redemption ASAAS","Redemption ASAAS"],"summary":"Get Payment Status","description":"Consulta status de um pagamento no ASAAS.","operationId":"get_payment_status_api_v1_redemption_payment__payment_id__get","parameters":[{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redemption/health/asaas":{"get":{"tags":["Redemption ASAAS","System"],"summary":"Asaas Health","description":"Verifica conectividade com o gateway ASAAS.","operationId":"asaas_health_api_v1_redemption_health_asaas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/transfer/{transfer_id}":{"get":{"tags":["Redemption ASAAS","Redemption ASAAS"],"summary":"Get Transfer Status","description":"Consulta status atual de uma transferência Pix no ASAAS.\nÚtil pra debug quando a criação retornou PENDING e queremos saber\nse virou DONE, FAILED (e qual ``failReason``) ou ainda está em\nprocessamento.\n\nPúblico: requer apenas o ASAAS transfer_id (UUID). Não vaza dados\ndo usuário — só o que o ASAAS retorna sobre essa transferência.","operationId":"get_transfer_status_api_v1_redemption_transfer__transfer_id__get","parameters":[{"name":"transfer_id","in":"path","required":true,"schema":{"type":"string","title":"Transfer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redemption/webhook/list":{"get":{"tags":["Redemption ASAAS","Webhooks"],"summary":"List Webhooks","description":"Lista todos os webhooks configurados no ASAAS.","operationId":"list_webhooks_api_v1_redemption_webhook_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/webhook/remove-backoff/{webhook_id}":{"post":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Remove Webhook Backoff","description":"Remove a penalização de um webhook ASAAS e reativa a fila.\nRespeita o intervalo mínimo de 5 minutos exigido pela API ASAAS.\nUse GET /webhook/list para obter o ID do webhook.","operationId":"remove_webhook_backoff_api_v1_redemption_webhook_remove_backoff__webhook_id__post","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redemption/webhook/reactivate-all":{"post":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Reactivate All Webhooks","description":"Lista todos os webhooks e reativa todos que estiverem interrompidos.\nUsa PUT /v3/webhooks/{id} com interrupted=false para reativar filas pausadas,\ne POST /v3/webhooks/{id}/removeBackoff para remover penalizações.\nRespeita o cooldown de 5 minutos entre chamadas removeBackoff por webhook.","operationId":"reactivate_all_webhooks_api_v1_redemption_webhook_reactivate_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/webhook/token-check":{"get":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Webhook Token Check","description":"Diagnóstico público: informa se ASAAS_WEBHOOK_TOKEN está configurado no servidor.\nNÃO expõe o valor do token — apenas confirma presença/ausência.\nÚtil para verificar Railway env antes de chamar removeBackoff.","operationId":"webhook_token_check_api_v1_redemption_webhook_token_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/webhook/health":{"get":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Webhook Health","description":"Diagnóstico completo da saúde dos webhooks ASAAS.\nRetorna estado de cada webhook, penalizações, cooldowns e eventos recentes.","operationId":"webhook_health_api_v1_redemption_webhook_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/redemption/webhook/configure/{webhook_id}":{"put":{"tags":["Redemption ASAAS","Webhooks"],"summary":"Configure Webhook Events","description":"Atualiza o webhook ASAAS para incluir TODOS os eventos necessários:\nPAYMENT + TRANSFER. Sem os eventos TRANSFER, saques Pix nunca\nrecebem confirmação via webhook.","operationId":"configure_webhook_events_api_v1_redemption_webhook_configure__webhook_id__put","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/balance/{owner_id}":{"get":{"tags":["Balance"],"summary":"Get Balance","description":"Retorna saldos do usuário (available, held, pending, promised).","operationId":"get_balance_api_v1_balance__owner_id__get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/balance/deposit":{"post":{"tags":["Balance"],"summary":"Deposit","description":"Deposita fundos na conta de um usuário (admin only).","operationId":"deposit_api_v1_balance_deposit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/balance/{owner_id}/transactions":{"get":{"tags":["Balance"],"summary":"Get Transactions","description":"Retorna histórico de transações do ledger.","operationId":"get_transactions_api_v1_balance__owner_id__transactions_get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionItem"},"title":"Response Get Transactions Api V1 Balance  Owner Id  Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/balance/{owner_id}/promises":{"get":{"tags":["Balance"],"summary":"Get Promises","description":"Retorna promessas do usuário, filtradas por status.","operationId":"get_promises_api_v1_balance__owner_id__promises_get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PromiseItem"},"title":"Response Get Promises Api V1 Balance  Owner Id  Promises Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/balance/{owner_id}/reconcile":{"post":{"tags":["Balance"],"summary":"Reconcile Balance","description":"Reconcilia saldos: sincroniza PLCs existentes com o ledger.\nCria depósitos para PLCs ativas sem registro no ledger.","operationId":"reconcile_balance_api_v1_balance__owner_id__reconcile_post","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/pin/register":{"post":{"tags":["Security"],"summary":"Register Pin","description":"Registra ou atualiza PIN do usuário (hash + salt).\n\n- Primeira vez: aceito sem prova adicional (rate-limited no middleware).\n- Sobrescrita: requer current_pin_hash correto para provar controle do dispositivo.","operationId":"register_pin_api_v1_security_pin_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/pin/verify":{"post":{"tags":["Security"],"summary":"Verify Pin","description":"Verifica PIN do usuário (servidor valida hash). Protegido por lockout após 5 tentativas.","operationId":"verify_pin_api_v1_security_pin_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/pin/status":{"post":{"tags":["Security"],"summary":"Check Pin Status","description":"Verifica se usuário já tem PIN cadastrado.","operationId":"check_pin_status_api_v1_security_pin_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckPinStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/pin/request-reset":{"post":{"tags":["Security"],"summary":"Request Pin Reset","description":"Solicita reset de PIN via e-mail.\n\nATENÇÃO: Entrega de e-mail não está implementada nesta versão.\nRetorna erro explícito ao invés de simular sucesso.","operationId":"request_pin_reset_api_v1_security_pin_request_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/pin/reset":{"post":{"tags":["Security"],"summary":"Reset Pin","description":"Reseta PIN usando token de recuperação.","operationId":"reset_pin_api_v1_security_pin_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/email/update":{"post":{"tags":["Security"],"summary":"Update Recovery Email","description":"Atualiza e-mail de recuperação.\n\nRequer confirmação do PIN atual (current_pin_hash) para provar controle do dispositivo.\nImpede que um atacante com acesso apenas ao user_id altere o e-mail de recuperação.","operationId":"update_recovery_email_api_v1_security_email_update_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/key/backup":{"post":{"tags":["Security"],"summary":"Backup Key","description":"Faz backup encriptado da seed no servidor.\n\n- Primeiro backup: aceito com rate-limit (dispositivo estabelece autoridade).\n- Sobrescrita: requer device_signature Ed25519 válida para provar controle da chave privada.\n\nFormato da assinatura Ed25519:\n  message = \"ghostpay:backup:{device_id}:{public_key}:{operation_timestamp}\"\n  signature = Ed25519Sign(private_key, message)","operationId":"backup_key_api_v1_security_key_backup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBackupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBackupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/key/recover":{"post":{"tags":["Security"],"summary":"Recover Key","description":"Recupera seed encriptada do servidor.\n\nRequer public_key + device_signature + operation_timestamp.\nencrypted_seed NUNCA é retornada sem prova-de-controle Ed25519 válida.\n\nFormato da assinatura Ed25519:\n  message = \"ghostpay:recover:{device_id}:{public_key}:{operation_timestamp}\"\n  signature = Ed25519Sign(private_key, message)","operationId":"recover_key_api_v1_security_key_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyRecoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyRecoverResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/security/key/check/{public_key}":{"get":{"tags":["Security"],"summary":"Check Key Backup","description":"Verifica se existe backup para a chave pública.","operationId":"check_key_backup_api_v1_security_key_check__public_key__get","parameters":[{"name":"public_key","in":"path","required":true,"schema":{"type":"string","title":"Public Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/estimate":{"post":{"tags":["Fees & Pricing"],"summary":"Estimate Fee","description":"Estima taxa para uma operação (sem cobrar).","operationId":"estimate_fee_api_v1_fees_estimate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/schedule":{"get":{"tags":["Fees & Pricing"],"summary":"Get Fee Schedule","description":"Retorna tabela de taxas vigente (público).","operationId":"get_fee_schedule_api_v1_fees_schedule_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/fees/consent":{"post":{"tags":["Fees & Pricing"],"summary":"Record Consent","description":"Registra consentimento do usuário com as taxas.","operationId":"record_consent_api_v1_fees_consent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/b2b/quote":{"post":{"tags":["Fees & Pricing"],"summary":"B2B Quote","description":"Quote de taxa para cliente B2B.","operationId":"b2b_quote_api_v1_fees_b2b_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BQuoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/revenue":{"get":{"tags":["Fees & Pricing"],"summary":"Admin Revenue","operationId":"admin_revenue_api_v1_fees_admin_revenue_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/plans":{"get":{"tags":["Fees & Pricing"],"summary":"Admin Plans","description":"Lista todos os planos e regras (admin).","operationId":"admin_plans_api_v1_fees_admin_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Fees & Pricing"],"summary":"Create Plan","description":"Create a new pricing plan.","operationId":"create_plan_api_v1_fees_admin_plans_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/charges":{"get":{"tags":["Fees & Pricing"],"summary":"Admin Charges","operationId":"admin_charges_api_v1_fees_admin_charges_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"operation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/waive/{fee_charge_id}":{"post":{"tags":["Fees & Pricing"],"summary":"Admin Waive Fee","description":"Perdoar (waive) uma taxa (admin).","operationId":"admin_waive_fee_api_v1_fees_admin_waive__fee_charge_id__post","parameters":[{"name":"fee_charge_id","in":"path","required":true,"schema":{"type":"string","title":"Fee Charge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/plans/{plan_id}":{"put":{"tags":["Fees & Pricing"],"summary":"Update Plan","description":"Update an existing pricing plan.","operationId":"update_plan_api_v1_fees_admin_plans__plan_id__put","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Fees & Pricing"],"summary":"Delete Plan","description":"Soft-delete a plan (set is_active=False).","operationId":"delete_plan_api_v1_fees_admin_plans__plan_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/plans/{plan_id}/rules":{"post":{"tags":["Fees & Pricing"],"summary":"Create Rule","description":"Add a pricing rule to a plan.","operationId":"create_rule_api_v1_fees_admin_plans__plan_id__rules_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/rules/{rule_id}":{"put":{"tags":["Fees & Pricing"],"summary":"Update Rule","description":"Update an existing pricing rule.","operationId":"update_rule_api_v1_fees_admin_rules__rule_id__put","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Fees & Pricing"],"summary":"Delete Rule","description":"Delete a pricing rule.","operationId":"delete_rule_api_v1_fees_admin_rules__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fees/admin/plans/seed":{"post":{"tags":["Fees & Pricing"],"summary":"Seed Plans","description":"Seed the landing page plans (Starter, Business, Enterprise) into the database.","operationId":"seed_plans_api_v1_fees_admin_plans_seed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/b2b/signup":{"post":{"tags":["B2B"],"summary":"B2B Signup","description":"Cadastro B2B: cria cliente e assinatura.","operationId":"b2b_signup_api_v1_b2b_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BSignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/status/{customer_id}":{"get":{"tags":["B2B"],"summary":"B2B Status","description":"Status de um cliente B2B.","operationId":"b2b_status_api_v1_b2b_status__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/plans":{"get":{"tags":["B2B"],"summary":"List Plans","description":"Lista planos B2B disponíveis.","operationId":"list_plans_api_v1_b2b_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/b2b/admin/customers":{"get":{"tags":["B2B"],"summary":"Admin List Customers","description":"Lista clientes B2B (admin). Inclui SUSPENDED/BLOCKED — detalhe permanece disponível.","operationId":"admin_list_customers_api_v1_b2b_admin_customers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/usage-overview":{"get":{"tags":["B2B"],"summary":"Admin Usage Overview","description":"Gráficos de consumo Pix Lookup (geral / filtro por cliente e datas).","operationId":"admin_usage_overview_api_v1_b2b_admin_usage_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"}},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/customers/{customer_id}":{"get":{"tags":["B2B"],"summary":"Admin Get Customer Detail","description":"Detalhe do cliente B2B (admin).\nPara Lunimumpay, inclui ciclo Pix Key Lookup separado do metering PLC.","operationId":"admin_get_customer_detail_api_v1_b2b_admin_customers__customer_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/stats":{"get":{"tags":["B2B"],"summary":"Admin B2B Stats","description":"Estatísticas B2B (admin).","operationId":"admin_b2b_stats_api_v1_b2b_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/{customer_id}/approve":{"post":{"tags":["B2B"],"summary":"Admin Approve","description":"Aprovar cliente B2B (gera credenciais).","operationId":"admin_approve_api_v1_b2b_admin__customer_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/{customer_id}/suspend":{"post":{"tags":["B2B"],"summary":"Admin Suspend","description":"Suspender cliente B2B.","operationId":"admin_suspend_api_v1_b2b_admin__customer_id__suspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/{customer_id}/block":{"post":{"tags":["B2B"],"summary":"Admin Block","description":"Bloquear cliente B2B (revoga credenciais).","operationId":"admin_block_api_v1_b2b_admin__customer_id__block_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/{customer_id}/unblock":{"post":{"tags":["B2B"],"summary":"Admin Unblock","description":"Desbloquear cliente B2B.","operationId":"admin_unblock_api_v1_b2b_admin__customer_id__unblock_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/cache-metrics":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Cache Metrics","description":"Métricas de cache histórico Pix (LunimumPay).","operationId":"admin_lunimumpay_cache_metrics_api_v1_b2b_admin_lunimumpay_cache_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/lunimumpay/asaas-accounts":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Asaas Accounts","description":"Readiness multi-conta Asaas (PatentFlow desabilitado por padrão).","operationId":"admin_lunimumpay_asaas_accounts_api_v1_b2b_admin_lunimumpay_asaas_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/lunimumpay/dashboard":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Dashboard","description":"Dashboard analytics Lunimumpay — Pix por tipo, resultados, volume diário.","operationId":"admin_lunimumpay_dashboard_api_v1_b2b_admin_lunimumpay_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"billing_cycle_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle Id"}},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"}},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/dashboard/export":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Dashboard Export","description":"Exporta CSV do histórico de consultas Pix (admin).","operationId":"admin_lunimumpay_dashboard_export_api_v1_b2b_admin_lunimumpay_dashboard_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"billing_cycle_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle Id"}},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"}},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/usage-entries":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Usage Entries","description":"Lista lançamentos do tenant Lunimumpay (admin) — sem PII sensível.","operationId":"admin_lunimumpay_usage_entries_api_v1_b2b_admin_lunimumpay_usage_entries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"billingStatus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billingstatus"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/void-entries":{"post":{"tags":["B2B"],"summary":"Admin Lunimumpay Void Entries","description":"Marca lançamentos como VOID (não cobráveis). Não deleta linhas.\nBody: { \"entryIds\": [\"...\"], \"reason\": \"prod_smoke_test\" }","operationId":"admin_lunimumpay_void_entries_api_v1_b2b_admin_lunimumpay_void_entries_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/lunimumpay/provision":{"post":{"tags":["B2B"],"summary":"Admin Provision Lunimumpay","description":"Provisiona/rotaciona Lunimumpay e cria entrega one-time do secret.\nNunca retorna o clientSecret — apenas URL de entrega.","operationId":"admin_provision_lunimumpay_api_v1_b2b_admin_lunimumpay_provision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rotate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Rotate"}},{"name":"ttlMinutes","in":"query","required":false,"schema":{"type":"integer","default":240,"title":"Ttlminutes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/{customer_id}/credentials":{"post":{"tags":["B2B"],"summary":"Admin Create Credentials","description":"Gerar novas credenciais para cliente B2B.","operationId":"admin_create_credentials_api_v1_b2b_admin__customer_id__credentials_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/{customer_id}/credentials/{credential_id}":{"delete":{"tags":["B2B"],"summary":"Admin Revoke Credential","description":"Revogar credencial de cliente B2B.","operationId":"admin_revoke_credential_api_v1_b2b_admin__customer_id__credentials__credential_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/billing-months":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Billing Months","description":"Meses faturados / vencidos / abertos (LunimumPay).","operationId":"admin_lunimumpay_billing_months_api_v1_b2b_admin_lunimumpay_billing_months_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/lunimumpay/invoices/{cycle_id}":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Invoice Detail","description":"Detalhe da fatura/ciclo com lista de requests (sem status SUCCESS/FAIL).","operationId":"admin_lunimumpay_invoice_detail_api_v1_b2b_admin_lunimumpay_invoices__cycle_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","title":"Cycle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/cycles/{cycle_id}/close":{"post":{"tags":["B2B"],"summary":"Admin Lunimumpay Close Cycle","description":"Fecha ciclo, rematerializa requests encaminhados e emite snapshot de fatura.","operationId":"admin_lunimumpay_close_cycle_api_v1_b2b_admin_lunimumpay_cycles__cycle_id__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","title":"Cycle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/invoices/{cycle_id}/pdf":{"get":{"tags":["B2B"],"summary":"Admin Lunimumpay Invoice Pdf","description":"HTML premium imprimível (Salvar como PDF) — rodapé GhostPayMesh Verified.","operationId":"admin_lunimumpay_invoice_pdf_api_v1_b2b_admin_lunimumpay_invoices__cycle_id__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","title":"Cycle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/invoices/{cycle_id}/send-email":{"post":{"tags":["B2B"],"summary":"Admin Lunimumpay Send Invoice Email","description":"Envia e-mail de fatura/lembrete (logo oficial + chave Pix).","operationId":"admin_lunimumpay_send_invoice_email_api_v1_b2b_admin_lunimumpay_invoices__cycle_id__send_email_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","title":"Cycle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/lunimumpay/billing/reprice":{"post":{"tags":["B2B"],"summary":"Admin Lunimumpay Reprice Billing","description":"Recalcula preço unitário (padrão env) em entries, ciclos e faturas LunimumPay.","operationId":"admin_lunimumpay_reprice_billing_api_v1_b2b_admin_lunimumpay_billing_reprice_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/lunimumpay/billing/run-reminders":{"post":{"tags":["B2B"],"summary":"Admin Lunimumpay Run Reminders","description":"Dispara e-mails de lembrete (3 dias antes do vencimento) e para faturas vencidas.","operationId":"admin_lunimumpay_run_reminders_api_v1_b2b_admin_lunimumpay_billing_run_reminders_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/admin/audit":{"get":{"tags":["B2B"],"summary":"Admin Audit Logs","description":"Logs de auditoria (admin).","operationId":"admin_audit_logs_api_v1_b2b_admin_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/token":{"post":{"tags":["B2B Lunimumpay"],"summary":"B2B Auth Token","description":"Client credentials → access token B2B (escopos do parceiro).","operationId":"b2b_auth_token_api_v1_b2b_auth_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/lunimumpay/pix/key-lookup":{"post":{"tags":["B2B Lunimumpay"],"summary":"Lunimumpay Pix Key Lookup","description":"Consulta titularidade de chave Pix via Asaas.\nNão realiza transferência nem comprova pagamento.\nCobrança: R$ 0,40 (40 centavos) por consulta faturável em produção.","operationId":"lunimumpay_pix_key_lookup_api_v1_b2b_lunimumpay_pix_key_lookup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"X-Request-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyLookupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/lunimumpay/usage":{"get":{"tags":["B2B Lunimumpay"],"summary":"Lunimumpay Usage","operationId":"lunimumpay_usage_api_v1_b2b_lunimumpay_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/b2b/lunimumpay/usage/entries":{"get":{"tags":["B2B Lunimumpay"],"summary":"Lunimumpay Usage Entries","description":"Extrato paginado de consumo do tenant autenticado.","operationId":"lunimumpay_usage_entries_api_v1_b2b_lunimumpay_usage_entries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"billable","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Billable"}},{"name":"billingStatus","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billingstatus"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/lunimumpay/usage/reconcile":{"get":{"tags":["B2B Lunimumpay"],"summary":"Lunimumpay Usage Reconcile","operationId":"lunimumpay_usage_reconcile_api_v1_b2b_lunimumpay_usage_reconcile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/secret-deliveries":{"post":{"tags":["Secret Delivery Admin"],"summary":"Admin Create Delivery","operationId":"admin_create_delivery_api_v1_admin_secret_deliveries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeliveryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/secret-deliveries/tenant/{tenant_id}":{"get":{"tags":["Secret Delivery Admin"],"summary":"Admin List Deliveries","operationId":"admin_list_deliveries_api_v1_admin_secret_deliveries_tenant__tenant_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/secret-deliveries/{delivery_id}/revoke":{"post":{"tags":["Secret Delivery Admin"],"summary":"Admin Revoke","operationId":"admin_revoke_api_v1_admin_secret_deliveries__delivery_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/entrega/{token}/meta":{"get":{"tags":["Secret Delivery Public"],"summary":"Secret Delivery Meta","operationId":"secret_delivery_meta_api_v1_secrets_entrega__token__meta_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credentials/{slug}/meta":{"get":{"tags":["Secret Delivery Public"],"summary":"Secret Delivery Meta Slug","operationId":"secret_delivery_meta_slug_api_v1_credentials__slug__meta_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/entrega/{token}/consume":{"post":{"tags":["Secret Delivery Public"],"summary":"Secret Delivery Consume","operationId":"secret_delivery_consume_api_v1_secrets_entrega__token__consume_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credentials/{slug}/consume":{"post":{"tags":["Secret Delivery Public"],"summary":"Secret Delivery Consume Slug","operationId":"secret_delivery_consume_slug_api_v1_credentials__slug__consume_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/withdrawal/pix":{"post":{"tags":["Withdrawal"],"summary":"Withdraw Via Pix","description":"Saque via Pix: envia o valor da PLC para a chave Pix do usuário.\nUsa a API de Transferência do ASAAS (POST /v3/transfers).\n\nHOTFIX: bloqueado por padrão via LEGACY_PIXOUT_ENABLED=false.\nNenhum Pix-out sai desta rota sem passar pelo fluxo de compliance.","operationId":"withdraw_via_pix_api_v1_withdrawal_pix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawPixRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawPixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/withdrawal/status/{redemption_id}":{"get":{"tags":["Withdrawal","Withdrawal"],"summary":"Get Withdrawal Status","description":"Consulta status de um saque.","operationId":"get_withdrawal_status_api_v1_withdrawal_status__redemption_id__get","parameters":[{"name":"redemption_id","in":"path","required":true,"schema":{"type":"string","title":"Redemption Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deposit/pix":{"post":{"tags":["Deposit"],"summary":"Create Pix Deposit","description":"Cria cobrança Pix para depósito na carteira GhostPay.\nO valor pago será creditado no saldo disponível após confirmação via webhook.","operationId":"create_pix_deposit_api_v1_deposit_pix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositPixRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositPixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deposit/status/{deposit_id}":{"get":{"tags":["Deposit"],"summary":"Get Deposit Status","description":"Consulta status de um depósito.\nSe PENDING e tem asaas_payment_id, consulta ASAAS diretamente\ne processa o depósito se o pagamento foi confirmado.\nFallback ativo para quando webhooks estão penalizados.","operationId":"get_deposit_status_api_v1_deposit_status__deposit_id__get","parameters":[{"name":"deposit_id","in":"path","required":true,"schema":{"type":"string","title":"Deposit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/withdraw/pix":{"post":{"tags":["Withdraw Balance"],"summary":"Withdraw Balance Pix","description":"Saque direto do saldo disponível via Pix.\nNão requer PLC — debita diretamente do AVAILABLE balance.\n\nHOTFIX: bloqueado por padrão via LEGACY_PIXOUT_ENABLED=false.\nNenhum Pix-out sai desta rota sem passar pelo fluxo de compliance.","operationId":"withdraw_balance_pix_api_v1_withdraw_pix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawBalanceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/withdraw/status/{withdrawal_id}":{"get":{"tags":["Withdraw Balance","Withdraw Balance"],"summary":"Get Balance Withdrawal Status","description":"Consulta status de um saque de saldo.\nSe PROCESSING, consulta ASAAS e atualiza se confirmado/falho.","operationId":"get_balance_withdrawal_status_api_v1_withdraw_status__withdrawal_id__get","parameters":[{"name":"withdrawal_id","in":"path","required":true,"schema":{"type":"string","title":"Withdrawal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/disputes":{"post":{"tags":["Disputes"],"summary":"Create Dispute","description":"Cria uma contestação para uma transação existente.","operationId":"create_dispute_api_v1_disputes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDisputeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDisputeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/disputes/{owner_id}":{"get":{"tags":["Disputes"],"summary":"List User Disputes","description":"Lista contestações de um usuário.","operationId":"list_user_disputes_api_v1_disputes__owner_id__get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/disputes/{dispute_id}/detail":{"get":{"tags":["Disputes"],"summary":"Get Dispute Detail","description":"Retorna detalhes de uma contestação. Requer owner_id para verificação.","operationId":"get_dispute_detail_api_v1_disputes__dispute_id__detail_get","parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"string","title":"Dispute Id"}},{"name":"owner_id","in":"query","required":true,"schema":{"type":"string","description":"ID do proprietário para verificação","title":"Owner Id"},"description":"ID do proprietário para verificação"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/disputes/{dispute_id}/review":{"put":{"tags":["Disputes"],"summary":"Admin Review Dispute","description":"Admin atualiza status de uma contestação.","operationId":"admin_review_dispute_api_v1_admin_disputes__dispute_id__review_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dispute_id","in":"path","required":true,"schema":{"type":"string","title":"Dispute Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/disputes":{"get":{"tags":["Disputes"],"summary":"Admin List Disputes","description":"Admin lista todas as contestações com filtros.","operationId":"admin_list_disputes_api_v1_admin_disputes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/disputes/stats":{"get":{"tags":["Disputes"],"summary":"Admin Dispute Stats","description":"Estatísticas de contestações.","operationId":"admin_dispute_stats_api_v1_admin_disputes_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/metrics/visit":{"post":{"tags":["Metrics"],"summary":"Record Visit","description":"Incrementa contador legado e registra page_view anonimizado.","operationId":"record_visit_api_v1_metrics_visit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/metrics/event":{"post":{"tags":["Metrics"],"summary":"Record Event","description":"Registra evento de conversão/navegação (contador interno, sem PII).","operationId":"record_event_api_v1_metrics_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricEvent"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact":{"post":{"tags":["Contact"],"summary":"Submit Contact","description":"Public contact form submission.","operationId":"submit_contact_api_v1_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequestSchema"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/community/questions":{"get":{"tags":["Community Q&A"],"summary":"List Answered Questions","description":"Return all answered questions publicly.\nPending questions are never returned by this endpoint.","operationId":"list_answered_questions_api_community_questions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/QuestionPublicResponse"},"type":"array","title":"Response List Answered Questions Api Community Questions Get"}}}}}},"post":{"tags":["Community Q&A"],"summary":"Submit Question","description":"Submit a community question.\nStored with status=pending; never returned publicly until answered.\nSends email notification to contact@ghostpaymesh.com.","operationId":"submit_question_api_community_questions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionSubmitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/community/questions/{question_id}/like":{"post":{"tags":["Community Q&A"],"summary":"Like Question","description":"Atomically increment the like counter for an answered question.","operationId":"like_question_api_community_questions__question_id__like_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/community/questions/{question_id}/dislike":{"post":{"tags":["Community Q&A"],"summary":"Dislike Question","description":"Atomically increment the dislike counter for an answered question.","operationId":"dislike_question_api_community_questions__question_id__dislike_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/community/questions/pending":{"get":{"tags":["Community Q&A"],"summary":"List Pending Questions","description":"Admin: list all pending (unanswered) questions.\nRequires admin JWT.","operationId":"list_pending_questions_api_community_questions_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PendingQuestionResponse"},"type":"array","title":"Response List Pending Questions Api Community Questions Pending Get"}}}}}}},"/api/community/questions/{question_id}/answer":{"post":{"tags":["Community Q&A"],"summary":"Answer Question","description":"Admin: provide an answer for a community question.\nSets answer_text, answered_by = 'GhostPay Mesh Team', status = 'answered'.\nAfter this, the question appears publicly in GET /api/community/questions.","operationId":"answer_question_api_community_questions__question_id__answer_post","parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insights":{"get":{"tags":["Insights"],"summary":"List Insights","operationId":"list_insights_api_v1_insights_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"featured","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Featured"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/insights/featured":{"get":{"tags":["Insights"],"summary":"Get Featured Insight","operationId":"get_featured_insight_api_v1_insights_featured_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/insights/{slug}":{"get":{"tags":["Insights"],"summary":"Get Insight By Slug","operationId":"get_insight_by_slug_api_v1_insights__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/stats":{"get":{"tags":["Insights"],"summary":"Admin Insights Stats","operationId":"admin_insights_stats_api_v1_admin_insights_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/insights":{"get":{"tags":["Insights"],"summary":"Admin List Insights","operationId":"admin_list_insights_api_v1_admin_insights_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Insights"],"summary":"Admin Create Internal","operationId":"admin_create_internal_api_v1_admin_insights_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalInsightCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}":{"get":{"tags":["Insights"],"summary":"Admin Get Insight","operationId":"admin_get_insight_api_v1_admin_insights__insight_id__get","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Insights"],"summary":"Admin Update Insight","operationId":"admin_update_insight_api_v1_admin_insights__insight_id__put","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalInsightUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Insights"],"summary":"Admin Delete","operationId":"admin_delete_api_v1_admin_insights__insight_id__delete","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/external":{"put":{"tags":["Insights"],"summary":"Admin Update External Insight","operationId":"admin_update_external_insight_api_v1_admin_insights__insight_id__external_put","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalInsightUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/external":{"post":{"tags":["Insights"],"summary":"Admin Create External","operationId":"admin_create_external_api_v1_admin_insights_external_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalUrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/external/manual":{"post":{"tags":["Insights"],"summary":"Admin Create External Manual","operationId":"admin_create_external_manual_api_v1_admin_insights_external_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalManualCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/fetch-metadata":{"post":{"tags":["Insights"],"summary":"Admin Fetch Metadata Preview","operationId":"admin_fetch_metadata_preview_api_v1_admin_insights_fetch_metadata_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/refresh-metadata":{"post":{"tags":["Insights"],"summary":"Admin Refresh Metadata","operationId":"admin_refresh_metadata_api_v1_admin_insights__insight_id__refresh_metadata_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/mirror-external-covers":{"post":{"tags":["Insights"],"summary":"Admin Mirror External Covers","description":"Espelha capas externas existentes para insights-media (idempotente).","operationId":"admin_mirror_external_covers_api_v1_admin_insights_mirror_external_covers_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/insights/{insight_id}/publish":{"post":{"tags":["Insights"],"summary":"Admin Publish","operationId":"admin_publish_api_v1_admin_insights__insight_id__publish_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/unpublish":{"post":{"tags":["Insights"],"summary":"Admin Unpublish","operationId":"admin_unpublish_api_v1_admin_insights__insight_id__unpublish_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/feature":{"post":{"tags":["Insights"],"summary":"Admin Feature","operationId":"admin_feature_api_v1_admin_insights__insight_id__feature_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/unfeature":{"post":{"tags":["Insights"],"summary":"Admin Unfeature","operationId":"admin_unfeature_api_v1_admin_insights__insight_id__unfeature_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/hide":{"post":{"tags":["Insights"],"summary":"Admin Hide","operationId":"admin_hide_api_v1_admin_insights__insight_id__hide_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/{insight_id}/unhide":{"post":{"tags":["Insights"],"summary":"Admin Unhide","operationId":"admin_unhide_api_v1_admin_insights__insight_id__unhide_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"integer","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/insights/upload-image":{"post":{"tags":["Insights"],"summary":"Admin Upload Image","operationId":"admin_upload_image_api_v1_admin_insights_upload_image_post","parameters":[{"name":"alt_text","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"title":"Alt Text"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_image_api_v1_admin_insights_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pix-out/validate-key":{"post":{"tags":["Pix-Out Flow"],"summary":"Validate Pix Key","description":"Consulta chave Pix via Asaas e valida titularidade mínima.\n\nFluxo:\n1. Resolve MeshIdentity pelo device_id.\n2. Verifica se regulated_profile com kyc_level >= MINIMAL existe.\n   → Se não: retorna PROFILE_REQUIRED para o app abrir pré-cadastro.\n3. Consulta chave Pix no Asaas (mockado em testes).\n4. Compara com dados do regulated_profile.\n5. Salva PixKeyConsult e retorna status de ownership.","operationId":"validate_pix_key_api_v1_pix_out_validate_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pix-out/regulated-profile":{"post":{"tags":["Pix-Out Flow"],"summary":"Create Regulated Profile","description":"Salva pré-cadastro mínimo para habilitar liquidação via Pix.\n\nNa UI: \"Validação mínima de titularidade\" — NUNCA \"KYC\" nem \"cadastro\".\n\nFluxo:\n1. Resolve MeshIdentity.\n2. Verifica se já existe regulated_profile ativo → atualiza se sim.\n3. Valida e normaliza CPF/CNPJ.\n4. Salva dados criptografados + hashes para busca.\n5. Salva ConsentRecord (imutável).\n6. Tenta criar/reutilizar customer Asaas individual (dedup por cpfCnpj).\n7. Retorna profile_id + status.","operationId":"create_regulated_profile_api_v1_pix_out_regulated_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatedProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatedProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pix-out/confirm-key":{"post":{"tags":["Pix-Out Flow"],"summary":"Confirm Pix Key Ownership","description":"Confirma a correspondência de titularidade para a chave Pix informada.\n\nNão confia cegamente no ownership_match salvo. Recalcula a titularidade\nusando os dados brutos do último pix_key_consult e o regulated_profile\natual, com verificação de staleness.\n\nRegras:\n- Sem consult: PIX_KEY_VALIDATION_REQUIRED.\n- consult anterior a profile.updated_at: PIX_KEY_REVALIDATION_REQUIRED.\n- Consult fresco: recalcula ownership com dados crus + profile atual.\n- Nunca loga CPF/CNPJ completo, chave Pix, nome ou token.","operationId":"confirm_pix_key_ownership_api_v1_pix_out_confirm_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pix-out/liquidate":{"post":{"tags":["Pix-Out Flow"],"summary":"Liquidate Via Pix","description":"Executa liquidação via Pix usando o novo fluxo de compliance.\n\nPré-condições obrigatórias:\n- regulated_profile ativo com kyc_level >= MINIMAL\n- pix_key_consult com ownership_match compatível\n- PIXOUT_NEW_FLOW_ENABLED=true\n- ALLOW_THIRD_PARTY_PIXOUT=false\n- canary permite o device/mesh (se canary ativo)\n- PIXOUT_DRY_RUN respeita a flag configurada\n\nNunca chama create_pix_transfer sem compliance_context.\nEndpoint legado (/api/v1/withdrawal/pix) permanece bloqueado.","operationId":"liquidate_via_pix_api_v1_pix_out_liquidate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiquidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiquidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/version":{"get":{"tags":["App Update"],"summary":"App version check","description":"Returns the latest and minimum required app version for the given platform.\n\nThe Flutter client calls this on startup and on app resume to decide whether\nto show a soft-update prompt or a hard-update (force) wall.\n\n- If `enabled` is false, the client must not display any prompt.\n- If the installed version < `min_required_version`, force update.\n- If the installed version < `latest_version`, suggest update.","operationId":"get_app_version_api_v1_app_version_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"enum":["ios","android"],"type":"string"},{"type":"null"}],"description":"Client platform: 'ios' or 'android'","title":"Platform"},"description":"Client platform: 'ios' or 'android'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/funding-features":{"get":{"tags":["funding"],"summary":"Funding Features","operationId":"funding_features_api_v1_app_funding_features_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Funding Features Api V1 App Funding Features Get"}}}}}}},"/api/v1/funding/card/intent":{"post":{"tags":["Funding-Card"],"summary":"Create Card Intent","operationId":"create_card_intent_api_v1_funding_card_intent_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCardIntentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCardIntentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/funding/card/operation/{operation_id}":{"get":{"tags":["Funding-Card"],"summary":"Get Card Operation","description":"Authoritative operation status for the app to poll after PaymentSheet\nreturns. The app must NEVER treat its own PaymentSheet result as final.","operationId":"get_card_operation_api_v1_funding_card_operation__operation_id__get","parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}},{"name":"owner_id","in":"query","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CardOperationStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/funding/card/webhook":{"post":{"tags":["Funding-Card"],"summary":"Stripe Card Webhook","description":"Authoritative Stripe webhook. Verifies signature, dedups by event id, and\ndrives FundingOperation state. Never trusts the mobile app for status; PLC\nfunding (balance credit) happens only here, after `payment_paid`.","operationId":"stripe_card_webhook_api_v1_funding_card_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/compliance/pix-out/report":{"get":{"tags":["Admin Compliance"],"summary":"Relatório DB Pix-out/Compliance","description":"PARTE 1 — Relatório técnico read-only do estado das tabelas de compliance.\nRetorna contagens, distribuições e verificações de integridade.\nNunca retorna dados sensíveis em claro.","operationId":"get_compliance_report_api_v1_admin_compliance_pix_out_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Compliance Report Api V1 Admin Compliance Pix Out Report Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/customers-wallets":{"get":{"tags":["Admin Compliance"],"summary":"Lista clientes/carteiras (mascarado)","description":"PARTE 2 — Lista todos os clientes com carteiras internas.\nTodos os dados sensíveis são mascarados por padrão.","operationId":"list_customers_wallets_api_v1_admin_customers_wallets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtro: ACTIVE | BLOCKED | SUSPENDED","title":"Status"},"description":"Filtro: ACTIVE | BLOCKED | SUSPENDED"},{"name":"kyc_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtro: NONE | MINIMAL | VERIFIED","title":"Kyc Level"},"description":"Filtro: NONE | MINIMAL | VERIFIED"},{"name":"ownership_match","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtro: MATCHED_PARTIAL | FAILED_NAME | etc.","title":"Ownership Match"},"description":"Filtro: MATCHED_PARTIAL | FAILED_NAME | etc."},{"name":"pix_out_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtro: último status de Pix-out","title":"Pix Out Status"},"description":"Filtro: último status de Pix-out"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Customers Wallets Api V1 Admin Customers Wallets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers-wallets/{identity_id}":{"get":{"tags":["Admin Compliance"],"summary":"Detalhes do cliente (mascarado)","description":"PARTE 3 — Detalhes completos de um cliente/carteira.\nDados sensíveis mascarados por padrão.","operationId":"get_customer_wallet_detail_api_v1_admin_customers_wallets__identity_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","title":"Identity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Customer Wallet Detail Api V1 Admin Customers Wallets  Identity Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers-wallets/{identity_id}/reveal":{"post":{"tags":["Admin Compliance"],"summary":"Revela campo sensível (registra auditoria)","description":"PARTE 4 — Revela um campo sensível específico.\n- Apenas campos permitidos podem ser revelados.\n- Registra ADMIN_REVEALED_SENSITIVE_FIELD em audit_logs.\n- O valor nunca é salvo no audit log.","operationId":"reveal_sensitive_field_api_v1_admin_customers_wallets__identity_id__reveal_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","title":"Identity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers-wallets/{identity_id}/audit":{"get":{"tags":["Admin Compliance"],"summary":"Eventos de auditoria de compliance","description":"PARTE 3 / PARTE 6 — Auditoria de compliance de um cliente específico.","operationId":"get_customer_audit_api_v1_admin_customers_wallets__identity_id__audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","title":"Identity Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Customer Audit Api V1 Admin Customers Wallets  Identity Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/sync":{"post":{"tags":["POS"],"summary":"Sincronizar lote de PCLs offline","description":"Recebe lote idempotente de PCLs aceitas localmente pelo terminal POS.\n\nRequer autenticação via X-GPM-Terminal-Id + X-GPM-Terminal-Key.\n\nValida cada PCL: payload canônico, merchant, terminal, orderHash, TTL da ordem,\nnonce, TTL da PCL, limites e assinatura Ed25519.\n\nPCLs sem chave pública cadastrada para o device são rejeitadas com\ndevice_public_key_missing. PCLs com assinatura inválida com signature_invalid.\n\nNão executa liquidação automática — PCLs válidas ficam como\nsettlement_pending para processamento posterior.","operationId":"sync_batch_api_v1_pos_sync_post","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/catalog":{"get":{"tags":["POS"],"summary":"Catálogo de produtos do merchant","description":"Retorna catálogo de produtos ativos do merchant. Rota pública (somente leitura).","operationId":"get_catalog_api_v1_pos_catalog_get","parameters":[{"name":"merchantId","in":"query","required":true,"schema":{"type":"string","title":"Merchantid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Catalog Api V1 Pos Catalog Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/catalog/products":{"post":{"tags":["POS"],"summary":"Criar produto no catálogo","description":"Cria ou atualiza um produto no catálogo do merchant. Requer autenticação de terminal.","operationId":"create_product_api_v1_pos_catalog_products_post","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__pos__ProductCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Product Api V1 Pos Catalog Products Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/catalog/products/{product_id}":{"put":{"tags":["POS"],"summary":"Atualizar produto","description":"Atualiza um produto existente. Requer autenticação de terminal.","operationId":"update_product_api_v1_pos_catalog_products__product_id__put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__pos__ProductCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Product Api V1 Pos Catalog Products  Product Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/orders":{"post":{"tags":["POS"],"summary":"Registrar ordem POS no backend","description":"Registra uma ordem POS criada offline para rastreabilidade. Requer autenticação de terminal.","operationId":"create_order_api_v1_pos_orders_post","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Order Api V1 Pos Orders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/orders/{order_id}":{"get":{"tags":["POS"],"summary":"Consultar ordem POS","description":"Consulta status e detalhes de uma ordem POS. Rota pública (somente leitura).","operationId":"get_order_api_v1_pos_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Order Api V1 Pos Orders  Order Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/orders/{order_id}/status":{"get":{"tags":["POS"],"summary":"Polling de status da ordem pelo POS","description":"Retorna status resumido da ordem para polling do POS.\n\nO POS consulta este endpoint a cada 2-3 segundos após gerar o QR.\nQuando uma PCL for submetida pelo cliente, o status reflete isso.\nRota pública (somente leitura).","operationId":"get_order_status_api_v1_pos_orders__order_id__status_get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Order Status Api V1 Pos Orders  Order Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/orders/{order_id}/submit-pcl":{"post":{"tags":["POS"],"summary":"Cliente submete PCL ao backend","description":"Recebe uma PCL assinada diretamente do app cliente (sem autenticação de terminal).\n\nUsado no fluxo online: cliente confirma → assina → submete ao backend →\nPOS faz polling e detecta via GET /orders/{order_id}/status.\n\nValidações básicas: orderId coincide, ordem existe, não expirou, nonce único.\nA validação Ed25519 completa ocorre no sync do terminal.\nPCL é armazenada com status pcl_received (não settlement_pending).","operationId":"submit_pcl_api_v1_pos_orders__order_id__submit_pcl_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitPclRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Submit Pcl Api V1 Pos Orders  Order Id  Submit Pcl Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/merchants/{merchant_id}/summary":{"get":{"tags":["POS"],"summary":"Resumo do merchant","description":"Retorna estatísticas de PCLs e ordens do merchant. Rota pública (somente leitura).","operationId":"get_merchant_summary_api_v1_pos_merchants__merchant_id__summary_get","parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"string","title":"Merchant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Merchant Summary Api V1 Pos Merchants  Merchant Id  Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/terminal/pair":{"post":{"tags":["POS"],"summary":"Parear terminal POS com ponto de venda","description":"Recebe o payload do QR de pareamento escaneado pelo POS.\n\nValida:\n  - Código não expirado\n  - Código não usado\n  - merchantId e pointOfSaleId correspondem ao código\n  - terminalKey corresponde ao hash armazenado\n\nRetorna:\n  - Configuração completa do terminal para o POS salvar localmente\n  - Branding (appName, cores, logo) se disponível\n\nLedger: POS_TERMINAL_PAIRED","operationId":"pair_terminal_api_v1_pos_terminal_pair_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminalPairRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Pair Terminal Api V1 Pos Terminal Pair Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/terminal/config":{"get":{"tags":["POS"],"summary":"Buscar config atualizada do terminal (heartbeat)","description":"Retorna config atualizada do terminal (branding, PIN hash).\nChamado no heartbeat para manter configs em sync sem re-parear.","operationId":"get_terminal_config_api_v1_pos_terminal_config_get","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":true,"schema":{"type":"string","title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Gpm-Terminal-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Terminal Config Api V1 Pos Terminal Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/merchants":{"get":{"tags":["Admin POS"],"summary":"Listar merchants POS","description":"Lista todos os merchants cadastrados no POS.","operationId":"list_merchants_api_v1_admin_pos_merchants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Merchants Api V1 Admin Pos Merchants Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin POS"],"summary":"Cadastrar merchant POS","description":"Cadastra um novo merchant no módulo POS.","operationId":"create_merchant_api_v1_admin_pos_merchants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Merchant Api V1 Admin Pos Merchants Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/pos/terminals":{"post":{"tags":["Admin POS"],"summary":"Cadastrar terminal POS","description":"Cadastra um novo terminal POS para um merchant.","operationId":"create_terminal_api_v1_admin_pos_terminals_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminalCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Terminal Api V1 Admin Pos Terminals Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin POS"],"summary":"Listar terminais POS","description":"Lista terminais POS com filtro opcional por merchant.","operationId":"list_terminals_api_v1_admin_pos_terminals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Terminals Api V1 Admin Pos Terminals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/pcls":{"get":{"tags":["Admin POS"],"summary":"Listar PCLs POS com filtros","description":"Lista PCLs aceitas pelo POS com filtros por merchant e status.","operationId":"list_pcls_api_v1_admin_pos_pcls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Pcls Api V1 Admin Pos Pcls Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/orders":{"get":{"tags":["Admin POS"],"summary":"Listar ordens POS","description":"Lista ordens POS com filtros por merchant, terminal e status.","operationId":"list_orders_api_v1_admin_pos_orders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}},{"name":"terminalId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminalid"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Orders Api V1 Admin Pos Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/orders/{order_id}":{"get":{"tags":["Admin POS"],"summary":"Detalhe de ordem POS","description":"Retorna detalhe completo de uma ordem POS incluindo PCL vinculada.","operationId":"get_order_detail_api_v1_admin_pos_orders__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Order Detail Api V1 Admin Pos Orders  Order Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/ledger":{"get":{"tags":["Admin POS"],"summary":"Ledger de eventos POS","description":"Lista eventos auditáveis do ledger POS.\n\nÚtil para rastreabilidade completa de uma venda:\nPOS_ORDER_CREATED → PCL_SUBMITTED_BY_CLIENT → PCL_SIGNATURE_VALIDATED → POS_SYNC_COMPLETED","operationId":"get_ledger_events_api_v1_admin_pos_ledger_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}},{"name":"orderId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderid"}},{"name":"eventType","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eventtype"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Ledger Events Api V1 Admin Pos Ledger Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/stats":{"get":{"tags":["Admin POS"],"summary":"Estatísticas consolidadas POS","description":"Resumo de ordens e PCLs por status para visão operacional rápida.","operationId":"get_pos_stats_api_v1_admin_pos_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Pos Stats Api V1 Admin Pos Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pos/merchants/{merchant_id}/status":{"patch":{"tags":["Admin POS"],"summary":"Alterar status do merchant","description":"Ativa, suspende ou bloqueia um merchant.","operationId":"update_merchant_status_api_v1_admin_pos_merchants__merchant_id__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"path","required":true,"schema":{"type":"string","title":"Merchant Id"}},{"name":"status","in":"query","required":true,"schema":{"type":"string","pattern":"^(active|suspended|blocked)$","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Merchant Status Api V1 Admin Pos Merchants  Merchant Id  Status Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/auth/register":{"post":{"tags":["Merchant Auth"],"summary":"Cadastrar vendedor","description":"Cria conta do vendedor + empresa + merchant + subscription pendente.\n\nFluxo:\n  1. Valida unicidade do e-mail\n  2. Cria SellerUser\n  3. Gera merchantId único\n  4. Cria Merchant em pos_merchants\n  5. Cria MerchantCompany com status pending\n  6. Cria MerchantSubscription com status pending\n  7. Retorna merchantId — vendedor deve completar assinatura para ativar painel","operationId":"register_api_v1_merchant_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/auth/login":{"post":{"tags":["Merchant Auth"],"summary":"Login do vendedor","description":"Autentica vendedor e retorna JWT para o painel.","operationId":"login_api_v1_merchant_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__merchant_auth__LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/auth/me":{"get":{"tags":["Merchant Auth"],"summary":"Dados do vendedor logado","description":"Retorna dados do vendedor, empresa e status de assinatura.","operationId":"me_api_v1_merchant_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Me Api V1 Merchant Auth Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/auth/verify-email":{"post":{"tags":["Merchant Auth"],"summary":"Confirmar e-mail por token","description":"Confirma o e-mail do vendedor pelo token recebido no cadastro.\nDefine email_verified = True e limpa o token.","operationId":"verify_email_api_v1_merchant_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Verify Email Api V1 Merchant Auth Verify Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/auth/resend-verification":{"post":{"tags":["Merchant Auth"],"summary":"Reenviar e-mail de confirmação","description":"Gera novo token e reenvia o e-mail de confirmação.\nRate-limit passivo: só reenvia se token anterior já expirou ou não existe.","operationId":"resend_verification_api_v1_merchant_auth_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Resend Verification Api V1 Merchant Auth Resend Verification Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/company":{"get":{"tags":["Merchant Portal"],"summary":"Dados da empresa","operationId":"get_company_api_v1_merchant_company_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Company Api V1 Merchant Company Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Merchant Portal"],"summary":"Atualizar dados da empresa","operationId":"update_company_api_v1_merchant_company_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Company Api V1 Merchant Company Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/branding":{"get":{"tags":["Merchant Portal"],"summary":"Branding white label","operationId":"get_branding_api_v1_merchant_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Branding Api V1 Merchant Branding Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Merchant Portal"],"summary":"Atualizar branding white label","operationId":"update_branding_api_v1_merchant_branding_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Branding Api V1 Merchant Branding Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/points-of-sale":{"get":{"tags":["Merchant Portal"],"summary":"Listar pontos de venda","operationId":"list_pos_api_v1_merchant_points_of_sale_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Pos Api V1 Merchant Points Of Sale Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Merchant Portal"],"summary":"Criar ponto de venda","operationId":"create_pos_api_v1_merchant_points_of_sale_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Pos Api V1 Merchant Points Of Sale Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/points-of-sale/{pos_id}":{"put":{"tags":["Merchant Portal"],"summary":"Atualizar ponto de venda","operationId":"update_pos_api_v1_merchant_points_of_sale__pos_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pos_id","in":"path","required":true,"schema":{"type":"string","title":"Pos Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointOfSaleUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Pos Api V1 Merchant Points Of Sale  Pos Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/points-of-sale/{pos_id}/pairing-code":{"post":{"tags":["Merchant Portal"],"summary":"Gerar QR de pareamento do terminal","description":"Gera um código temporário de pareamento (uso único, 10 minutos).\n\nO lojista exibe o QR Code no painel. O app POS escaneia e chama\nPOST /pos/terminal/pair para receber a configuração do terminal.\n\nLedger: POS_TERMINAL_PAIRING_CREATED","operationId":"generate_pairing_code_api_v1_merchant_points_of_sale__pos_id__pairing_code_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pos_id","in":"path","required":true,"schema":{"type":"string","title":"Pos Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Generate Pairing Code Api V1 Merchant Points Of Sale  Pos Id  Pairing Code Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/points-of-sale/{pos_id}/operator-pin":{"post":{"tags":["Merchant Portal"],"summary":"Configurar PIN do operador","description":"Permite lojista configurar o PIN do operador (4-8 dígitos).\nSalvo como hash SHA-256. Entregue no próximo heartbeat ou pairing.","operationId":"set_operator_pin_api_v1_merchant_points_of_sale__pos_id__operator_pin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pos_id","in":"path","required":true,"schema":{"type":"string","title":"Pos Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Operator Pin Api V1 Merchant Points Of Sale  Pos Id  Operator Pin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/products":{"get":{"tags":["Merchant Portal"],"summary":"Listar produtos do merchant","operationId":"list_products_api_v1_merchant_products_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Products Api V1 Merchant Products Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Merchant Portal"],"summary":"Criar produto","operationId":"create_product_api_v1_merchant_products_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__merchant_portal__ProductCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create Product Api V1 Merchant Products Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/products/{product_id}":{"put":{"tags":["Merchant Portal"],"summary":"Atualizar produto","operationId":"update_product_api_v1_merchant_products__product_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__merchant_portal__ProductCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Update Product Api V1 Merchant Products  Product Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/stock":{"get":{"tags":["Merchant Portal"],"summary":"Estoque por ponto de venda","operationId":"get_stock_api_v1_merchant_stock_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pointOfSaleId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Stock Api V1 Merchant Stock Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/stock/adjust":{"post":{"tags":["Merchant Portal"],"summary":"Ajustar estoque manualmente","operationId":"adjust_stock_api_v1_merchant_stock_adjust_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockAdjustRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Adjust Stock Api V1 Merchant Stock Adjust Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/inventory-movements":{"get":{"tags":["Merchant Portal"],"summary":"Ledger de movimentos de estoque","operationId":"list_movements_api_v1_merchant_inventory_movements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"productId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Productid"}},{"name":"pointOfSaleId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"}},{"name":"movementType","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Movementtype"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Movements Api V1 Merchant Inventory Movements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/sales":{"get":{"tags":["Merchant Portal"],"summary":"Histórico de vendas aceitas via PCL","operationId":"list_sales_api_v1_merchant_sales_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"pointOfSaleId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response List Sales Api V1 Merchant Sales Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/sales/{order_id}":{"get":{"tags":["Merchant Portal"],"summary":"Detalhe de venda por ordem","operationId":"get_sale_api_v1_merchant_sales__order_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Sale Api V1 Merchant Sales  Order Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/dashboard":{"get":{"tags":["Merchant Portal"],"summary":"Dashboard do vendedor","operationId":"get_dashboard_api_v1_merchant_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Dashboard Api V1 Merchant Dashboard Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/subscription":{"get":{"tags":["Merchant Portal"],"summary":"Status da assinatura SaaS","operationId":"get_subscription_api_v1_merchant_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Subscription Api V1 Merchant Subscription Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/subscription/checkout":{"post":{"tags":["Merchant Portal"],"summary":"Iniciar assinatura SaaS (gera cobrança Asaas)","description":"Inicia assinatura mensal do painel SaaS via Asaas.\n\n- Cria customer Asaas para o lojista (se não existir)\n- Cria cobrança Pix para pagamento imediato\n- Retorna QR Pix e link de pagamento\n- Não executa liquidação de vendas PCL","operationId":"subscription_checkout_api_v1_merchant_subscription_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Subscription Checkout Api V1 Merchant Subscription Checkout Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/subscription/payment":{"get":{"tags":["Merchant Portal"],"summary":"Status do pagamento da assinatura","description":"Retorna status atual do pagamento da assinatura + dados do QR Pix.\n\nUsado pelo lojista para verificar se pagamento foi confirmado.","operationId":"get_subscription_payment_api_v1_merchant_subscription_payment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Get Subscription Payment Api V1 Merchant Subscription Payment Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/products/import":{"post":{"tags":["Merchant Portal"],"summary":"Importar produtos via CSV","description":"Importa produtos e estoque inicial a partir de arquivo CSV.\n\nCampos suportados:\n  name* | sku | barcode | price* | currency | stockQuantity | category | active | pointOfSaleId\n\n- name e price são obrigatórios\n- barcode deve ser único por merchant\n- currency padrão: BRL\n- active padrão: true\n- Se pointOfSaleId fornecido (via query ou coluna), cria MerchantProductStock + InventoryMovement INITIAL_IMPORT","operationId":"import_products_csv_api_v1_merchant_products_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pointOfSaleId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PDV para aplicar estoque inicial (opcional)","title":"Pointofsaleid"},"description":"PDV para aplicar estoque inicial (opcional)"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_products_csv_api_v1_merchant_products_import_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/merchant/branding/upload-logo":{"post":{"tags":["Merchant Portal"],"summary":"Upload de logo via Supabase Storage","description":"Upload de logo do lojista para Supabase Storage (bucket merchant-branding).\n\n- Aceita JPEG, PNG, WEBP, GIF\n- Tamanho máximo: 5 MB\n- Retorna URL pública para salvar no branding","operationId":"upload_logo_api_v1_merchant_branding_upload_logo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_logo_api_v1_merchant_branding_upload_logo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Upload Logo Api V1 Merchant Branding Upload Logo Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/merchant/webhooks/asaas/subscription":{"post":{"tags":["Merchant Webhooks"],"summary":"Webhook Asaas — mensalidade SaaS","description":"Processa webhooks de pagamento da mensalidade SaaS via Asaas.\n\nAções executadas:\n- PAYMENT_RECEIVED / PAYMENT_CONFIRMED → ativa merchant + subscription\n- PAYMENT_OVERDUE → marca overdue\n- PAYMENT_DELETED / SUBSCRIPTION_DELETED → cancela","operationId":"asaas_subscription_webhook_api_v1_merchant_webhooks_asaas_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/pos/heartbeat":{"post":{"tags":["POS Inventory"],"summary":"Heartbeat do terminal POS","description":"Recebe sinal de vida do terminal POS.\n\nAtualiza last_seen_at no ponto de venda correspondente.\nO painel usa este timestamp para mostrar pontos online/offline.\nTerminal online = heartbeat nos últimos 120 segundos.","operationId":"heartbeat_api_v1_pos_heartbeat_post","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Heartbeat Api V1 Pos Heartbeat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pos/inventory/sync":{"post":{"tags":["POS Inventory"],"summary":"Sincronizar movimentos de estoque offline","description":"Recebe lote de movimentos de estoque aceitos localmente pelo POS offline.\n\nIdempotente por movementId — múltiplas submissões do mesmo movimento\nsão seguras (retorna 'skipped' em vez de criar duplicata).\n\nAo sincronizar:\n  1. Cada movimento é validado (tipo, quantidade)\n  2. Stock em MerchantProductStock é atualizado\n  3. Movimento é salvo com status='applied' e synced_at\n  4. Ponto de venda recebe last_sync_at\n\nConflitos (estoque ficaria negativo):\n  - Movimento é salvo com tipo CONFLICT_ADJUSTMENT\n  - Painel mostra como \"Ajuste necessário\"","operationId":"sync_inventory_api_v1_pos_inventory_sync_post","parameters":[{"name":"X-GPM-Terminal-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Id"}},{"name":"X-GPM-Terminal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gpm-Terminal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventorySyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventorySyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/check-customer":{"post":{"tags":["Identity","Identity"],"summary":"Verifica se cliente existe e tem wallet","description":"REAL_PILOT_MODE — verifica se um cliente existe pelo e-mail.\nRetorna dados mascarados para feedback visual no app sem expor dados sensíveis.","operationId":"check_customer_api_v1_identity_check_customer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckCustomerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/auth/request-email-code":{"post":{"tags":["Identity","Identity"],"summary":"Valida e-mail + PIN e envia código OTP por e-mail","description":"REAL_PILOT_MODE — fallback de autenticação para checkout.\n\nFluxo:\n1. Verifica cliente pelo e-mail.\n2. Valida PIN (SHA-256(salt + pin)).\n3. Gera OTP de 6 dígitos (one-time, TTL 10 min).\n4. Armazena no Redis com challenge_id.\n5. Envia código por e-mail (SMTP real).\n6. Retorna challenge_id + e-mail mascarado.\n\nNunca retorna o código OTP ao app.\nNunca loga o PIN ou o código OTP.","operationId":"request_email_code_api_v1_identity_auth_request_email_code_post","parameters":[{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestEmailCodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/auth/verify-email-code":{"post":{"tags":["Identity","Identity"],"summary":"Valida o código OTP e emite checkout_token","description":"REAL_PILOT_MODE — valida o OTP e emite um checkout_token de curta duração.\n\nO checkout_token é armazenado no Redis (TTL 5 min) e deve ser enviado\nno campo checkout_token do endpoint POST /api/v1/identity/payments/authorize.","operationId":"verify_email_code_api_v1_identity_auth_verify_email_code_post","parameters":[{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailCodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/enroll":{"post":{"tags":["Identity"],"summary":"Enrola novo cliente Identity","description":"Cadastra ou atualiza um cliente Identity com face embedding criptografado e PIN hash. Idempotente via localId. Cria wallet se não existir.","operationId":"enroll_customer_api_v1_identity_customers_enroll_post","parameters":[{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/face-templates":{"get":{"tags":["Identity","Identity"],"summary":"Sincroniza templates faciais autorizados (identidade global)","description":"Retorna os templates faciais (embeddings criptografados em repouso, descriptografados sobre TLS) dos clientes autorizados para o merchant/condomínio do device. Permite que um cliente cadastrado em um device seja reconhecido em outro device autorizado da rede. Imagem bruta NUNCA é retornada.","operationId":"sync_face_templates_api_v1_identity_face_templates_get","parameters":[{"name":"merchantId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"}},{"name":"condominiumId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominiumid"}},{"name":"deviceId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deviceid"}},{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Merchant-Id"}},{"name":"X-Condominium-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Condominium-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}},{"name":"X-POS-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Pos-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceTemplateSyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/{customer_id}":{"get":{"tags":["Identity"],"summary":"Consulta cliente Identity","operationId":"get_customer_api_v1_identity_customers__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/{customer_id}/wallet":{"get":{"tags":["Identity"],"summary":"Consulta saldo da wallet do cliente","operationId":"get_customer_wallet_api_v1_identity_customers__customer_id__wallet_get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/{customer_id}/wallet/ensure":{"post":{"tags":["Identity","Identity"],"summary":"Garante (get-or-create) a wallet do cliente","description":"Idempotente. Retorna a wallet existente ou cria uma nova ACTIVE com saldo 0. Usado pelo app quando o enrollment não propagou o walletId.","operationId":"ensure_customer_wallet_api_v1_identity_customers__customer_id__wallet_ensure_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/wallets/{wallet_id}":{"get":{"tags":["Identity","Identity"],"summary":"Consulta saldo da wallet por walletId","description":"Consulta direta da wallet pelo seu id. Complementa GET /customers/{customerId}/wallet. Retorna 404 se a wallet não existir.","operationId":"get_wallet_by_id_api_v1_identity_wallets__wallet_id__get","parameters":[{"name":"wallet_id","in":"path","required":true,"schema":{"type":"string","title":"Wallet Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/wallets/{wallet_id}/topups/pix":{"post":{"tags":["Identity"],"summary":"Inicia recarga Pix na wallet Identity","description":"Cria cobrança Pix no Asaas para recarregar a wallet condominial. Retorna QR Code e código Pix Copia e Cola.","operationId":"create_pix_topup_api_v1_identity_wallets__wallet_id__topups_pix_post","parameters":[{"name":"wallet_id","in":"path","required":true,"schema":{"type":"string","title":"Wallet Id"}},{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixTopupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixTopupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/topups/{topup_id}/status":{"get":{"tags":["Identity"],"summary":"Consulta status de recarga Pix","description":"Polling de status do top-up. PENDING → SETTLED após confirmação do Pix.","operationId":"get_topup_status_api_v1_identity_topups__topup_id__status_get","parameters":[{"name":"topup_id","in":"path","required":true,"schema":{"type":"string","title":"Topup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/payments/authorize":{"post":{"tags":["Identity"],"summary":"Autoriza pagamento pela wallet Identity","description":"Debita o saldo da wallet Identity para pagamento presencial. Usa localNonce para garantir idempotência offline. Requer pinVerified=true, faceVerified=true ou checkout_token válido (email+OTP).","operationId":"authorize_payment_api_v1_identity_payments_authorize_post","parameters":[{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentAuthorizeRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentAuthorizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/audit/events":{"post":{"tags":["Identity"],"summary":"Sincroniza eventos de auditoria do app","description":"Recebe batch de eventos de auditoria gerados offline pelo app Identity. Eventos são gravados com source='app'. Metadados sensíveis não devem ser incluídos.","operationId":"sync_audit_events_api_v1_identity_audit_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditSyncRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditSyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/{customer_id}/otp/request":{"post":{"tags":["Identity","Identity"],"summary":"Solicita OTP de recuperação de PIN por e-mail","description":"Gera e envia OTP para recuperação de PIN.\nO cliente já foi identificado por reconhecimento facial no app (sem PIN).\nApenas canal email é suportado no MVP (SMS requer integração Twilio).\nOTP é armazenado no Redis com TTL de 10 minutos.","operationId":"request_pin_recovery_otp_api_v1_identity_customers__customer_id__otp_request_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinRecoveryOtpRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/customers/{customer_id}/otp/validate":{"post":{"tags":["Identity","Identity"],"summary":"Valida OTP de recuperação de PIN","description":"Valida o código OTP enviado por e-mail para recuperação de PIN.\nRetorna {valid: true} em caso de sucesso e invalida o OTP imediatamente (single-use).","operationId":"validate_pin_recovery_otp_api_v1_identity_customers__customer_id__otp_validate_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"X-Identity-Merchant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Merchant-Id"}},{"name":"X-Identity-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Identity-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinRecoveryOtpValidateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/clientes":{"get":{"tags":["Admin — Identity"],"summary":"List Clientes","operationId":"list_clientes_api_v1_admin_identity_clientes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Busca por nome, telefone ou email","title":"Q"},"description":"Busca por nome, telefone ou email"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/clientes/{customer_id}":{"get":{"tags":["Admin — Identity"],"summary":"Get Cliente","operationId":"get_cliente_api_v1_admin_identity_clientes__customer_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/wallets":{"get":{"tags":["Admin — Identity"],"summary":"List Wallets","operationId":"list_wallets_api_v1_admin_identity_wallets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/topups":{"get":{"tags":["Admin — Identity"],"summary":"List Topups","operationId":"list_topups_api_v1_admin_identity_topups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date YYYY-MM-DD","title":"Date From"},"description":"ISO date YYYY-MM-DD"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date YYYY-MM-DD","title":"Date To"},"description":"ISO date YYYY-MM-DD"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/pagamentos":{"get":{"tags":["Admin — Identity"],"summary":"List Pagamentos","operationId":"list_pagamentos_api_v1_admin_identity_pagamentos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/auditoria":{"get":{"tags":["Admin — Identity"],"summary":"List Auditoria","operationId":"list_auditoria_api_v1_admin_identity_auditoria_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/metricas":{"get":{"tags":["Admin — Identity"],"summary":"Get Metricas","operationId":"get_metricas_api_v1_admin_identity_metricas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/dispositivos":{"get":{"tags":["Admin — Identity"],"summary":"List Dispositivos","operationId":"list_dispositivos_api_v1_admin_identity_dispositivos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"merchant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},{"name":"condominium_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominium Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin — Identity"],"summary":"Create Dispositivo","operationId":"create_dispositivo_api_v1_admin_identity_dispositivos_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/identity/dispositivos/{device_db_id}":{"patch":{"tags":["Admin — Identity"],"summary":"Update Dispositivo","operationId":"update_dispositivo_api_v1_admin_identity_dispositivos__device_db_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_db_id","in":"path","required":true,"schema":{"type":"string","title":"Device Db Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Identity"],"summary":"Delete Dispositivo","operationId":"delete_dispositivo_api_v1_admin_identity_dispositivos__device_db_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_db_id","in":"path","required":true,"schema":{"type":"string","title":"Device Db Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-integrity/incident-scan":{"get":{"tags":["Admin PLC Integrity"],"summary":"Incident Scan","description":"Read-only: PLCs + PROMISE_CREATE no período (incidente P0).\nNão altera saldo.","operationId":"incident_scan_api_v1_admin_plc_integrity_incident_scan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":6,"title":"Hours"}},{"name":"amount","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"default":5.0,"title":"Amount"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-integrity/balance/{owner_id}":{"get":{"tags":["Admin PLC Integrity"],"summary":"Integrity Balance","operationId":"integrity_balance_api_v1_admin_plc_integrity_balance__owner_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/plc-integrity/cancel-issued-for-recovery":{"post":{"tags":["Admin PLC Integrity"],"summary":"Cancel Issued For Recovery","description":"Cancela PLC ISSUED (PROMISED→AVAILABLE) com trilha de auditoria.\nUsar quando a resposta do create não chegou ao app (secret_key one-shot).","operationId":"cancel_issued_for_recovery_api_v1_admin_plc_integrity_cancel_issued_for_recovery_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelLostResponseBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/plc-integrity/release-stale-promise-state":{"post":{"tags":["Admin PLC Integrity"],"summary":"Release Stale Promise State","description":"Compensa promise_state ACTIVE órfã (token CANCELLED/EXPIRED/ausente)\ncom PROMISE_CANCEL imutável. Não apaga rows.","operationId":"release_stale_promise_state_api_v1_admin_plc_integrity_release_stale_promise_state_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseStalePromiseBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/health":{"get":{"tags":["System"],"summary":"Health","description":"Liveness + service health — checks DB, Redis, Supabase.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"tags":["System"],"summary":"Readiness","description":"Readiness probe — valida conexão com DB e Redis.\nRetorna 503 se alguma dependência estiver indisponível.","operationId":"readiness_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/status":{"get":{"tags":["System"],"summary":"Service Status","description":"Detailed service status — DB, Redis, inbox, worker, circuit breaker.","operationId":"service_status_api_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/version":{"get":{"tags":["System"],"summary":"Version Info","description":"Version info — minimal public-safe response.","operationId":"version_info_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cron/expire-promises":{"post":{"tags":["System"],"summary":"Cron Expire Promises","description":"Endpoint para cron job: expira promessas vencidas (requer admin).","operationId":"cron_expire_promises_api_v1_cron_expire_promises_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/queues":{"get":{"tags":["Admin"],"summary":"Admin Queue Stats","description":"Estatísticas das filas Redis: tamanhos, dead-letters, disponibilidade.","operationId":"admin_queue_stats_api_v1_admin_queues_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/diagnostics":{"get":{"tags":["Admin"],"summary":"Admin Diagnostics","description":"Diagnóstico completo: saldo ASAAS, depósitos pendentes, saques pendentes.","operationId":"admin_diagnostics_api_v1_admin_diagnostics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/transfer/{transfer_id}":{"get":{"tags":["Admin"],"summary":"Admin Check Transfer","description":"Consulta detalhes de uma transferência no ASAAS.","operationId":"admin_check_transfer_api_v1_admin_transfer__transfer_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"transfer_id","in":"path","required":true,"schema":{"type":"string","title":"Transfer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/account-status":{"get":{"tags":["Admin"],"summary":"Admin Account Status","description":"Verifica status da conta ASAAS incluindo permissões de transferência.","operationId":"admin_account_status_api_v1_admin_account_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/recalculate-snapshot/{owner_id}":{"post":{"tags":["Admin"],"summary":"Admin Recalculate Snapshot","description":"Force-recalculate balance snapshot for a user.","operationId":"admin_recalculate_snapshot_api_v1_admin_recalculate_snapshot__owner_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/public":{"get":{"tags":["System"],"summary":"Health Public","description":"Endpoint de saúde público e seguro — retorna apenas dados não sensíveis.\nNão expõe secrets, URLs de banco, tokens ou configurações internas.\nUsado pelo dashboard e war-room sem necessidade de autenticação.","operationId":"health_public_health_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/config":{"get":{"tags":["System"],"summary":"Health Config","description":"Diagnóstico de configuração — requer autenticação admin.\nExpõe estado interno dos serviços somente para administradores autenticados.","operationId":"health_config_health_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"AdminReviewRequest":{"properties":{"status":{"type":"string","title":"Status"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"}},"type":"object","required":["status"],"title":"AdminReviewRequest"},"AdminStatsResponse":{"properties":{"total_plcs":{"type":"integer","title":"Total Plcs"},"active_plcs":{"type":"integer","title":"Active Plcs"},"total_transferred":{"type":"integer","title":"Total Transferred"},"total_redeemed":{"type":"integer","title":"Total Redeemed"},"total_expired":{"type":"integer","title":"Total Expired"},"total_blocked":{"type":"integer","title":"Total Blocked"},"total_volume":{"type":"number","title":"Total Volume"},"risk_flags_count":{"type":"integer","title":"Risk Flags Count"}},"type":"object","required":["total_plcs","active_plcs","total_transferred","total_redeemed","total_expired","total_blocked","total_volume","risk_flags_count"],"title":"AdminStatsResponse"},"AnswerRequest":{"properties":{"answer_text":{"type":"string","maxLength":5000,"minLength":10,"title":"Answer Text"}},"type":"object","required":["answer_text"],"title":"AnswerRequest"},"AnswerResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"AnswerResponse"},"AppVersionResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"latest_version":{"type":"string","title":"Latest Version"},"min_required_version":{"type":"string","title":"Min Required Version"},"force_update":{"type":"boolean","title":"Force Update"},"message":{"type":"string","title":"Message"},"ios_store_url":{"type":"string","title":"Ios Store Url"},"android_store_url":{"type":"string","title":"Android Store Url"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["platform","latest_version","min_required_version","force_update","message","ios_store_url","android_store_url","enabled"],"title":"AppVersionResponse"},"AuditEventItem":{"properties":{"eventType":{"type":"string","title":"Eventtype"},"walletId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Walletid"},"merchantId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"}},"type":"object","required":["eventType"],"title":"AuditEventItem"},"AuditSyncRequest":{"properties":{"customerId":{"type":"string","title":"Customerid"},"events":{"items":{"$ref":"#/components/schemas/AuditEventItem"},"type":"array","title":"Events"}},"type":"object","required":["customerId","events"],"title":"AuditSyncRequest"},"AuditSyncResponse":{"properties":{"synced":{"type":"integer","title":"Synced"},"errors":{"type":"integer","title":"Errors"}},"type":"object","required":["synced","errors"],"title":"AuditSyncResponse"},"B2BQuoteRequest":{"properties":{"operation":{"type":"string","title":"Operation"},"amount":{"type":"number","title":"Amount"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","required":["operation","amount"],"title":"B2BQuoteRequest"},"B2BSignupRequest":{"properties":{"legal_name":{"type":"string","title":"Legal Name"},"contact_name":{"type":"string","title":"Contact Name"},"contact_email":{"type":"string","title":"Contact Email"},"plan_code":{"type":"string","title":"Plan Code","default":"starter"},"trade_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trade Name"},"cnpj":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cnpj"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"}},"type":"object","required":["legal_name","contact_name","contact_email"],"title":"B2BSignupRequest"},"BalanceResponse":{"properties":{"available":{"type":"number","title":"Available"},"held":{"type":"number","title":"Held"},"pending":{"type":"number","title":"Pending"},"promised":{"type":"number","title":"Promised"}},"type":"object","required":["available","held","pending","promised"],"title":"BalanceResponse"},"Body_admin_upload_image_api_v1_admin_insights_upload_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_image_api_v1_admin_insights_upload_image_post"},"Body_import_products_csv_api_v1_merchant_products_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_products_csv_api_v1_merchant_products_import_post"},"Body_upload_logo_api_v1_merchant_branding_upload_logo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_logo_api_v1_merchant_branding_upload_logo_post"},"BoletoRedemptionResponse":{"properties":{"redemption_id":{"type":"string","title":"Redemption Id"},"token_id":{"type":"string","title":"Token Id"},"asaas_payment_id":{"type":"string","title":"Asaas Payment Id"},"boleto_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boleto Url"},"boleto_barcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boleto Barcode"},"boleto_bar_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boleto Bar Code"},"boleto_nosso_numero":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boleto Nosso Numero"},"boleto_due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boleto Due Date"},"invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Url"},"amount":{"type":"number","title":"Amount"},"fee":{"type":"number","title":"Fee"},"net_amount":{"type":"number","title":"Net Amount"},"status":{"type":"string","title":"Status"}},"type":"object","required":["redemption_id","token_id","asaas_payment_id","amount","fee","net_amount","status"],"title":"BoletoRedemptionResponse"},"BrandingUpdateRequest":{"properties":{"appName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appname"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl"},"primaryColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primarycolor"},"secondaryColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondarycolor"},"accentColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accentcolor"}},"type":"object","title":"BrandingUpdateRequest"},"CancelLostResponseBody":{"properties":{"token_id":{"type":"string","minLength":8,"title":"Token Id"},"reason":{"type":"string","maxLength":120,"title":"Reason","default":"CREATE_RESPONSE_LOST_USER_RECOVERY"},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","required":["token_id"],"title":"CancelLostResponseBody"},"CancelPLCRequest":{"properties":{"requester_pubkey":{"type":"string","title":"Requester Pubkey"},"device_id":{"type":"string","title":"Device Id"}},"type":"object","required":["requester_pubkey","device_id"],"title":"CancelPLCRequest"},"CardOperationStatus":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"status":{"type":"string","title":"Status"},"credited":{"type":"boolean","title":"Credited"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["operation_id","status","credited","amount","currency"],"title":"CardOperationStatus"},"ChainEntry":{"properties":{"from_pubkey":{"type":"string","title":"From Pubkey"},"to_pubkey":{"type":"string","title":"To Pubkey"},"transfer_hash":{"type":"string","title":"Transfer Hash"},"method":{"type":"string","title":"Method"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["from_pubkey","to_pubkey","transfer_hash","method","created_at"],"title":"ChainEntry"},"CheckCustomerRequest":{"properties":{"email":{"type":"string","title":"Email","description":"E-mail do cliente a verificar"}},"type":"object","required":["email"],"title":"CheckCustomerRequest"},"CheckPinStatusRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"CheckPinStatusRequest"},"CompanyUpdateRequest":{"properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"legalName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legalname"},"document":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"CompanyUpdateRequest"},"ConfirmKeyRequest":{"properties":{"device_id":{"type":"string","title":"Device Id"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"}},"type":"object","required":["device_id","pix_key","pix_key_type"],"title":"ConfirmKeyRequest"},"ConfirmKeyResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"ownership_match":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Match"}},"type":"object","required":["status","message"],"title":"ConfirmKeyResponse"},"ConsentRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"consent_type":{"type":"string","title":"Consent Type","default":"FEES_TOS"},"version":{"type":"string","title":"Version","default":"1.0"}},"type":"object","required":["user_id"],"title":"ConsentRequest"},"ContactRequestSchema":{"properties":{"full_name":{"type":"string","maxLength":200,"minLength":2,"title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"company":{"type":"string","maxLength":200,"minLength":1,"title":"Company"},"segment":{"type":"string","title":"Segment"},"message":{"type":"string","maxLength":5000,"minLength":10,"title":"Message"},"language":{"type":"string","pattern":"^(en|pt|es)$","title":"Language","default":"en"},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["full_name","email","company","segment","message"],"title":"ContactRequestSchema"},"CreateCardIntentRequest":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"}},"type":"object","required":["owner_id","amount"],"title":"CreateCardIntentRequest"},"CreateCardIntentResponse":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"payment_intent_id":{"type":"string","title":"Payment Intent Id"},"client_secret":{"type":"string","title":"Client Secret"},"publishable_key":{"type":"string","title":"Publishable Key"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"},"customer_ephemeral_key_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Ephemeral Key Secret"}},"type":"object","required":["operation_id","payment_intent_id","client_secret","publishable_key","amount","currency","status"],"title":"CreateCardIntentResponse"},"CreateDeliveryRequest":{"properties":{"tenantId":{"type":"string","title":"Tenantid"},"environment":{"type":"string","pattern":"^(sandbox|production)$","title":"Environment"},"secretType":{"type":"string","title":"Secrettype","default":"B2B_CLIENT_CREDENTIALS"},"ttlMinutes":{"type":"integer","title":"Ttlminutes","default":240},"authorizedEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorizedemail"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"rotateCredentials":{"type":"boolean","title":"Rotatecredentials","default":true}},"additionalProperties":false,"type":"object","required":["tenantId","environment"],"title":"CreateDeliveryRequest"},"CreateDisputeRequest":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"description":{"type":"string","maxLength":2000,"minLength":10,"title":"Description"},"evidence_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Evidence Url"}},"type":"object","required":["owner_id","transaction_id","description"],"title":"CreateDisputeRequest"},"CreateDisputeResponse":{"properties":{"id":{"type":"string","title":"Id"},"owner_id":{"type":"string","title":"Owner Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"transaction_type":{"type":"string","title":"Transaction Type"},"amount":{"type":"number","title":"Amount"},"description":{"type":"string","title":"Description"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","owner_id","transaction_id","transaction_type","amount","description","status","created_at"],"title":"CreateDisputeResponse"},"CreatePLCRequest":{"properties":{"amount":{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0,"title":"Amount","description":"Valor da PLC"},"currency":{"type":"string","pattern":"^[A-Z]{3}$","title":"Currency","description":"Moeda (ISO 4217)","default":"BRL"},"issuer_pubkey":{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$","title":"Issuer Pubkey","description":"Chave pública Ed25519 do emissor (64 hex chars)"},"device_id":{"type":"string","maxLength":64,"minLength":1,"title":"Device Id","description":"ID do dispositivo"},"ttl_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":1.0},{"type":"null"}],"title":"Ttl Hours","description":"TTL em horas (max 7 dias)"}},"type":"object","required":["amount","issuer_pubkey","device_id"],"title":"CreatePLCRequest"},"CreatePLCResponse":{"properties":{"token_id":{"type":"string","title":"Token Id"},"commitment_hash":{"type":"string","title":"Commitment Hash"},"encrypted_payload":{"type":"string","title":"Encrypted Payload"},"secret_key":{"type":"string","title":"Secret Key"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"expires_at":{"type":"string","title":"Expires At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["token_id","commitment_hash","encrypted_payload","secret_key","amount","currency","expires_at","status"],"title":"CreatePLCResponse"},"DepositPixRequest":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"device_id":{"type":"string","title":"Device Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"}},"type":"object","required":["owner_id","device_id","amount"],"title":"DepositPixRequest"},"DepositPixResponse":{"properties":{"deposit_id":{"type":"string","title":"Deposit Id"},"amount":{"type":"number","title":"Amount"},"asaas_payment_id":{"type":"string","title":"Asaas Payment Id"},"pix_qr_code_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Qr Code Image"},"pix_payload":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Payload"},"invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Url"},"status":{"type":"string","title":"Status"}},"type":"object","required":["deposit_id","amount","asaas_payment_id","status"],"title":"DepositPixResponse"},"DepositRequest":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"amount":{"type":"number","title":"Amount"},"reference_id":{"type":"string","title":"Reference Id"},"memo":{"type":"string","title":"Memo","default":"Crédito via Pix"}},"type":"object","required":["owner_id","amount","reference_id"],"title":"DepositRequest"},"DepositStatusResponse":{"properties":{"deposit_id":{"type":"string","title":"Deposit Id"},"amount":{"type":"number","title":"Amount"},"status":{"type":"string","title":"Status"},"settled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Settled At"}},"type":"object","required":["deposit_id","amount","status"],"title":"DepositStatusResponse"},"DeviceCreate":{"properties":{"device_id":{"type":"string","maxLength":128,"minLength":4,"title":"Device Id"},"merchant_id":{"type":"string","maxLength":64,"minLength":1,"title":"Merchant Id"},"condominium_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Condominium Id"},"device_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Device Name"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["device_id","merchant_id"],"title":"DeviceCreate"},"DeviceUpdate":{"properties":{"device_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Device Name"},"status":{"anyOf":[{"type":"string","pattern":"^(ACTIVE|INACTIVE|SUSPENDED)$"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"DeviceUpdate"},"DisputeStatsResponse":{"properties":{"total":{"type":"integer","title":"Total"},"pending":{"type":"integer","title":"Pending"},"under_review":{"type":"integer","title":"Under Review"},"approved":{"type":"integer","title":"Approved"},"denied":{"type":"integer","title":"Denied"}},"type":"object","required":["total","pending","under_review","approved","denied"],"title":"DisputeStatsResponse"},"EnrollRequest":{"properties":{"localId":{"type":"string","title":"Localid","description":"UUID local gerado pelo device Flutter"},"name":{"type":"string","maxLength":255,"minLength":2,"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"pinHash":{"type":"string","title":"Pinhash","description":"Hash PBKDF2 do PIN (nunca o PIN raw)"},"pinSalt":{"type":"string","title":"Pinsalt","description":"Salt utilizado no hash do PIN"},"faceEmbedding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Faceembedding","description":"Embedding facial serializado em base64 (vetor float32). NUNCA enviar imagem bruta."},"condominiumId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominiumid"},"merchantId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"}},"type":"object","required":["localId","name","pinHash","pinSalt"],"title":"EnrollRequest"},"EnrollResponse":{"properties":{"customerId":{"type":"string","title":"Customerid"},"walletId":{"type":"string","title":"Walletid"},"status":{"type":"string","title":"Status"},"isNew":{"type":"boolean","title":"Isnew"},"balanceCents":{"type":"integer","title":"Balancecents","default":0}},"type":"object","required":["customerId","walletId","status","isNew"],"title":"EnrollResponse"},"ExternalInsightUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":3},{"type":"null"}],"title":"Title"},"excerpt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Excerpt"},"external_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"External Url"},"external_canonical_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"External Canonical Url"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cover Image Url"},"cover_image_alt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Cover Image Alt"},"external_source_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"External Source Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"author_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author Name"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"is_featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Featured"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Seo Description"}},"type":"object","title":"ExternalInsightUpdate"},"ExternalManualCreate":{"properties":{"title":{"type":"string","maxLength":500,"minLength":3,"title":"Title"},"excerpt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Excerpt"},"external_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"External Url"},"external_canonical_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"External Canonical Url"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cover Image Url"},"cover_image_alt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Cover Image Alt"},"external_source_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"External Source Name"},"category":{"type":"string","title":"Category","default":"research_engineering"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"author_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author Name"},"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"is_featured":{"type":"boolean","title":"Is Featured","default":false},"status":{"type":"string","title":"Status","default":"draft"}},"type":"object","required":["title","external_url"],"title":"ExternalManualCreate"},"ExternalUrlRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["url"],"title":"ExternalUrlRequest"},"FaceTemplateSyncResponse":{"properties":{"count":{"type":"integer","title":"Count"},"templates":{"items":{"$ref":"#/components/schemas/SyncedFaceTemplateItem"},"type":"array","title":"Templates"}},"type":"object","required":["count","templates"],"title":"FaceTemplateSyncResponse"},"FeeEstimateRequest":{"properties":{"operation":{"type":"string","title":"Operation"},"amount":{"type":"number","title":"Amount"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["operation","amount"],"title":"FeeEstimateRequest"},"FeeEstimateResponse":{"properties":{"gross":{"type":"number","title":"Gross"},"fee":{"type":"number","title":"Fee"},"net":{"type":"number","title":"Net"},"description":{"type":"string","title":"Description"},"rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Id"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"minimum_fee_applied":{"type":"boolean","title":"Minimum Fee Applied","default":false},"min_amount_pix":{"type":"number","title":"Min Amount Pix","default":5.0},"min_amount_boleto":{"type":"number","title":"Min Amount Boleto","default":5.0},"min_amount_transfer":{"type":"number","title":"Min Amount Transfer","default":1.0}},"type":"object","required":["gross","fee","net","description"],"title":"FeeEstimateResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeartbeatRequest":{"properties":{"merchantId":{"type":"string","title":"Merchantid"},"pointOfSaleId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"},"terminalId":{"type":"string","title":"Terminalid"},"appVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appversion"},"pendingOrders":{"type":"integer","title":"Pendingorders","default":0},"pendingInventoryMovements":{"type":"integer","title":"Pendinginventorymovements","default":0},"lastLocalSaleAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastlocalsaleat"},"batteryLevel":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batterylevel"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["merchantId","terminalId"],"title":"HeartbeatRequest"},"ImportResult":{"properties":{"totalLines":{"type":"integer","title":"Totallines"},"imported":{"type":"integer","title":"Imported"},"errors":{"type":"integer","title":"Errors"},"errorDetails":{"items":{"type":"object"},"type":"array","title":"Errordetails"},"productsCreated":{"type":"integer","title":"Productscreated"},"productsUpdated":{"type":"integer","title":"Productsupdated"},"stockMovementsCreated":{"type":"integer","title":"Stockmovementscreated"}},"type":"object","required":["totalLines","imported","errors","errorDetails","productsCreated","productsUpdated","stockMovementsCreated"],"title":"ImportResult"},"InternalInsightCreate":{"properties":{"title":{"type":"string","maxLength":500,"minLength":3,"title":"Title"},"slug":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Slug"},"excerpt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Excerpt"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"category":{"type":"string","title":"Category","default":"research_engineering"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"author_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author Name"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cover Image Url"},"cover_image_alt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Cover Image Alt"},"is_featured":{"type":"boolean","title":"Is Featured","default":false},"status":{"type":"string","title":"Status","default":"draft"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Seo Description"},"og_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Og Image Url"}},"type":"object","required":["title"],"title":"InternalInsightCreate"},"InternalInsightUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":3},{"type":"null"}],"title":"Title"},"slug":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Slug"},"excerpt":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Excerpt"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"author_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Author Name"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Cover Image Url"},"cover_image_alt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Cover Image Alt"},"is_featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Featured"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"seo_title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Seo Description"},"og_image_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Og Image Url"}},"type":"object","title":"InternalInsightUpdate"},"InventoryMovementItem":{"properties":{"movementId":{"type":"string","title":"Movementid"},"productId":{"type":"string","title":"Productid"},"pointOfSaleId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"},"orderId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderid"},"movementType":{"type":"string","title":"Movementtype"},"quantity":{"type":"integer","title":"Quantity"},"previousQuantity":{"type":"integer","title":"Previousquantity"},"newQuantity":{"type":"integer","title":"Newquantity"},"source":{"type":"string","title":"Source","default":"local"},"createdAt":{"type":"string","title":"Createdat"},"extra":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","required":["movementId","productId","movementType","quantity","previousQuantity","newQuantity","createdAt"],"title":"InventoryMovementItem"},"InventorySyncRequest":{"properties":{"merchantId":{"type":"string","title":"Merchantid"},"terminalId":{"type":"string","title":"Terminalid"},"pointOfSaleId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pointofsaleid"},"batchId":{"type":"string","title":"Batchid"},"movements":{"items":{"$ref":"#/components/schemas/InventoryMovementItem"},"type":"array","title":"Movements"}},"type":"object","required":["merchantId","terminalId","batchId"],"title":"InventorySyncRequest"},"InventorySyncResponse":{"properties":{"batchId":{"type":"string","title":"Batchid"},"total":{"type":"integer","title":"Total"},"synced":{"items":{"type":"string"},"type":"array","title":"Synced"},"skipped":{"items":{"type":"string"},"type":"array","title":"Skipped"},"rejected":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Rejected"}},"type":"object","required":["batchId","total","synced","skipped","rejected"],"title":"InventorySyncResponse"},"KeyBackupRequest":{"properties":{"public_key":{"type":"string","title":"Public Key"},"device_id":{"type":"string","title":"Device Id"},"encrypted_seed":{"type":"string","title":"Encrypted Seed"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"device_signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Signature"},"operation_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Timestamp"}},"type":"object","required":["public_key","device_id","encrypted_seed"],"title":"KeyBackupRequest"},"KeyBackupResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"KeyBackupResponse"},"KeyLookupRequest":{"properties":{"keyType":{"type":"string","maxLength":16,"minLength":2,"title":"Keytype"},"pixKey":{"type":"string","maxLength":128,"minLength":1,"title":"Pixkey"}},"additionalProperties":false,"type":"object","required":["keyType","pixKey"],"title":"KeyLookupRequest"},"KeyRecoverRequest":{"properties":{"public_key":{"type":"string","title":"Public Key"},"device_signature":{"type":"string","title":"Device Signature"},"operation_timestamp":{"type":"string","title":"Operation Timestamp"}},"type":"object","required":["public_key","device_signature","operation_timestamp"],"title":"KeyRecoverRequest"},"KeyRecoverResponse":{"properties":{"found":{"type":"boolean","title":"Found"},"encrypted_seed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Encrypted Seed"},"public_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Key"}},"type":"object","required":["found"],"title":"KeyRecoverResponse"},"LimitIncreaseBody":{"properties":{"device_id":{"type":"string","maxLength":128,"minLength":4,"title":"Device Id"},"requested_limit":{"type":"number","exclusiveMinimum":0.0,"title":"Requested Limit"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["device_id","requested_limit"],"title":"LimitIncreaseBody"},"LimitIncreaseDecisionBody":{"properties":{"approve":{"type":"boolean","title":"Approve"},"approved_limit":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Approved Limit"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["approve"],"title":"LimitIncreaseDecisionBody"},"LiquidateRequest":{"properties":{"device_id":{"type":"string","title":"Device Id"},"owner_id":{"type":"string","title":"Owner Id"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"},"amount":{"type":"number","title":"Amount"},"token_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Id"},"withdrawal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Withdrawal Id"}},"type":"object","required":["device_id","owner_id","pix_key","pix_key_type","amount"],"title":"LiquidateRequest"},"LiquidateResponse":{"properties":{"status":{"type":"string","title":"Status"},"pix_out_request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Out Request Id"},"asaas_transfer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asaas Transfer Id"},"message":{"type":"string","title":"Message"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"type":"object","required":["status","message"],"title":"LiquidateResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MerchantCreateRequest":{"properties":{"merchantId":{"type":"string","title":"Merchantid"},"displayName":{"type":"string","title":"Displayname"},"legalName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legalname"},"document":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document"},"asaasAccountId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asaasaccountid"},"pixKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixkey"},"offlineLimitPerTx":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Offlinelimitpertx"},"offlineLimitDaily":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Offlinelimitdaily"}},"type":"object","required":["merchantId","displayName"],"title":"MerchantCreateRequest"},"MetadataPreviewRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"}},"type":"object","required":["url"],"title":"MetadataPreviewRequest"},"MetricEvent":{"properties":{"event":{"type":"string","maxLength":64,"title":"Event"},"path":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Path","default":""},"referrer":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Referrer","default":""},"lang":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Lang","default":""},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label","default":""},"href":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Href","default":""},"utm_source":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Utm Source","default":""}},"type":"object","required":["event"],"title":"MetricEvent"},"OrderCreateRequest":{"properties":{"orderId":{"type":"string","title":"Orderid"},"merchantId":{"type":"string","title":"Merchantid"},"terminalId":{"type":"string","title":"Terminalid"},"amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"},"description":{"type":"string","title":"Description","default":""},"items":{"items":{"type":"object"},"type":"array","title":"Items","default":[]},"expiresAt":{"type":"string","title":"Expiresat"},"orderHash":{"type":"string","title":"Orderhash"}},"type":"object","required":["orderId","merchantId","terminalId","amount","expiresAt","orderHash"],"title":"OrderCreateRequest"},"PLCStatusResponse":{"properties":{"token_id":{"type":"string","title":"Token Id"},"commitment_hash":{"type":"string","title":"Commitment Hash"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"transfer_count":{"type":"integer","title":"Transfer Count"},"expires_at":{"type":"string","title":"Expires At"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["token_id","commitment_hash","amount","currency","status","transfer_count","expires_at","created_at"],"title":"PLCStatusResponse"},"PaymentAuthorizeRequest":{"properties":{"customerId":{"type":"string","title":"Customerid"},"walletId":{"type":"string","title":"Walletid"},"amountCents":{"type":"integer","exclusiveMinimum":0.0,"title":"Amountcents"},"merchantId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"},"condominiumId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condominiumid"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"},"orderId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orderid"},"pinVerified":{"type":"boolean","title":"Pinverified","default":false},"faceVerified":{"type":"boolean","title":"Faceverified","default":false},"faceProviderSecure":{"type":"boolean","title":"Faceprovidersecure","description":"True somente quando o modelo SFace TFLite está carregado no device. Pagamentos com faceVerified=true DEVEM ter faceProviderSecure=true. Sem SFace: apenas cadastro e reconhecimento de teste são permitidos.","default":false},"localNonce":{"type":"string","title":"Localnonce","description":"Nonce único gerado pelo device para evitar double-spend offline"},"checkout_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Token","description":"Token de curta duração emitido após validação email+PIN+OTP. Quando presente, dispensa pinVerified/faceVerified — o OTP já é prova de posse."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Tag de origem para auditoria (ex: sunmi_investor_demo)"}},"type":"object","required":["customerId","walletId","amountCents","localNonce"],"title":"PaymentAuthorizeRequest"},"PaymentAuthorizeResponse":{"properties":{"paymentId":{"type":"string","title":"Paymentid"},"walletId":{"type":"string","title":"Walletid"},"amountCents":{"type":"integer","title":"Amountcents"},"status":{"type":"string","title":"Status"},"balanceCents":{"type":"integer","title":"Balancecents"},"declineReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Declinereason"}},"type":"object","required":["paymentId","walletId","amountCents","status","balanceCents","declineReason"],"title":"PaymentAuthorizeResponse"},"PendingQuestionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"question":{"type":"string","title":"Question"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","question","email","status","created_at"],"title":"PendingQuestionResponse"},"PinRecoveryOtpRequestBody":{"properties":{"channel":{"type":"string","title":"Channel","description":"'email' ou 'sms'","default":"email"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"}},"type":"object","title":"PinRecoveryOtpRequestBody"},"PinRecoveryOtpValidateBody":{"properties":{"otp":{"type":"string","maxLength":6,"minLength":6,"title":"Otp"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"}},"type":"object","required":["otp"],"title":"PinRecoveryOtpValidateBody"},"PinStatusResponse":{"properties":{"has_pin":{"type":"boolean","title":"Has Pin"},"has_email":{"type":"boolean","title":"Has Email"},"biometric_enabled":{"type":"boolean","title":"Biometric Enabled"},"locked":{"type":"boolean","title":"Locked","default":false},"locked_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locked Until"}},"type":"object","required":["has_pin","has_email","biometric_enabled"],"title":"PinStatusResponse"},"PixRedemptionResponse":{"properties":{"redemption_id":{"type":"string","title":"Redemption Id"},"token_id":{"type":"string","title":"Token Id"},"asaas_payment_id":{"type":"string","title":"Asaas Payment Id"},"pix_qr_code_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Qr Code Image"},"pix_payload":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Payload"},"pix_expiration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pix Expiration"},"invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Url"},"amount":{"type":"number","title":"Amount"},"fee":{"type":"number","title":"Fee"},"net_amount":{"type":"number","title":"Net Amount"},"status":{"type":"string","title":"Status"}},"type":"object","required":["redemption_id","token_id","asaas_payment_id","amount","fee","net_amount","status"],"title":"PixRedemptionResponse"},"PixTopupRequest":{"properties":{"amountCents":{"type":"integer","exclusiveMinimum":0.0,"title":"Amountcents","description":"Valor da recarga em centavos (ex: 1000 = R$ 10,00)"},"merchantId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchantid"},"posDeviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posdeviceid"}},"type":"object","required":["amountCents"],"title":"PixTopupRequest"},"PixTopupResponse":{"properties":{"topupId":{"type":"string","title":"Topupid"},"walletId":{"type":"string","title":"Walletid"},"amountCents":{"type":"integer","title":"Amountcents"},"pixQrCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixqrcode"},"pixCopyPaste":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixcopypaste"},"pixExpirationDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixexpirationdate"},"status":{"type":"string","title":"Status"}},"type":"object","required":["topupId","walletId","amountCents","pixQrCode","pixCopyPaste","pixExpirationDate","status"],"title":"PixTopupResponse"},"PointOfSaleCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locationname"}},"type":"object","required":["name"],"title":"PointOfSaleCreateRequest"},"PointOfSaleUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"locationName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locationname"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"PointOfSaleUpdateRequest"},"PromiseItem":{"properties":{"promise_id":{"type":"string","title":"Promise Id"},"status":{"type":"string","title":"Status"},"amount":{"type":"number","title":"Amount"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["promise_id","status","amount"],"title":"PromiseItem"},"QuestionPublicResponse":{"properties":{"id":{"type":"integer","title":"Id"},"question":{"type":"string","title":"Question"},"answer_text":{"type":"string","title":"Answer Text"},"answered_by":{"type":"string","title":"Answered By"},"likes":{"type":"integer","title":"Likes"},"dislikes":{"type":"integer","title":"Dislikes"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","question","answer_text","answered_by","likes","dislikes","created_at"],"title":"QuestionPublicResponse"},"QuestionSubmitRequest":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":10,"title":"Question"},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email"}},"type":"object","required":["question"],"title":"QuestionSubmitRequest"},"QuestionSubmitResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["success","message","id"],"title":"QuestionSubmitResponse"},"RedeemPLCRequest":{"properties":{"token_id":{"type":"string","maxLength":100,"minLength":1,"title":"Token Id","description":"ID da PLC"},"redeemer_pubkey":{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$","title":"Redeemer Pubkey","description":"Chave pública do resgatante (64 hex chars)"},"method":{"type":"string","pattern":"^(PIX|BOLETO|CRYPTO)$","title":"Method","description":"Método: PIX, BOLETO, CRYPTO"},"external_ref":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"External Ref","description":"Referência externa (chave Pix, etc.)"}},"type":"object","required":["token_id","redeemer_pubkey","method"],"title":"RedeemPLCRequest"},"RedeemPLCResponse":{"properties":{"token_id":{"type":"string","title":"Token Id"},"method":{"type":"string","title":"Method"},"amount":{"type":"number","title":"Amount"},"status":{"type":"string","title":"Status"},"chain_length":{"type":"integer","title":"Chain Length"}},"type":"object","required":["token_id","method","amount","status","chain_length"],"title":"RedeemPLCResponse"},"RedemptionRequest":{"properties":{"token_id":{"type":"string","title":"Token Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"},"device_id":{"type":"string","title":"Device Id"},"receiver_pubkey":{"type":"string","title":"Receiver Pubkey"}},"type":"object","required":["token_id","amount","device_id","receiver_pubkey"],"title":"RedemptionRequest"},"RegisterPinRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"pin_hash":{"type":"string","title":"Pin Hash"},"pin_salt":{"type":"string","title":"Pin Salt"},"email_recovery":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Recovery"},"current_pin_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Pin Hash"}},"type":"object","required":["user_id","pin_hash","pin_salt"],"title":"RegisterPinRequest"},"RegisterPinResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"RegisterPinResponse"},"RegisterRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"displayName":{"type":"string","title":"Displayname"},"legalName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legalname"},"document":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document"},"desiredPos":{"type":"integer","title":"Desiredpos","default":1},"acceptTerms":{"type":"boolean","title":"Acceptterms","default":true}},"type":"object","required":["name","email","password","displayName"],"title":"RegisterRequest"},"RegisterResponse":{"properties":{"merchantId":{"type":"string","title":"Merchantid"},"message":{"type":"string","title":"Message"},"subscriptionStatus":{"type":"string","title":"Subscriptionstatus","default":"pending"}},"type":"object","required":["merchantId","message"],"title":"RegisterResponse"},"RegulatedProfileRequest":{"properties":{"device_id":{"type":"string","title":"Device Id"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"full_name":{"type":"string","title":"Full Name"},"document":{"type":"string","title":"Document"},"document_type":{"type":"string","title":"Document Type"},"consent_accepted":{"type":"boolean","title":"Consent Accepted"},"consent_version":{"type":"string","title":"Consent Version","default":"1.0"}},"type":"object","required":["device_id","full_name","document","document_type","consent_accepted"],"title":"RegulatedProfileRequest"},"RegulatedProfileResponse":{"properties":{"status":{"type":"string","title":"Status"},"profile_id":{"type":"string","title":"Profile Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","profile_id","message"],"title":"RegulatedProfileResponse"},"ReleaseStalePromiseBody":{"properties":{"promise_id":{"type":"string","minLength":8,"title":"Promise Id"},"reason":{"type":"string","maxLength":120,"title":"Reason","default":"STALE_PROMISE_STATE_COMPENSATION"},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","required":["promise_id"],"title":"ReleaseStalePromiseBody"},"RequestEmailCodeRequest":{"properties":{"email":{"type":"string","title":"Email"},"pin":{"type":"string","maxLength":6,"minLength":4,"title":"Pin","description":"PIN numérico raw (validado server-side)"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"pos_device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pos Device Id"},"merchant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"},"purpose":{"type":"string","title":"Purpose","default":"pos_checkout"}},"type":"object","required":["email","pin"],"title":"RequestEmailCodeRequest"},"RequestResetRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"RequestResetRequest"},"RequestResetResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"has_email":{"type":"boolean","title":"Has Email"}},"type":"object","required":["success","message","has_email"],"title":"RequestResetResponse"},"ResendVerificationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationRequest"},"ResetPinRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"reset_token":{"type":"string","title":"Reset Token"},"new_pin_hash":{"type":"string","title":"New Pin Hash"},"new_pin_salt":{"type":"string","title":"New Pin Salt"}},"type":"object","required":["user_id","reset_token","new_pin_hash","new_pin_salt"],"title":"ResetPinRequest"},"RevealRequest":{"properties":{"field_name":{"type":"string","title":"Field Name"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["field_name"],"title":"RevealRequest"},"RevealResponse":{"properties":{"field_name":{"type":"string","title":"Field Name"},"value":{"type":"string","title":"Value"},"audit_recorded":{"type":"boolean","title":"Audit Recorded"},"warning":{"type":"string","title":"Warning","default":"Visualização de dado sensível registrada para auditoria."}},"type":"object","required":["field_name","value","audit_recorded"],"title":"RevealResponse"},"RiskFlagResponse":{"properties":{"id":{"type":"string","title":"Id"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"pubkey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pubkey"},"token_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Id"},"flag_type":{"type":"string","title":"Flag Type"},"severity":{"type":"string","title":"Severity"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"resolved":{"type":"boolean","title":"Resolved"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","device_id","pubkey","token_id","flag_type","severity","description","resolved","created_at"],"title":"RiskFlagResponse"},"StockAdjustRequest":{"properties":{"productId":{"type":"string","title":"Productid"},"pointOfSaleId":{"type":"string","title":"Pointofsaleid"},"quantity":{"type":"integer","title":"Quantity"},"reason":{"type":"string","title":"Reason","default":"MANUAL_ADJUSTMENT"}},"type":"object","required":["productId","pointOfSaleId","quantity"],"title":"StockAdjustRequest"},"SubmitPclRequest":{"properties":{"pclId":{"type":"string","title":"Pclid"},"merchantId":{"type":"string","title":"Merchantid"},"terminalId":{"type":"string","title":"Terminalid"},"orderId":{"type":"string","title":"Orderid"},"amount":{"type":"integer","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"},"deviceId":{"type":"string","title":"Deviceid"},"nonce":{"type":"string","title":"Nonce"},"expiresAt":{"type":"string","title":"Expiresat"},"orderHash":{"type":"string","title":"Orderhash"},"signature":{"type":"string","title":"Signature"},"createdAt":{"type":"string","title":"Createdat"}},"type":"object","required":["pclId","merchantId","terminalId","orderId","amount","deviceId","nonce","expiresAt","orderHash","signature","createdAt"],"title":"SubmitPclRequest","description":"PCL submetida diretamente pelo app cliente (sem autenticação de terminal)."},"SyncBatchItem":{"properties":{"pclId":{"type":"string","title":"Pclid"},"orderId":{"type":"string","title":"Orderid"},"pclPayload":{"type":"object","title":"Pclpayload"},"receivedOfflineAt":{"type":"string","title":"Receivedofflineat"}},"type":"object","required":["pclId","orderId","pclPayload","receivedOfflineAt"],"title":"SyncBatchItem"},"SyncBatchRequest":{"properties":{"merchantId":{"type":"string","title":"Merchantid"},"terminalId":{"type":"string","title":"Terminalid"},"batchId":{"type":"string","title":"Batchid"},"createdAt":{"type":"string","title":"Createdat"},"items":{"items":{"$ref":"#/components/schemas/SyncBatchItem"},"type":"array","title":"Items"}},"type":"object","required":["merchantId","terminalId","batchId","createdAt","items"],"title":"SyncBatchRequest"},"SyncBatchResponse":{"properties":{"batchId":{"type":"string","title":"Batchid"},"total":{"type":"integer","title":"Total"},"synced":{"items":{"type":"string"},"type":"array","title":"Synced"},"rejected":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Rejected"}},"type":"object","required":["batchId","total","synced","rejected"],"title":"SyncBatchResponse"},"SyncedFaceTemplateItem":{"properties":{"customerId":{"type":"string","title":"Customerid"},"walletId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Walletid"},"name":{"type":"string","title":"Name"},"embedding":{"type":"string","title":"Embedding"},"embeddingVersion":{"type":"string","title":"Embeddingversion"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat"}},"type":"object","required":["customerId","walletId","name","embedding","embeddingVersion","updatedAt"],"title":"SyncedFaceTemplateItem"},"TerminalCreateRequest":{"properties":{"terminalId":{"type":"string","title":"Terminalid"},"merchantId":{"type":"string","title":"Merchantid"},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicename"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["terminalId","merchantId"],"title":"TerminalCreateRequest"},"TerminalPairRequest":{"properties":{"code":{"type":"string","title":"Code"},"merchantId":{"type":"string","title":"Merchantid"},"pointOfSaleId":{"type":"string","title":"Pointofsaleid"},"terminalId":{"type":"string","title":"Terminalid"},"terminalKey":{"type":"string","title":"Terminalkey"}},"type":"object","required":["code","merchantId","pointOfSaleId","terminalId","terminalKey"],"title":"TerminalPairRequest"},"TokenRequest":{"properties":{"clientId":{"type":"string","maxLength":64,"minLength":3,"title":"Clientid"},"clientSecret":{"type":"string","maxLength":256,"minLength":16,"title":"Clientsecret"}},"additionalProperties":false,"type":"object","required":["clientId","clientSecret"],"title":"TokenRequest"},"TopupStatusResponse":{"properties":{"topupId":{"type":"string","title":"Topupid"},"walletId":{"type":"string","title":"Walletid"},"amountCents":{"type":"integer","title":"Amountcents"},"status":{"type":"string","title":"Status"},"pixQrCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixqrcode"},"pixCopyPaste":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixcopypaste"},"pixExpirationDate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixexpirationdate"},"settledAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Settledat"}},"type":"object","required":["topupId","walletId","amountCents","status","pixQrCode","pixCopyPaste","pixExpirationDate","settledAt"],"title":"TopupStatusResponse"},"TransactionItem":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"reference_type":{"type":"string","title":"Reference Type"},"reference_id":{"type":"string","title":"Reference Id"},"direction":{"type":"string","title":"Direction"},"amount":{"type":"number","title":"Amount"},"bucket":{"type":"string","title":"Bucket"},"status":{"type":"string","title":"Status"},"memo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memo"},"risk_level":{"type":"string","title":"Risk Level"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","type","reference_type","reference_id","direction","amount","bucket","status","risk_level"],"title":"TransactionItem"},"TransferPLCRequest":{"properties":{"token_id":{"type":"string","maxLength":100,"minLength":1,"title":"Token Id","description":"ID da PLC"},"from_pubkey":{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$","title":"From Pubkey","description":"Chave pública do remetente (64 hex chars)"},"to_pubkey":{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$","title":"To Pubkey","description":"Chave pública do destinatário (64 hex chars)"},"signature":{"type":"string","maxLength":256,"minLength":1,"pattern":"^[0-9a-fA-F]+$","title":"Signature","description":"Assinatura Ed25519 hex"},"transfer_method":{"type":"string","pattern":"^(BLE|NFC|QR|MESH|KEY)$","title":"Transfer Method","description":"Método: BLE, NFC, QR, MESH, KEY","default":"QR"},"timestamp":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timestamp","description":"Timestamp ISO 8601 usado na assinatura"}},"type":"object","required":["token_id","from_pubkey","to_pubkey","signature"],"title":"TransferPLCRequest"},"TransferPLCResponse":{"properties":{"token_id":{"type":"string","title":"Token Id"},"transfer_hash":{"type":"string","title":"Transfer Hash"},"transfer_count":{"type":"integer","title":"Transfer Count"},"status":{"type":"string","title":"Status"}},"type":"object","required":["token_id","transfer_hash","transfer_count","status"],"title":"TransferPLCResponse"},"UpdateEmailRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","format":"email","title":"Email"},"current_pin_hash":{"type":"string","title":"Current Pin Hash"}},"type":"object","required":["user_id","email","current_pin_hash"],"title":"UpdateEmailRequest"},"ValidateKeyRequest":{"properties":{"device_id":{"type":"string","title":"Device Id"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"}},"type":"object","required":["device_id","pix_key","pix_key_type"],"title":"ValidateKeyRequest"},"ValidateKeyResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"ownership_match":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Match"},"consult_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consult Id"}},"type":"object","required":["status","message"],"title":"ValidateKeyResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailCodeRequest":{"properties":{"challenge_id":{"type":"string","title":"Challenge Id"},"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"pos_device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pos Device Id"},"merchant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant Id"}},"type":"object","required":["challenge_id","code"],"title":"VerifyEmailCodeRequest"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VerifyPinRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"pin_hash":{"type":"string","title":"Pin Hash"}},"type":"object","required":["user_id","pin_hash"],"title":"VerifyPinRequest"},"VerifyPinResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"locked":{"type":"boolean","title":"Locked","default":false},"locked_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locked Until"},"attempts_remaining":{"type":"integer","title":"Attempts Remaining","default":5}},"type":"object","required":["valid"],"title":"VerifyPinResponse"},"VoteResponse":{"properties":{"likes":{"type":"integer","title":"Likes"},"dislikes":{"type":"integer","title":"Dislikes"}},"type":"object","required":["likes","dislikes"],"title":"VoteResponse"},"WalletBalanceResponse":{"properties":{"walletId":{"type":"string","title":"Walletid"},"balanceCents":{"type":"integer","title":"Balancecents"},"status":{"type":"string","title":"Status"},"lastSync":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastsync"}},"type":"object","required":["walletId","balanceCents","status","lastSync"],"title":"WalletBalanceResponse"},"WithdrawBalanceRequest":{"properties":{"owner_id":{"type":"string","title":"Owner Id"},"device_id":{"type":"string","title":"Device Id"},"amount":{"type":"number","title":"Amount"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"}},"type":"object","required":["owner_id","device_id","amount","pix_key","pix_key_type"],"title":"WithdrawBalanceRequest"},"WithdrawBalanceResponse":{"properties":{"withdrawal_id":{"type":"string","title":"Withdrawal Id"},"amount":{"type":"number","title":"Amount"},"fee":{"type":"number","title":"Fee"},"net_amount":{"type":"number","title":"Net Amount"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"},"asaas_transfer_id":{"type":"string","title":"Asaas Transfer Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["withdrawal_id","amount","fee","net_amount","pix_key","pix_key_type","asaas_transfer_id","status","message"],"title":"WithdrawBalanceResponse"},"WithdrawPixRequest":{"properties":{"token_id":{"type":"string","title":"Token Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"BRL"},"device_id":{"type":"string","title":"Device Id"},"receiver_pubkey":{"type":"string","title":"Receiver Pubkey"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"}},"type":"object","required":["token_id","amount","device_id","receiver_pubkey","pix_key","pix_key_type"],"title":"WithdrawPixRequest"},"WithdrawPixResponse":{"properties":{"redemption_id":{"type":"string","title":"Redemption Id"},"token_id":{"type":"string","title":"Token Id"},"asaas_transfer_id":{"type":"string","title":"Asaas Transfer Id"},"amount":{"type":"number","title":"Amount"},"fee":{"type":"number","title":"Fee"},"net_amount":{"type":"number","title":"Net Amount"},"pix_key":{"type":"string","title":"Pix Key"},"pix_key_type":{"type":"string","title":"Pix Key Type"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["redemption_id","token_id","asaas_transfer_id","amount","fee","net_amount","pix_key","pix_key_type","status","message"],"title":"WithdrawPixResponse"},"app__routes__auth__LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","default":28800}},"type":"object","required":["access_token"],"title":"LoginResponse"},"app__routes__merchant_auth__LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","default":28800},"merchantId":{"type":"string","title":"Merchantid"},"subscriptionStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscriptionstatus"}},"type":"object","required":["access_token","merchantId"],"title":"LoginResponse"},"app__routes__merchant_portal__ProductCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"sku":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sku"},"barcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barcode"},"price":{"type":"integer","title":"Price"},"currency":{"type":"string","title":"Currency","default":"BRL"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"stockQuantity":{"type":"integer","title":"Stockquantity","default":0},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name","price"],"title":"ProductCreateRequest"},"app__routes__pos__ProductCreateRequest":{"properties":{"productId":{"type":"string","title":"Productid"},"merchantId":{"type":"string","title":"Merchantid"},"name":{"type":"string","title":"Name"},"sku":{"type":"string","title":"Sku","default":""},"barcode":{"type":"string","title":"Barcode","default":""},"price":{"type":"integer","minimum":0.0,"title":"Price"},"currency":{"type":"string","title":"Currency","default":"BRL"},"stockQuantity":{"type":"integer","title":"Stockquantity","default":0},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["productId","merchantId","name","price"],"title":"ProductCreateRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"PLC","description":"Criação e consulta de Promessas de Liquidação Criptográficas"},{"name":"Transfer","description":"Transferência de PLCs entre portadores"},{"name":"Redemption","description":"Resgate e liquidação de PLCs via Pix, Boleto ou Crypto"},{"name":"Admin","description":"Dashboard administrativo — estatísticas, listagem e gestão"},{"name":"Webhooks","description":"Webhooks para Supabase e provedores de pagamento"}]}