Assinaturas
A assinatura liga um cliente a um plano. Por padrão a 1ª cobrança (vencimento em start_date) sai na hora; as seguintes, no vencimento de cada ciclo.
POST
/recurring/subscriptionsAssina um cliente num plano.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
plan_idobrigatório | string | uuid de um plano ativo da sua conta. |
customerobrigatório | object | Quem paga as cobranças. |
customer.nameobrigatório | string | Nome do cliente, até 255 caracteres. |
customer.emailobrigatório | string | E-mail que recebe as cobranças. |
customer.tax_idobrigatório | string | CPF ou CNPJ válido, com ou sem máscara. |
amountopcional | number | Valor próprio desta assinatura (mínimo 1.00). Sem ele: o valor do plano. |
messageopcional | string | Mensagem das cobranças, até 255 caracteres. |
start_dateopcional | string | Data do 1º vencimento (YYYY-MM-DD), de hoje até 1 ano à frente. Padrão: hoje. |
max_cyclesopcional | integer | Quantidade de cobranças (1 a 600). Padrão: default_max_cycles do plano. |
end_dateopcional | string | Data de término (YYYY-MM-DD), igual ou depois de start_date. |
notify_customeropcional | boolean | Padrão true. Com false, a plataforma não envia e-mails ao cliente. |
issue_first_chargeopcional | boolean | Padrão true: gera a 1ª cobrança agora (Pix + e-mail) e a devolve em first_charge. Com false, ela sai no vencimento, a partir das 8h. |
referenceopcional | string | Identificador do seu sistema (até 100); garante a idempotência. |
curl -X POST "https://api.sancopay.com/api/v1/recurring/subscriptions" \ -H "Authorization: Bearer <TOKEN>" \ -H "Content-Type: application/json" \ -d '{ "plan_id": "9f2c1a7e-4b8d-4c1f-9a3e-2d5b7c8e1f40", "customer": { "name": "Maria Souza", "email": "[email protected]", "tax_id": "123.456.789-09" }, "start_date": "2026-10-01", "issue_first_charge": true, "reference": "ASS-1001" }'A assinatura, com a 1ª cobrança em first_charge.
{ "id": "3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47", "reference": "ASS-1001", "status": "active", "status_label": "Ativa", "plan": { "id": "9f2c1a7e-4b8d-4c1f-9a3e-2d5b7c8e1f40", "name": "Plano Mensal", "periodicity": "monthly", "periodicity_label": "Mensal", "amount": 99.9 }, "customer": { "name": "Maria Souza", "email": "[email protected]", "tax_id": "12345678909" }, "amount": 99.9, "amount_override": null, "message": null, "start_date": "2026-10-01", "next_due_date": "2026-11-01", "upcoming_due_dates": [ "2026-11-01", "2026-12-01", "2027-01-01" ], "cycles_issued": 1, "max_cycles": 12, "end_date": null, "notify_customer": true, "paused_at": null, "cancelled_at": null, "completed_at": null, "cancel_reason": null, "created_at": "2026-09-18T13:15:03.000000Z", "updated_at": "2026-09-18T13:15:03.000000Z", "first_charge": { "id": "c71d4e8a-2f3b-4a6c-9e15-8b0d7f3a2c96", "subscription_id": "3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47", "subscription_reference": "ASS-1001", "plan": { "id": "9f2c1a7e-4b8d-4c1f-9a3e-2d5b7c8e1f40", "name": "Plano Mensal" }, "customer": { "name": "Maria Souza", "email": "[email protected]" }, "cycle_number": 1, "due_date": "2026-10-01", "amount": 99.9, "message": "Plano Mensal", "status": "pending", "status_label": "Em aberto", "pay_url": "https://app.sancopay.com/cobranca/k3Jd9xQ2mZ7pL4vR8tW1nB6cY0aF5sH2eU9gT4oM", "pix": { "copy_paste": "00020126580014br.gov.bcb.pix0136a1b2c3d4-e5f6-7a8b-9c0d-e1f2a3b4c5d65204000053039865406150.005802BR5913LOJA EXEMPLO6009SAO PAULO62070503***6304A1B2", "transaction_id": 4821, "generated_at": "2026-09-18T13:15:04.000000Z" }, "last_pix_error": null, "issued_at": "2026-09-18T13:15:04.000000Z", "overdue_at": null, "paid_at": null, "paid_transaction_id": null, "cancelled_at": null, "duplicate_payment": false, "duplicate_payment_at": null, "created_at": "2026-09-18T13:15:04.000000Z", "transactions": [ { "id": 4821, "status": "pending", "origin": "issue", "created_at": "2026-09-18T13:15:04.000000Z" } ], "emails": [ { "kind": "due", "kind_label": "Vencimento", "status": "sent", "to_email": "[email protected]", "skip_reason": null, "failure_reason": null, "sent_at": "2026-09-18T13:15:06.000000Z", "created_at": "2026-09-18T13:15:04.000000Z" } ] }}Campos da assinatura
amount- Valor efetivo da próxima cobrança.
amount_overrideé o valor próprio da assinatura (null= segue o plano). upcoming_due_dates- Até 3 próximos vencimentos já calculados.
customer.tax_id- Volta só com dígitos.
max_cycles / end_date- Sem os dois, a assinatura segue até ser cancelada. Ao atingir um deles, passa para
completed.
Consultar, listar e alterar
- GET
/recurring/subscriptionsFiltros:status(active,paused,cancelled,completed),plan_id,reference,q(nome, e-mail ou documento do cliente),page,per_page. - GET
/recurring/subscriptions/{id}Consulta uma assinatura (mesmo formato da criação, sem first_charge). - PATCH
/recurring/subscriptions/{id}Alteração parcial:customer.name,customer.email,customer.tax_id,amount(nullvolta a seguir o plano),message,max_cycles,end_date,notify_customer.
curl -X GET "https://api.sancopay.com/api/v1/recurring/subscriptions?reference=ASS-1001" \ -H "Authorization: Bearer <TOKEN>"{ "data": [ { "id": "3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47", "reference": "ASS-1001", "status": "active", "status_label": "Ativa", "plan": { "id": "9f2c1a7e-4b8d-4c1f-9a3e-2d5b7c8e1f40", "name": "Plano Mensal", "periodicity": "monthly", "periodicity_label": "Mensal", "amount": 99.9 }, "customer": { "name": "Maria Souza", "email": "[email protected]", "tax_id": "12345678909" }, "amount": 99.9, "amount_override": null, "message": null, "start_date": "2026-10-01", "next_due_date": "2026-11-01", "upcoming_due_dates": [ "2026-11-01", "2026-12-01", "2027-01-01" ], "cycles_issued": 1, "max_cycles": 12, "end_date": null, "notify_customer": true, "paused_at": null, "cancelled_at": null, "completed_at": null, "cancel_reason": null, "created_at": "2026-09-18T13:15:03.000000Z", "updated_at": "2026-09-18T13:15:03.000000Z" } ], "meta": { "page": 1, "per_page": 20, "total": 1, "last_page": 1 }}curl -X PATCH "https://api.sancopay.com/api/v1/recurring/subscriptions/3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47" \ -H "Authorization: Bearer <TOKEN>" \ -H "Content-Type: application/json" \ -d '{ "amount": 79.9, "customer": { "email": "[email protected]" } }'plan_id,start_date,periodicityereferencenão podem ser alterados (422). Para trocar de plano, cancele e crie outra assinatura.- Assinatura cancelada ou concluída não pode ser alterada (
409). - O novo
amountvale a partir da próxima cobrança emitida; as já emitidas mantêm o valor.
Pausar, retomar e cancelar
- POST
/recurring/subscriptions/{id}/pausePausa uma assinaturaactive; deixa de gerar cobranças. Outro status:409. - POST
/recurring/subscriptions/{id}/resumeRetoma umapaused(outro status:409). Sem cobrança retroativa: o próximo vencimento é o primeiro a partir de hoje. - POST
/recurring/subscriptions/{id}/cancelEncerra a assinatura. Já cancelada ou concluída:409.
Corpo do cancel
| Campo | Tipo | Descrição |
|---|---|---|
cancel_open_chargesopcional | boolean | Padrão true: cancela também as cobranças em aberto e vencidas. |
reasonopcional | string | Motivo do cancelamento, até 255 caracteres. |
curl -X POST "https://api.sancopay.com/api/v1/recurring/subscriptions/3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47/cancel" \ -H "Authorization: Bearer <TOKEN>" \ -H "Content-Type: application/json" \ -d '{ "cancel_open_charges": true, "reason": "Pedido do cliente" }'{ "id": "3b6e9d12-7a4f-4e2b-8c91-5f0a1d2e3c47", "reference": "ASS-1001", "status": "cancelled", "status_label": "Cancelada", "plan": { "id": "9f2c1a7e-4b8d-4c1f-9a3e-2d5b7c8e1f40", "name": "Plano Mensal", "periodicity": "monthly", "periodicity_label": "Mensal", "amount": 99.9 }, "customer": { "name": "Maria Souza", "email": "[email protected]", "tax_id": "12345678909" }, "amount": 99.9, "amount_override": null, "message": null, "start_date": "2026-10-01", "next_due_date": "2026-11-01", "upcoming_due_dates": [ "2026-11-01", "2026-12-01", "2027-01-01" ], "cycles_issued": 1, "max_cycles": 12, "end_date": null, "notify_customer": true, "paused_at": null, "cancelled_at": "2026-11-09T15:04:05.000000Z", "completed_at": null, "cancel_reason": "Pedido do cliente", "created_at": "2026-09-18T13:15:03.000000Z", "updated_at": "2026-09-18T13:15:03.000000Z"}pause e resume não têm corpo. As três respondem 200 com a assinatura atualizada.