{
  "info": {
    "name": "ISolutionPay API",
    "description": "Coleção completa da API pública ISolutionPay.\n\nAutenticação: `Authorization: Bearer {{api_key}}`\n\nVariáveis:\n- `base_url` — https://isolutionpay.com\n- `api_key` — sua chave de API",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://isolutionpay.com",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "sua_api_key_aqui",
      "type": "string"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "PIX",
      "item": [
        {
          "name": "Criar cobrança PIX",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/pix",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 9990,\n  \"nome\": \"João Silva\",\n  \"cpf\": \"12345678901\",\n  \"email\": \"joao@email.com\",\n  \"phone\": \"11999999999\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cria uma cobrança PIX. Retorna QR Code e copia-e-cola.\n\nCampos:\n- `amount` (obrigatório): valor em centavos, ex: 9990 = R$ 99,90\n- `nome` (obrigatório): nome do pagador\n- `cpf` (obrigatório): CPF do pagador (somente dígitos)\n- `email` (opcional)\n- `phone` (opcional): ex: \"11999999999\""
          }
        },
        {
          "name": "Criar cobrança PIX com Split",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/pix",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 20000,\n  \"nome\": \"João Silva\",\n  \"cpf\": \"12345678901\",\n  \"email\": \"joao@email.com\",\n  \"descricao\": \"Pedido com split\",\n  \"splits\": [\n    { \"recipient_id\": \"uuid-sub-recebedor-1\", \"amount\": 5000 },\n    { \"recipient_id\": \"uuid-sub-recebedor-2\", \"amount\": 3000 }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cria PIX com split automático para sub-recebedores.\n\n- `splits[].recipient_id`: UUID do sub-recebedor cadastrado\n- `splits[].amount`: valor em centavos para este recebedor\n- A soma dos splits deve ser menor que o valor total\n- O restante fica com o vendedor principal"
          }
        },
        {
          "name": "Verificar status PIX",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/pix",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"txid\": \"uuid-do-pagamento\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Verifica o status de uma cobrança PIX pelo txid retornado na criação.\n\nStatus possíveis: `pending`, `CONCLUIDA`, `REMOVIDA_PELO_USUARIO_RECEBEDOR`"
          }
        },
        {
          "name": "Buscar PIX por ID",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/pix/:id",
            "description": "Busca os dados completos de uma cobrança PIX pelo ID."
          }
        }
      ]
    },
    {
      "name": "Cartão",
      "item": [
        {
          "name": "Criar cobrança Cartão de Crédito",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 9990,\n  \"payment_method\": \"credit_card\",\n  \"installments\": 1,\n  \"description\": \"Pedido #123\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\",\n    \"phone\": \"11999999999\"\n  },\n  \"credit_card\": {\n    \"number\": \"4111111111111111\",\n    \"holder_name\": \"JOAO SILVA\",\n    \"exp_month\": 12,\n    \"exp_year\": 2027,\n    \"cvv\": \"123\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cria uma cobrança de cartão de crédito.\n\nCampos:\n- `amount` (obrigatório): valor em centavos, ex: 9990 = R$ 99,90\n- `payment_method`: `credit_card` (padrão) ou `debit_card`\n- `installments` (opcional): parcelas 1–12, padrão 1\n- `description` (opcional): descrição, máx 120 chars\n- `customer.document`: CPF ou CNPJ (somente dígitos)\n- `save_card` (opcional): `true` para salvar cartão e receber `card_id`"
          }
        },
        {
          "name": "Criar cobrança Cartão Parcelado",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 50000,\n  \"payment_method\": \"credit_card\",\n  \"installments\": 6,\n  \"description\": \"Produto premium\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\"\n  },\n  \"credit_card\": {\n    \"number\": \"4111111111111111\",\n    \"holder_name\": \"JOAO SILVA\",\n    \"exp_month\": 12,\n    \"exp_year\": 2027,\n    \"cvv\": \"123\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cartão de crédito parcelado em até 12x."
          }
        },
        {
          "name": "Criar cobrança Cartão com Split",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 20000,\n  \"payment_method\": \"credit_card\",\n  \"installments\": 1,\n  \"description\": \"Venda com split\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\"\n  },\n  \"credit_card\": {\n    \"number\": \"4111111111111111\",\n    \"holder_name\": \"JOAO SILVA\",\n    \"exp_month\": 12,\n    \"exp_year\": 2027,\n    \"cvv\": \"123\"\n  },\n  \"splits\": [\n    { \"recipient_id\": \"uuid-sub-recebedor-1\", \"amount\": 8000 },\n    { \"recipient_id\": \"uuid-sub-recebedor-2\", \"amount\": 4000 }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cartão de crédito com split para sub-recebedores.\n\nMesmo comportamento do PIX com splits: soma dos `amount` deve ser menor que `amount` total."
          }
        },
        {
          "name": "Criar cobrança Cartão de Débito",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 9990,\n  \"payment_method\": \"debit_card\",\n  \"description\": \"Débito à vista\",\n  \"return_url\": \"https://seusite.com/retorno-3ds\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\"\n  },\n  \"debit_card\": {\n    \"number\": \"4111111111111111\",\n    \"holder_name\": \"JOAO SILVA\",\n    \"exp_month\": 12,\n    \"exp_year\": 2027,\n    \"cvv\": \"123\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Débito pode exigir autenticação 3DS. Quando necessário, a resposta inclui `requires_action: true` e `action_url` para redirecionar o cliente.\n\n`return_url` é a URL de retorno após autenticação 3DS."
          }
        },
        {
          "name": "Criar cobrança com card_id salvo",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 9990,\n  \"payment_method\": \"credit_card\",\n  \"installments\": 1,\n  \"description\": \"Cobrança com cartão salvo\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\"\n  },\n  \"card_id\": \"card_abc123\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cobra usando um cartão salvo anteriormente (retornado via `card_id` ao criar com `save_card: true`)."
          }
        },
        {
          "name": "Verificar status Cartão",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/card",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"txid\": \"uuid-do-pagamento\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Verifica o status de uma cobrança de cartão.\n\nStatus possíveis: `pending`, `CONCLUIDA`, `RECUSADA`\n\nSe o cartão exige 3DS e ainda não foi autenticado, retorna `requires_action: true`."
          }
        },
        {
          "name": "Buscar Cartão por ID",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/card/:id",
            "description": "Busca os dados de uma cobrança de cartão pelo ID."
          }
        }
      ]
    },
    {
      "name": "Sub-recebedores",
      "item": [
        {
          "name": "Criar sub-recebedor",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/sub-recipients",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Empresa Parceira LTDA\",\n  \"document\": \"12345678000195\",\n  \"email\": \"financeiro@empresa.com\",\n  \"birthdate\": \"1990-01-15\",\n  \"bank_code\": \"001\",\n  \"agency\": \"0001\",\n  \"account\": \"00001-1\",\n  \"account_type\": \"checking\",\n  \"account_holder_name\": \"Empresa Parceira LTDA\",\n  \"account_holder_document\": \"12345678000195\",\n  \"monthly_income\": 1000000,\n  \"professional_occupation\": \"Empresário\",\n  \"address\": {\n    \"street\": \"Rua das Flores\",\n    \"number\": \"123\",\n    \"complement\": \"Sala 1\",\n    \"neighborhood\": \"Centro\",\n    \"city\": \"São Paulo\",\n    \"state\": \"SP\",\n    \"zip_code\": \"01310100\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Cadastra um sub-recebedor (marketplace).\n\nPara CPF use `document` com 11 dígitos. Para CNPJ, 14 dígitos.\n\n`account_type`: `checking` (corrente) ou `savings` (poupança)\n\nCampos obrigatórios: `name`, `document`, `email`, `bank_code`, `agency`, `account`, `account_type`"
          }
        },
        {
          "name": "Listar sub-recebedores",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/sub-recipients",
            "description": "Lista todos os sub-recebedores cadastrados para a API Key autenticada."
          }
        },
        {
          "name": "Solicitar saque (cashout)",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/sub-recipients/:id/cashout",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 5000\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Solicita um saque para o sub-recebedor.\n\n- `amount` (obrigatório): valor em centavos a sacar\n- Saldo disponível é calculado automaticamente a partir dos `payment_splits` com status `available`\n- Não permite dois saques pendentes ao mesmo tempo\n- Status: `pending` → aprovado manualmente pelo admin"
          }
        },
        {
          "name": "Listar saques do sub-recebedor",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/sub-recipients/:id/cashout",
            "description": "Lista todos os saques solicitados para um sub-recebedor."
          }
        }
      ]
    },
    {
      "name": "Estornos",
      "item": [
        {
          "name": "Solicitar estorno total",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/charges/:id/refund",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 9990\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Solicita estorno total de uma cobrança aprovada.\n\n`:id` = UUID do pagamento (`id` retornado na criação da cobrança)\n\n- `amount` (obrigatório): valor em centavos a estornar\n- Se não informar `splits`, os splits dos sub-recebedores são calculados proporcionalmente\n- O estorno fica `pending` até aprovação manual no painel admin (/estornos)\n- Não é possível ter dois estornos pending/approved para o mesmo pagamento\n- Após aprovação, o admin faz o estorno manualmente na PicPay/Pagar.me"
          }
        },
        {
          "name": "Solicitar estorno parcial com split",
          "request": {
            "method": "POST",
            "url": "{{base_url}}/api/charges/:id/refund",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 6000,\n  \"splits\": [\n    {\n      \"recipient_id\": \"uuid-sub-recebedor-1\",\n      \"amount\": 3000,\n      \"charge_processing_fee\": true\n    },\n    {\n      \"recipient_id\": \"uuid-sub-recebedor-2\",\n      \"amount\": 2000,\n      \"charge_processing_fee\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Estorno parcial com breakdown de splits explícito.\n\n- `splits[].recipient_id`: UUID do sub-recebedor\n- `splits[].amount`: valor em centavos que este recebedor devolve\n- `splits[].charge_processing_fee`: quem absorve a taxa de processamento do estorno (`true` = este recebedor absorve)\n- Soma dos splits deve ser ≤ `amount`"
          }
        },
        {
          "name": "Listar estornos de uma cobrança",
          "request": {
            "method": "GET",
            "url": "{{base_url}}/api/charges/:id/refund",
            "description": "Lista todos os estornos de uma cobrança específica."
          }
        }
      ]
    },
    {
      "name": "Assinaturas",
      "item": [
        {
          "name": "Planos",
          "item": [
            {
              "name": "Criar plano",
              "request": {
                "method": "POST",
                "url": "{{base_url}}/api/recurrency/plans",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"billingCycle\": \"MONTHLY\",\n  \"amount\": 9990,\n  \"totalBillingCycles\": 12,\n  \"tag\": \"plano-mensal\",\n  \"initialGraceCycles\": 0\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Cria um plano de assinatura.\n\n- `billingCycle` (obrigatório): `DAILY`, `WEEKLY`, `MONTHLY`, `QUARTERLY`, `BIANNUAL`, `ANNUAL`\n- `amount` (obrigatório): valor em centavos por ciclo\n- `totalBillingCycles` (obrigatório): total de ciclos de cobrança (mín 1)\n- `tag` (obrigatório): identificador único do plano\n- `initialGraceCycles` (opcional): ciclos de carência antes da 1ª cobrança"
              }
            },
            {
              "name": "Criar plano com taxa de adesão",
              "request": {
                "method": "POST",
                "url": "{{base_url}}/api/recurrency/plans",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"billingCycle\": \"MONTHLY\",\n  \"amount\": 9990,\n  \"totalBillingCycles\": 12,\n  \"tag\": \"plano-premium\",\n  \"initialGraceCycles\": 0,\n  \"initialFee\": {\n    \"description\": \"Taxa de adesão\",\n    \"amount\": 4990,\n    \"cycles\": 1\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Plano com taxa de adesão cobrada no primeiro ciclo.\n\n`initialFee.amount`: valor em centavos da taxa\n`initialFee.cycles`: em quantos ciclos a taxa é cobrada"
              }
            },
            {
              "name": "Listar planos",
              "request": {
                "method": "GET",
                "url": "{{base_url}}/api/recurrency/plans",
                "description": "Lista todos os planos ativos do seller."
              }
            },
            {
              "name": "Buscar plano por ID",
              "request": {
                "method": "GET",
                "url": "{{base_url}}/api/recurrency/plans/:id",
                "description": "Busca um plano específico pelo ID interno."
              }
            },
            {
              "name": "Desativar plano",
              "request": {
                "method": "DELETE",
                "url": "{{base_url}}/api/recurrency/plans/:id",
                "description": "Desativa um plano. Assinaturas existentes não são canceladas automaticamente."
              }
            }
          ]
        },
        {
          "name": "Assinaturas",
          "item": [
            {
              "name": "Criar assinatura",
              "request": {
                "method": "POST",
                "url": "{{base_url}}/api/recurrency/subscriptions",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"planId\": \"uuid-interno-do-plano\",\n  \"customer\": {\n    \"name\": \"João Silva\",\n    \"email\": \"joao@email.com\",\n    \"document\": \"12345678901\",\n    \"phone\": \"11999999999\"\n  },\n  \"credit\": {\n    \"cardNumber\": \"5555555555554444\",\n    \"cardholderName\": \"JOAO SILVA\",\n    \"cardholderDocument\": \"12345678901\",\n    \"expirationMonth\": 8,\n    \"expirationYear\": 2033,\n    \"cvv\": \"123\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Cria uma assinatura vinculando um cliente a um plano de recorrência.\n\n**Campos obrigatórios:**\n- `planId`: ID interno do plano (retornado em `POST /api/recurrency/plans`)\n- `customer.name`, `customer.email`, `customer.document` (CPF/CNPJ somente dígitos)\n- `credit.cardNumber`, `credit.cvv`, `credit.cardholderName`, `credit.cardholderDocument`, `credit.expirationMonth`, `credit.expirationYear`\n\n**Campos opcionais:**\n- `customer.phone`: string `119XXXXXXXX` ou objeto `{areaCode, number}`\n- `credit.cardholderDocument`: CPF do titular do cartão (usa `customer.document` se omitido)\n\n**Resposta:**\n- `id`: ID interno da assinatura\n- `status`: `ACTIVE` se aprovada\n- `nextBillingDate`: data da próxima cobrança (`YYYY-MM-DD`)\n- `merchantSubscriptionId`: ID único gerado internamente para rastreamento\n\nO primeiro ciclo é cobrado imediatamente na criação."
              }
            },
            {
              "name": "Listar assinaturas",
              "request": {
                "method": "GET",
                "url": "{{base_url}}/api/recurrency/subscriptions",
                "description": "Lista todas as assinaturas do seller."
              }
            },
            {
              "name": "Buscar assinatura por ID",
              "request": {
                "method": "GET",
                "url": "{{base_url}}/api/recurrency/subscriptions/:id",
                "description": "Busca uma assinatura específica pelo ID interno."
              }
            },
            {
              "name": "Cancelar assinatura",
              "request": {
                "method": "DELETE",
                "url": "{{base_url}}/api/recurrency/subscriptions/:id",
                "description": "Cancela uma assinatura. Nenhuma cobrança futura é realizada após o cancelamento."
              }
            }
          ]
        }
      ]
    }
  ]
}