Assinaturas
Lista, exporta e consulta assinaturas e as cancela, pausa, retoma ou recobra quando a cobrança falhou.
Uma assinatura é a cobrança recorrente de um produto para um cliente, a cada cycle_days dias. Estas rotas mostram todas as assinaturas da loja e permitem agir sobre cada uma. Todas identificam o item pela referência com prefixo sub: (por exemplo sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10), exatamente como vem no campo id das listagens. Exigem o módulo recurring-payments; ler exige manage_content ou view_content e agir exige manage_content.
Listar assinaturas
Devolve as assinaturas, das mais novas para as mais antigas (ou pela próxima cobrança, com sort=next), com paginação.
/api/v1/admin/recurring/subscriptionsAdminLista as assinaturas da loja
Parâmetros de consulta
statusstringactivepausedsuspendedcancelledqstringproduct_iduuidcustomer_iduuidnext_fromstringYYYY-MM-DD. Data inválida é ignorada.next_tostringYYYY-MM-DD. Data inválida é ignorada.overduebooleantrue1sortstringnextnext ordena pela data da próxima cobrança (mais próxima primeiro).pageintegerpadrão: 1per_pageintegerpadrão: 25Exemplo de requisição
curl "$BASE_URL/api/v1/admin/recurring/subscriptions?status=active&sort=next&per_page=25" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"items": [
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "active",
"customer_name": "Maria Souza",
"customer_email": "maria.souza@example.com",
"product_name": "Café Especial 500g",
"vendor_name": "Torrefação Serra Azul",
"frequency": "mensal",
"cycle_days": 30,
"quantity": 1,
"price_cents": 4200,
"price_formatted": "R$ 42,00",
"next_date": "2026-10-20",
"last_date": "2026-09-20",
"card_last_four": "4242",
"retry_count": 0,
"created_at": "2026-06-20T14:05:11Z",
"actions": { "cancel": true, "pause": true, "resume": false, "skip": false, "retry": false }
}
],
"pagination": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1 }
}Campos da resposta
itemsarraypaginationobjectpage, per_page, total e total_pages.idstringkindstringsubscriptionscheduledsubscription.statusstringactivepausedsuspendedcancelledcustomer_namestringcustomer_emailstringproduct_namestringvendor_namestringfrequencystringmensal, semanal...), derivada de cycle_days.cycle_daysintegerquantityintegerprice_centsintegerprice_formattedstringprice_cents em reais (R$ 42,00).next_datestringYYYY-MM-DD. Ausente quando não há.last_datestringYYYY-MM-DD. Ausente quando ainda não houve.card_last_fourstringcancellation_reasonstringretry_countintegerlast_attempt_atstringlast_charge_errorstringsuspended_atstringcreated_atstringactionsobjectcancel, pause, resume, skip e retry. Use para ligar ou desligar botões.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token | {"error":"missing authorization header"} |
| 403 | Sem privilégio | {"error":"insufficient privileges","privilege_required_any":["manage_content","view_content"]} |
| 403 | Módulo desligado | {"error":"module_disabled","module":"recurring-payments"} |
| 500 | Falha de consulta | {"error":"failed to load recurring data"} |
Loja que nunca usou assinaturas devolve 200 com items vazio, não erro.
Exportar assinaturas em CSV
Baixa até 5.000 assinaturas que casam com os mesmos filtros da listagem (sem paginação), para planilha.
/api/v1/admin/recurring/subscriptions/export.csvAdminExporta as assinaturas em CSV
Parâmetros de consulta
statusstringactivepausedsuspendedcancelledqstringproduct_iduuidcustomer_iduuidnext_fromstringYYYY-MM-DD.next_tostringYYYY-MM-DD.overduebooleantrue1sortstringnextExemplo de requisição
curl -o assinaturas.csv "$BASE_URL/api/v1/admin/recurring/subscriptions/export.csv?status=active" \
-H "Authorization: Bearer $TOKEN"Resposta
Cliente,E-mail,Produto,Status,Frequencia,Valor,Proxima cobranca,Ultima cobranca,Criada em
Maria Souza,maria.souza@example.com,Café Especial 500g,active,mensal,R$ 42,00,2026-10-20,2026-09-20,2026-06-20O arquivo é UTF-8 com BOM, separado por vírgula, com Content-Disposition: attachment; filename="assinaturas-AAAAMMDD.csv". Células que começam com =, +, - ou @ recebem um apóstrofo na frente para não virarem fórmula na planilha. O cabeçalho é em português, sem acentos.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 500 | Falha de consulta | {"error":"failed to load recurring data"} |
Consultar uma assinatura
Devolve a linha da assinatura mais o histórico de cobranças, uma linha do tempo e o termo que o cliente aceitou.
/api/v1/admin/recurring/subscriptions/{id}AdminConsulta uma assinatura
Parâmetros de caminho
idstringobrigatóriosub:.Exemplo de requisição
curl "$BASE_URL/api/v1/admin/recurring/subscriptions/sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "active",
"customer_name": "Maria Souza",
"customer_email": "maria.souza@example.com",
"product_name": "Café Especial 500g",
"frequency": "mensal",
"cycle_days": 30,
"quantity": 1,
"price_cents": 4200,
"price_formatted": "R$ 42,00",
"next_date": "2026-10-20",
"last_date": "2026-09-20",
"card_last_four": "4242",
"retry_count": 0,
"created_at": "2026-06-20T14:05:11Z",
"actions": { "cancel": true, "pause": true, "resume": false, "skip": false, "retry": false },
"charges": [
{
"id": "hist:7c1d9e22-5b3a-4f68-8a10-2d4e6a3c1b99",
"ref": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"customer_name": "Maria Souza",
"product_name": "Café Especial 500g",
"amount_cents": 4200,
"amount_formatted": "R$ 42,00",
"status": "paid",
"billing_date": "2026-09-20",
"attempt": 1,
"created_at": "2026-09-20T05:00:07Z",
"can_retry": false
}
],
"log": [
{ "at": "2026-06-20T14:05:11Z", "event": "created" },
{ "at": "2026-09-20T05:00:07Z", "event": "charge", "detail": "paid" }
],
"terms": { "name": "Termo de assinatura", "version": 2, "accepted_at": "2026-06-20T14:05:11Z", "ip_address": "203.0.113.10" }
}Campos da resposta
chargesarraylogarrayat, event (created, charge, suspended, cancelled) e detail. Não é um registro de auditoria: o evento cancelled usa a data de criação da assinatura.termsobjectname, version, accepted_at e ip_address. Ausente quando não há aceite registrado.Os demais campos são os da linha da listagem.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Referência malformada (sufixo que não é UUID) | {"error":"invalid reference"} |
| 404 | Prefixo diferente de sub:, ou assinatura que não existe | {"error":"not found"} |
Cancelar uma assinatura
Encerra a assinatura. Cobranças futuras deixam de acontecer; o que já foi cobrado não é devolvido por aqui.
/api/v1/admin/recurring/subscriptions/{id}/cancelAdminCancela uma assinatura
Parâmetros de caminho
idstringobrigatóriosub:...).Corpo da requisição (opcional)
reasonstringcancellation_reason e nos motivos do painel.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/recurring/subscriptions/sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/cancel" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "reason": "Pedido do cliente por telefone" }'Resposta
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "cancelled",
"cancellation_reason": "Pedido do cliente por telefone",
"customer_name": "Maria Souza",
"product_name": "Café Especial 500g",
"frequency": "mensal",
"cycle_days": 30,
"price_cents": 4200,
"price_formatted": "R$ 42,00",
"actions": { "cancel": false, "pause": false, "resume": false, "skip": false, "retry": false },
"charges": [],
"log": [
{ "at": "2026-06-20T14:05:11Z", "event": "created" },
{ "at": "2026-06-20T14:05:11Z", "event": "cancelled", "detail": "Pedido do cliente por telefone" }
]
}A resposta é o detalhe da assinatura já atualizado, no formato da consulta (abreviado no exemplo). As ações de pausar, retomar e cancelar seguem o mesmo formato de resposta e de erros.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Referência malformada | {"error":"invalid reference"} |
| 404 | Prefixo errado ou assinatura inexistente | {"error":"not found"} |
| 409 | Assinatura já cancelada | {"error":"action not allowed in the current status"} |
Pausar uma assinatura
Para as cobranças sem cancelar. Só vale para assinatura active.
/api/v1/admin/recurring/subscriptions/{id}/pauseAdminPausa uma assinatura
Parâmetros de caminho
idstringobrigatóriosub:...).Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/recurring/subscriptions/sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/pause" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "paused",
"next_date": "2026-10-20",
"actions": { "cancel": true, "pause": false, "resume": true, "skip": false, "retry": false }
}Exemplo abreviado; a resposta traz o detalhe completo.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 404 | Prefixo errado ou assinatura inexistente | {"error":"not found"} |
| 409 | Assinatura que não está active | {"error":"action not allowed in the current status"} |
Retomar uma assinatura
Volta uma assinatura paused para active. Se a data da próxima cobrança já passou, ela passa a ser hoje, para não cobrar retroativamente vários ciclos.
/api/v1/admin/recurring/subscriptions/{id}/resumeAdminRetoma uma assinatura pausada
Parâmetros de caminho
idstringobrigatóriosub:...).Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/recurring/subscriptions/sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/resume" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "active",
"next_date": "2026-10-11",
"actions": { "cancel": true, "pause": true, "resume": false, "skip": false, "retry": false }
}Exemplo abreviado; a resposta traz o detalhe completo.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 404 | Prefixo errado ou assinatura inexistente | {"error":"not found"} |
| 409 | Assinatura que não está paused | {"error":"action not allowed in the current status"} |
Pedir nova tentativa de cobrança
Reenfileira uma assinatura cuja cobrança falhou e já roda o ciclo de cobrança uma vez, então a tentativa acontece na hora. A assinatura precisa estar active ou suspended e ter ao menos uma falha (retry_count maior que zero). Uma assinatura suspended volta a active só para essa tentativa. O contador de falhas não é zerado: se falhar de novo e o limite já estava esgotado, ela é suspensa outra vez.
/api/v1/admin/recurring/subscriptions/{id}/retryAdminPede nova tentativa de cobrança de uma assinatura
Parâmetros de caminho
idstringobrigatóriosub:...).Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/recurring/subscriptions/sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/retry" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "sub:5f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"kind": "subscription",
"status": "active",
"retry_count": 2,
"last_charge_error": "card_declined",
"actions": { "cancel": true, "pause": true, "resume": false, "skip": false, "retry": true }
}Exemplo abreviado. A resposta é o detalhe lido logo depois da tentativa; veja charges e retry_count para saber se deu certo.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 404 | Prefixo errado ou assinatura inexistente | {"error":"not found"} |
| 409 | Sem falha para recobrar, ou fora de active e suspended | {"error":"action not allowed in the current status"} |