{
  "info": {
    "name": "API de Antecipação de Recebíveis — Zemo Capital",
    "description": "API V2 para originadores realizarem antecipação de recebíveis.\n\n> ⚠️ **Teste interativo (\"Testar no navegador\")**\n> As requisições vão direto para o servidor selecionado, sem proxy de terceiros. Para homologar, selecione **Sandbox** e use apenas credenciais `zk_test_*`.\n> Obtenha o JWT executando `POST /v1/auth/token` com o corpo JSON e informe o `access_token` como Bearer nas demais operações.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://receivables-api-sandbox.zemocapital.com",
      "type": "string"
    },
    {
      "key": "auth_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "client_id",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_payable_v1_assignor_payables_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_record_payable_payment_v1_assignor_payables__payable_id__payments_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_write_off_payable_v1_assignor_payables__payable_id__write_off_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_assignor_v1_assignors_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_update_assignor_v1_assignors__assignor_id__patch",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_discount_credit_v1_discount_credits_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_operation_direct_v1_operations_direct_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_cancel_operation_v1_operations__operation_id__cancel_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_send_operation_contract_for_signature_v1_operations__operation_id__contract_send_for_signature_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_payer_v1_payers_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_update_payer_v1_payers__payer_id__patch",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_archive_payer_v1_payers__payer_id__delete",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_simulate_anticipation_v1_simulate_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_register_stock_item_v1_stock_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_request_anticipation_from_stock_v1_stock_request_anticipation_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_simulate_anticipation_from_stock_v1_stock_simulate_anticipation_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_update_stock_item_v1_stock__item_id__patch",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_cancel_stock_item_v1_stock__item_id__cancel_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_expire_stock_item_v1_stock__item_id__expire_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_create_webhook_v1_webhooks_post",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_update_webhook_v1_webhooks__webhook_id__patch",
      "value": "",
      "type": "string"
    },
    {
      "key": "idempotency_archive_webhook_v1_webhooks__webhook_id__delete",
      "value": "",
      "type": "string"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{auth_token}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Assignor Payables",
      "description": "Payables pós-antecipação",
      "item": [
        {
          "name": "List Payables",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables"
              ],
              "query": [
                {
                  "key": "assignor_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Create Payable",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_payable_v1_assignor_payables_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assignor_id\": \"string\",\n  \"counterparty_kind\": \"ORIGINATOR_DIRECT\",\n  \"kind\": \"string\",\n  \"amount_brl\": 10000.0,\n  \"reason\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_payable_v1_assignor_payables_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Get Payable",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables/{payable_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables",
                ":payable_id"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "List Payable Payments",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables/{payable_id}/payments",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables",
                ":payable_id",
                "payments"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Registrar pagamento de um payable",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables/{payable_id}/payments",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables",
                ":payable_id",
                "payments"
              ]
            },
            "description": "Registra um pagamento contra o payable e abate `remaining_amount_brl`.\n\n**Dedup opcional:** envie `external_id` com o identificador do pagamento no seu sistema e um retry com o MESMO `external_id` devolve o pagamento original (`idempotent_replay: true`) em vez de registrar um segundo debito. Sem `external_id` o comportamento e o de sempre — dois POSTs iguais registram dois pagamentos, que e o correto para dois pagamentos parciais legitimos de mesmo valor.\n\nO replay vale inclusive para o retry do pagamento que LIQUIDOU o payable. **Excecao do `external_id`:** apos um write-off o dedup por `external_id` responde `409 payable_already_settled` em vez de replayar, porque a divida foi resolvida por decisao contabil e nao ha saldo a devolver. Isso nao afeta o `Idempotency-Key`: se a chamada original enviou o header, o retry com a mesma chave dentro do TTL continua devolvendo a resposta original, como especificado para o header.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_record_payable_payment_v1_assignor_payables__payable_id__payments_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"source\": \"string\",\n  \"paid_amount_brl\": 10000.0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_record_payable_payment_v1_assignor_payables__payable_id__payments_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Write Off Payable",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/assignor-payables/{payable_id}/write-off",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignor-payables",
                ":payable_id",
                "write-off"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_write_off_payable_v1_assignor_payables__payable_id__write_off_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_write_off_payable_v1_assignor_payables__payable_id__write_off_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Assignors",
      "description": "Cedentes",
      "item": [
        {
          "name": "Listar cedentes",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignors",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignors"
              ],
              "query": [
                {
                  "key": "payer_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Retorna cedentes cadastrados, filtrados opcionalmente por sacado.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Cadastrar cedente",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/assignors",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignors"
              ]
            },
            "description": "Registra um novo cedente vinculado ao originador. Dedup por document: se CNPJ/CPF ja existe, retorna 200.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_assignor_v1_assignors_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"document\": \"12345678000195\",\n  \"legal_name\": \"string\",\n  \"type\": \"J\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_assignor_v1_assignors_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Obter cedente",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignors/{assignor_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignors",
                ":assignor_id"
              ]
            },
            "description": "Retorna detalhes do cedente incluindo dados de contato e conta bancaria.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Atualizar cedente",
          "request": {
            "method": "PATCH",
            "url": {
              "raw": "{{base_url}}/v1/assignors/{assignor_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignors",
                ":assignor_id"
              ]
            },
            "description": "Atualiza campos do cedente. Envia apenas os campos que deseja alterar.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_update_assignor_v1_assignors__assignor_id__patch}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_update_assignor_v1_assignors__assignor_id__patch';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Saldo em aberto do cedente",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/assignors/{assignor_id}/outstanding-balance",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "assignors",
                ":assignor_id",
                "outstanding-balance"
              ]
            },
            "description": "Retorna o saldo devedor total do cedente, separado em atrasado e a vencer. Inclui detalhes dos titulos em atraso.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Auth",
      "description": "Autenticação de API (Client Credentials) e sessão de usuário (JWT)",
      "item": [
        {
          "name": "Login",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/auth/login",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "auth",
                "login"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"string\",\n  \"password\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Me",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/auth/me",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "auth",
                "me"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Trocar credenciais de API por JWT (Client Credentials)",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/auth/token",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "auth",
                "token"
              ]
            },
            "description": "Client Credentials flow: exchange client_id + client_secret for a short-lived JWT RS256 token. Use the returned token in subsequent requests via Authorization: Bearer <token>. TTL: 15 minutes.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": \"{{client_id}}\",\n  \"client_secret\": \"{{vault:zemo_client_secret}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.collectionVariables.unset('auth_token');"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "let body = {};",
                  "try { body = pm.response.json(); } catch (error) {}",
                  "if (body.access_token) pm.collectionVariables.set('auth_token', body.access_token);"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Bank Accounts",
      "description": "Contas bancárias",
      "item": [
        {
          "name": "List Bank Accounts",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/bank-accounts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "bank-accounts"
              ],
              "query": [
                {
                  "key": "owner_assignor_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "List bank accounts for assignors belonging to this originator.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Discount Credits",
      "description": "Créditos de desconto",
      "item": [
        {
          "name": "List Discount Credits",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/discount-credits",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "discount-credits"
              ],
              "query": [
                {
                  "key": "assignor_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "active_only",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Criar credito de desconto",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/discount-credits",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "discount-credits"
              ]
            },
            "description": "Cria um credito de desconto para o cedente (consumido por FIFO nas operacoes seguintes).\n\n**Dedup opcional:** envie `external_id` com o identificador do credito no seu sistema e um retry com o MESMO `external_id` devolve o credito original (`idempotent_replay: true`) em vez de criar um segundo. Sem `external_id` o comportamento e o de sempre.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_discount_credit_v1_discount_credits_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assignor_id\": \"string\",\n  \"source_kind\": \"string\",\n  \"original_amount_brl\": 10000.0,\n  \"reason\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_discount_credit_v1_discount_credits_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "List Credit Consumptions",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/discount-credits/{credit_id}/consumptions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "discount-credits",
                ":credit_id",
                "consumptions"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Flow",
      "description": "",
      "item": [
        {
          "name": "Fluxo da API",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/flow",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "flow"
              ]
            },
            "description": "Retorna a descricao machine-readable do fluxo da API. Use para entender a sequencia de chamadas necessarias para completar uma antecipacao.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Health",
      "description": "Health checks",
      "item": [
        {
          "name": "Service health check",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/health",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "health"
              ]
            },
            "description": "Returns service status, env, version, and uptime info. Used by ALB target group, ECS healthcheck, and smoke tests.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Protected deep health check",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/health/deep",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "health",
                "deep"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Operations",
      "description": "Operações de antecipação",
      "item": [
        {
          "name": "Listar operacoes",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/operations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations"
              ],
              "query": [
                {
                  "key": "lifecycle_status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "returning_status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "assignor_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Retorna operacoes filtradas por status, cedente ou situacao de retorno.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Obter operacao",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/operations/{operation_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                ":operation_id"
              ]
            },
            "description": "Retorna detalhes da operacao incluindo taxas aplicadas e status.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Cancelar operacao",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/operations/{operation_id}/cancel",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                ":operation_id",
                "cancel"
              ]
            },
            "description": "Cancela operacao em status WAITING_APPROVAL. Retorna 409 se ja aprovada.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_cancel_operation_v1_operations__operation_id__cancel_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_cancel_operation_v1_operations__operation_id__cancel_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Enviar contrato para assinatura",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/operations/{operation_id}/contract/send-for-signature",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                ":operation_id",
                "contract",
                "send-for-signature"
              ]
            },
            "description": "Dispara o contrato da operacao para assinatura e devolve a `sign_url` de cada signatario.\n\nEm geral voce **nao precisa chamar esta rota**: operacoes criadas pela API disparam o contrato automaticamente assim que sao aprovadas. Ela existe para (a) o modo **embedded**, quando voce quer apresentar o link de assinatura na sua propria interface em vez de deixar o e-mail automatico sair, e (b) re-disparo apos falha.\n\nPor isso o scope e **`contract:send`**, separado do `contract:read` do acompanhamento: ele e um **opt-in de borda**, nao faz parte do recorte tipico. Peca-o so na credencial que realmente dispara contrato.\n\nSe o contrato ja foi despachado, responde `409 contract_already_exists` — use `GET /v1/operations/{operation_id}/contract/signers` para obter as URLs do despacho vigente.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_send_operation_contract_for_signature_v1_operations__operation_id__contract_send_for_signature_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_send_operation_contract_for_signature_v1_operations__operation_id__contract_send_for_signature_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Consultar signatarios do contrato",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/operations/{operation_id}/contract/signers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                ":operation_id",
                "contract",
                "signers"
              ]
            },
            "description": "Le AO VIVO no provedor de assinatura os signatarios do contrato da operacao, com o `status` de cada um e a `sign_url` para assinar. E a fonte a usar sempre que voce precisar da URL de assinatura e nao a tiver em maos — inclusive no replay de idempotencia do disparo, em que a `sign_url` volta `null` por redacao deliberada do cache.\n\nExige apenas **`contract:read`**: como o disparo e automatico na aprovacao, acompanhar a assinatura e o caso TIPICO e nao precisa vir acompanhado do poder de disparar (`contract:send`).",
            "header": []
          },
          "response": []
        },
        {
          "name": "Listar titulos da operacao",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/operations/{operation_id}/titles",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                ":operation_id",
                "titles"
              ]
            },
            "description": "Retorna titulos com saldo devedor corrente.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Operations Direct",
      "description": "Criação direta de operação",
      "item": [
        {
          "name": "Criar operacao direta",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/operations/direct",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "operations",
                "direct"
              ]
            },
            "description": "Envia cedente, dados bancarios, recebiveis e taxas em uma unica chamada. O sistema registra cedente, sacado e conta automaticamente se nao existirem. A operacao nasce em `APPROVED_DIRECT` quando o total solicitado cabe no limite de auto-aprovacao da policy, e em `WAITING_APPROVAL` caso contrario (inclusive quando nao ha limite configurado).",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_operation_direct_v1_operations_direct_post}}",
                "description": "OBRIGATORIA nesta rota: sem o header a requisicao e recusada com `422` `idempotency_key_required`, antes de qualquer efeito. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Empresa ABC Ltda\",\n  \"type\": \"J\",\n  \"cpf\": \"12345678901\",\n  \"cnpj\": \"12345678000195\",\n  \"email\": \"cedente@empresa.com.br\",\n  \"phone\": \"11999998888\",\n  \"bank\": {\n    \"code\": \"341\",\n    \"agency\": \"1234\",\n    \"account\": \"56789-0\",\n    \"type\": \"CC\"\n  },\n  \"product_id\": \"b3f1c2a4-5d6e-7f80-9a1b-2c3d4e5f6a7b\",\n  \"policy_id\": \"01970dc5-1234-7000-8000-000000000000\",\n  \"receivables\": [\n    {\n      \"external_id\": \"NF-2026-001\",\n      \"identifier\": \"REC-001\",\n      \"payer_name\": \"Empresa XYZ Ltda\",\n      \"payer_document\": \"98765432000198\",\n      \"due_date\": \"2026-08-15\",\n      \"backing_type\": \"NFE\",\n      \"gross_future_value\": 12000.0,\n      \"gross_future_value_deductions\": 2000.0,\n      \"net_future_value\": 10000.0,\n      \"requested_net_future_value\": 10000.0,\n      \"requested_net_future_value_percent\": 60.0,\n      \"monthly_rate_pct\": 3.5,\n      \"discount_pct\": 2.0,\n      \"fixed_discount_brl\": 500.0,\n      \"gross_face_value\": 12000.0,\n      \"net_face_value\": 10000.0,\n      \"requested_advance_value\": 10000.0\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_operation_direct_v1_operations_direct_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Originators",
      "description": "Dados do originador",
      "item": [
        {
          "name": "Obter meu originador",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/originators/me",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "originators",
                "me"
              ]
            },
            "description": "Retorna dados do originador autenticado.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Payers",
      "description": "Sacados",
      "item": [
        {
          "name": "Listar sacados",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/payers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payers"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Retorna sacados cadastrados do originador.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Cadastrar sacado",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/payers",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payers"
              ]
            },
            "description": "Registra um novo sacado vinculado ao originador. Aceita CPF (11 digitos) ou CNPJ (14 digitos) no campo `cnpj`, com validacao de digito verificador. Dedup por documento normalizado: se o sacado ja existe, retorna o existente (200); se estava arquivado, reativa com os dados enviados (200).",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_payer_v1_payers_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"cnpj\": \"12345678000195\",\n  \"legal_name\": \"string\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_payer_v1_payers_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Obter sacado",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/payers/{payer_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payers",
                ":payer_id"
              ]
            },
            "description": "Retorna detalhes do sacado incluindo endereco e configuracoes.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Atualizar sacado",
          "request": {
            "method": "PATCH",
            "url": {
              "raw": "{{base_url}}/v1/payers/{payer_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payers",
                ":payer_id"
              ]
            },
            "description": "Atualiza campos do sacado. Envia apenas os campos que deseja alterar.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_update_payer_v1_payers__payer_id__patch}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_update_payer_v1_payers__payer_id__patch';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Arquivar sacado",
          "request": {
            "method": "DELETE",
            "url": {
              "raw": "{{base_url}}/v1/payers/{payer_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payers",
                ":payer_id"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_archive_payer_v1_payers__payer_id__delete}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_archive_payer_v1_payers__payer_id__delete';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Products",
      "description": "Catálogo de produtos financeiros (product_id)",
      "item": [
        {
          "name": "Listar produtos disponiveis",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/products",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "products"
              ],
              "query": [
                {
                  "key": "product_type",
                  "value": "",
                  "description": "Filtra por tipo de produto (match exato)",
                  "disabled": true
                },
                {
                  "key": "is_primary",
                  "value": "",
                  "description": "Filtra por produto/policy primaria",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "Tamanho da pagina (1-200)",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "Deslocamento para paginacao",
                  "disabled": true
                }
              ]
            },
            "description": "Lista os produtos financeiros disponiveis para o originador autenticado (read-only). Um registro por `product_id` — a policy ativa primaria ou mais recente. Use o `product_id` retornado em /simulate, /operations/direct, /stock/simulate-anticipation e /stock/request-anticipation.\n\nFiltros opcionais: `product_type`, `is_primary`. Paginacao: `limit` (1-200, default 50) e `offset`. O campo `total` traz a contagem antes da paginacao.",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Simulation",
      "description": "Simulação de antecipação",
      "item": [
        {
          "name": "Simular antecipacao",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/simulate",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "simulate"
              ]
            },
            "description": "Calcula o valor liquido, taxas e descontos de uma antecipacao **sem criar nada no sistema**. Hierarquia completa de taxas: recebivel > operacao > cedente > sacado > policy originador. Para ativar o nivel do cedente, informe `assignor_document`. O nivel do sacado e resolvido automaticamente via `payer_document` de cada recebivel.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_simulate_anticipation_v1_simulate_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assignor_document\": \"12345678000195\",\n  \"receivables\": [\n    {\n      \"external_id\": \"NF-2026-001\",\n      \"identifier\": \"REC001\",\n      \"payer_name\": \"Cliente XPTO Ltda\",\n      \"payer_document\": \"98765432000198\",\n      \"due_date\": \"2026-08-15\",\n      \"gross_future_value\": 12000.0,\n      \"gross_future_value_deductions\": 2000.0,\n      \"net_future_value\": 10000.0,\n      \"requested_net_future_value\": 10000.0,\n      \"requested_net_future_value_percent\": 60.0,\n      \"monthly_rate_pct\": 3.5,\n      \"discount_pct\": 2.0,\n      \"fixed_discount_brl\": 500.0,\n      \"gross_face_value\": 12000.0,\n      \"net_face_value\": 10000.0,\n      \"requested_advance_value\": 10000.0\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_simulate_anticipation_v1_simulate_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Stock",
      "description": "Estoque de recebíveis",
      "item": [
        {
          "name": "Listar estoque de recebiveis",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/stock",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock"
              ],
              "query": [
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "assignor_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "payer_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Retorna recebiveis registrados, filtrados por status, cedente ou sacado.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Registrar recebivel no estoque",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/stock",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock"
              ]
            },
            "description": "Cadastra um recebivel (NF, duplicata, contrato) como potencial antecipacao.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_register_stock_item_v1_stock_post}}",
                "description": "OBRIGATORIA nesta rota: sem o header a requisicao e recusada com `422` `idempotency_key_required`, antes de qualquer efeito. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assignor_id\": \"00000000-0000-0000-0000-000000000000\",\n  \"payer_id\": \"00000000-0000-0000-0000-000000000000\",\n  \"external_id\": \"string\",\n  \"backing_type\": \"NFE\",\n  \"due_date\": \"2026-08-15\",\n  \"pre_authorized\": false,\n  \"gross_face_value\": 10000.0,\n  \"net_face_value\": 10000.0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_register_stock_item_v1_stock_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Solicitar antecipacao do estoque",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/stock/request-anticipation",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                "request-anticipation"
              ]
            },
            "description": "Selecione itens do estoque e solicite antecipacao. A operacao e criada automaticamente. Status WAITING_APPROVAL se precisa de aprovacao, APPROVED_DIRECT se auto-aprovado.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_request_anticipation_from_stock_v1_stock_request_anticipation_post}}",
                "description": "OBRIGATORIA nesta rota: sem o header a requisicao e recusada com `422` `idempotency_key_required`, antes de qualquer efeito. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"stock_item_ids\": [\n    \"string\"\n  ],\n  \"bank\": {},\n  \"product_id\": \"b3f1c2a4-5d6e-7f80-9a1b-2c3d4e5f6a7b\",\n  \"policy_id\": \"01970dc5-1234-7000-8000-000000000000\",\n  \"requested_advance_value\": 10000.0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_request_anticipation_from_stock_v1_stock_request_anticipation_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Simular antecipacao do estoque",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/stock/simulate-anticipation",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                "simulate-anticipation"
              ]
            },
            "description": "Calcula o valor liquido, taxas e descontos de uma antecipacao a partir de itens ja registrados no estoque, **sem criar operacao**. Mesmo calculo do request-anticipation, mas read-only.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_simulate_anticipation_from_stock_v1_stock_simulate_anticipation_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"stock_item_ids\": [\n    \"string\"\n  ],\n  \"product_id\": \"b3f1c2a4-5d6e-7f80-9a1b-2c3d4e5f6a7b\",\n  \"policy_id\": \"01970dc5-1234-7000-8000-000000000000\",\n  \"requested_advance_value\": 10000.0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_simulate_anticipation_from_stock_v1_stock_simulate_anticipation_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Obter item do estoque",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/stock/{item_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                ":item_id"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Editar item do estoque",
          "request": {
            "method": "PATCH",
            "url": {
              "raw": "{{base_url}}/v1/stock/{item_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                ":item_id"
              ]
            },
            "description": "Atualiza campos de um recebivel em status IN_STOCK. Envie apenas os campos que deseja alterar.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_update_stock_item_v1_stock__item_id__patch}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_update_stock_item_v1_stock__item_id__patch';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Cancelar item do estoque",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/stock/{item_id}/cancel",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                ":item_id",
                "cancel"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_cancel_stock_item_v1_stock__item_id__cancel_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_cancel_stock_item_v1_stock__item_id__cancel_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Expirar item do estoque",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/stock/{item_id}/expire",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "stock",
                ":item_id",
                "expire"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_expire_stock_item_v1_stock__item_id__expire_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_expire_stock_item_v1_stock__item_id__expire_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "name": "Titles",
      "description": "Títulos e saldo devedor",
      "item": [
        {
          "name": "List Titles",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/titles",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "titles"
              ],
              "query": [
                {
                  "key": "operation_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "payer_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                },
                {
                  "key": "offset",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "Get Title",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/titles/{title_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "titles",
                ":title_id"
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        },
        {
          "name": "List Balance Events",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/titles/{title_id}/balance-events",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "titles",
                ":title_id",
                "balance-events"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "",
            "header": []
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Webhooks outbound",
      "item": [
        {
          "name": "Listar webhooks",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ]
            },
            "description": "Retorna webhooks cadastrados pelo originador.",
            "header": []
          },
          "response": []
        },
        {
          "name": "Registrar webhook",
          "request": {
            "method": "POST",
            "url": {
              "raw": "{{base_url}}/v1/webhooks",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ]
            },
            "description": "Cadastra um webhook para receber notificacoes. O hmac_secret e exibido apenas nesta resposta.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_create_webhook_v1_webhooks_post}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"string\",\n  \"events\": [\n    \"operation.created\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_create_webhook_v1_webhooks_post';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Atualizar webhook",
          "request": {
            "method": "PATCH",
            "url": {
              "raw": "{{base_url}}/v1/webhooks/{webhook_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhook_id"
              ]
            },
            "description": "Atualiza url, eventos, descricao ou o estado ativo de um webhook. Campos ausentes ficam inalterados. Nao rotaciona o segredo.",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_update_webhook_v1_webhooks__webhook_id__patch}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_update_webhook_v1_webhooks__webhook_id__patch';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Arquivar webhook",
          "request": {
            "method": "DELETE",
            "url": {
              "raw": "{{base_url}}/v1/webhooks/{webhook_id}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhook_id"
              ]
            },
            "description": "",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{idempotency_archive_webhook_v1_webhooks__webhook_id__delete}}",
                "description": "OPCIONAL nesta rota — mas HONRADA se enviada: o middleware aplica a mesma deduplicacao das rotas financeiras. Sem o header nao ha protecao alguma contra reenvio. Chave de idempotencia da requisicao, no escopo do originador autenticado. DEVE ter entre 16 e 80 caracteres (UUID recomendado); fora dessa faixa a requisicao e recusada com `422 idempotency_key_invalid` ANTES de qualquer efeito. Reenvio com a MESMA chave e o MESMO corpo devolve a resposta guardada da primeira execucao, sem executar de novo, com o header `Idempotency-Replayed: true`; a MESMA chave com corpo diferente responde `409 idempotency_key_reused_with_different_body`, e em ROTA diferente responde `409 idempotency_key_reused_on_different_route`. Se a primeira chamada ainda estiver em andamento, o retry recebe `409 idempotency_key_in_flight` (nunca uma segunda execucao). Reutilize a mesma chave em TODOS os retries de uma mesma operacao. Se o processo que detem a execucao morrer sem liberar a chave, ela pode responder `409 idempotency_key_in_flight` por ATE 600 segundos — esse valor e um TETO, nao uma duracao garantida (pode ser encurtado sem aviso; alargar exigiria versao nova): passado o teto a reserva expira sozinha e o retry seguinte volta a executar normalmente. Ha ainda um `503 idempotency_unavailable`, declarado por antecipacao: significa que o controle de idempotencia esta indisponivel e a requisicao NAO foi executada — retente com a MESMA chave. Ele NAO ocorre na configuracao vigente (o modo fail-closed esta desligado); esta no contrato para que liga-lo no futuro nao seja uma mudanca incompativel."
              }
            ]
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const key = 'idempotency_archive_webhook_v1_webhooks__webhook_id__delete';",
                  "if (!pm.collectionVariables.get(key)) {",
                  "  pm.collectionVariables.set(key, pm.variables.replaceIn('{{$guid}}'));",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "name": "Listar entregas do webhook",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/webhooks/{webhook_id}/deliveries",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "webhooks",
                ":webhook_id",
                "deliveries"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Retorna historico de entregas (tentativas) de um webhook.",
            "header": []
          },
          "response": []
        }
      ]
    }
  ]
}