Assinaturas
Leia e gerencie assinaturas recorrentes — liste e recupere assinaturas, inspecione o histórico de mudanças de oferta, cancele, pause, retome, troque de oferta e atualize o instrumento de pagamento da cobrança.
Uma assinatura é uma relação de cobrança de longa duração entre um dos seus clientes e uma offer. A Tokeflow acompanha seu ciclo de vida, conduz as renovações no ciclo de cobrança da oferta, reprocessa cobranças que falharam (dunning) e registra cada mudança de estado como uma transição imutável.
A Tokeflow orquestra cada cobrança de renovação entre os provedores de pagamento que você conecta; ela não processa nem liquida os fundos por conta própria. A liquidação é realizada pelo provedor conectado. A Tokeflow normaliza o resultado e avança a assinatura de acordo.
As assinaturas são criadas pela engine de cobrança, não por uma chamada direta de API. A primeira cobrança recorrente bem-sucedida contra uma oferta cria o registro da assinatura. A partir daí, você a lê e a gerencia por meio dos endpoints desta página.
Como as assinaturas se encaixam
Toda assinatura permanece dentro de uma única família de produtos. Mudanças de oferta são permitidas apenas entre ofertas da mesma família; mover entre famílias é modelado como um cancelamento mais uma nova assinatura.
O objeto de assinatura
Uma assinatura é um snapshot desnormalizado do plano do cliente mais o estado de cobrança ao vivo de que a engine precisa para conduzi-la.
| Field | Type | Description |
|---|---|---|
id | string | Identificador único, prefixado com sub_. |
merchant_id | string | Merchant dono da assinatura (mrc_). |
customer_id | string | Cliente assinante (cust_). |
customer_name | string | null | Nome resolvido do cliente. |
customer_email | string | null | E-mail resolvido do cliente. |
current_offer_id | string | Oferta cobrada atualmente (ofr_). |
offer_name | string | Nome resolvido da oferta. |
product_id | string | Produto da oferta atual (prd_). |
product_name | string | Nome resolvido do produto. |
product_family_id | string | Família de produtos à qual a assinatura está travada (pfa_). |
billing_cycle | enum | Um de daily, biweekly, monthly, quarterly, half_yearly, yearly, custom, none. Copiado da oferta na criação. |
currency | string | Moeda ISO 4217, por exemplo BRL. |
current_amount | integer | Valor cobrado a cada ciclo, em unidades menores (centavos). |
current_period_start | string | Início ISO 8601 do período de cobrança atual. |
current_period_end | string | Fim ISO 8601 do período de cobrança atual. |
next_billing_at | string | null | Quando a próxima renovação dispara. null quando billing_cycle é none (sob demanda). |
billing_anchor_day | integer | null | Dia do mês (1–31) usado para resolver as datas de renovação para ciclos mensais ou maiores. Em um mês mais curto, a renovação cai no último dia do mês, e a seguinte volta ao dia âncora. Veja Datas de cobrança. |
trial_start | string | null | Início do trial, definido após a cobrança de configuração do trial ser confirmada. |
trial_end | string | null | Fim do trial. Igual à data da primeira cobrança real. |
dunning_started_at | string | null | Quando a assinatura entrou em dunning pela primeira vez. |
dunning_attempt_count | integer | Número de tentativas de reprocessamento de dunning executadas. Volta a 0 após uma cobrança bem-sucedida. |
dunning_next_retry_at | string | null | Quando o próximo reprocessamento de dunning está agendado. |
cycles_completed | integer | Contagem de ciclos cobrados com sucesso. |
cycle_limit | integer | null | Número máximo de ciclos. null significa cobrar até ser cancelada. |
status | enum | Estado do ciclo de vida — veja Ciclo de vida. |
cancel_at_period_end | boolean | Quando true, a assinatura é cancelada em current_period_end em vez de imediatamente. |
cancelled_at | string | null | Quando o cancelamento entrou em vigor. |
cancellation_reason | string | null | Motivo persistido no cancelamento. |
payment_instrument_id | string | Instrumento de pagamento cobrado na renovação (pi_). |
preferred_connector_name | string | Nome resolvido da conexão pela qual as renovações são roteadas. |
preferred_installments | integer | Número de parcelas herdado da cobrança inicial. 1 é uma cobrança única. |
created_at | string | Timestamp ISO 8601 de criação. |
updated_at | string | Timestamp ISO 8601 da última atualização. |
current_amount e currency são desnormalizados na assinatura para que as renovações sejam determinísticas. Eles são atualizados quando você muda a oferta.
Ciclo de vida
Uma assinatura passa por seis estados. A engine de cobrança conduz a maioria das transições; você conduz as demais por meio dos endpoints abaixo.
| Status | Meaning |
|---|---|
trialing | Em um trial gratuito. Nenhum valor recorrente foi cobrado ainda. |
active | Cobrando normalmente conforme o cronograma. |
dunning | Uma cobrança de renovação falhou; a engine está reprocessando. Veja Dunning. |
paused | A cobrança está suspensa. Nenhuma renovação dispara até ser retomada. |
cancelled | Encerrada. Sem cobranças adicionais. Terminal. |
expired | Atingiu seu limite de ciclos e terminou. Terminal. |
Datas de cobrança
Os ciclos mensal, trimestral, semestral e anual renovam no billing_anchor_day. Quando o mês de destino é mais curto que a âncora, a renovação cai no último dia desse mês — uma assinatura ancorada no dia 31 renova em 28 de fevereiro (29 em ano bissexto) e depois em 31 de março —, de modo que nenhum mês é pulado. current_period_end é sempre igual à data de renovação ancorada (next_billing_at), então a data até a qual a assinatura está paga, exibida na API, nos webhooks e no cancelamento, nunca fica aquém. Uma troca de plano mantém a âncora existente da assinatura. Ciclos baseados em dias (daily, biweekly) e planos sob demanda não são ancorados.
Dunning
Quando uma cobrança de renovação falha, a assinatura entra em dunning em vez de ser cancelada de imediato. A engine agenda reprocessamentos em dunning_next_retry_at, incrementando dunning_attempt_count a cada tentativa.
Uma renovação nunca é retentada dentro da mesma requisição, e a forma como uma recusa é tratada depende do seu motivo de recusa, da mesma maneira para todos os provedores. Um motivo que diz que o cartão nunca mais poderá ser cobrado — perdido ou roubado, conta encerrada, autorização revogada, fraude confirmada, um emissor que diz para nunca retentar — cancela a assinatura na hora. Todas as outras recusas, incluindo um cartão vencido ou dados de cartão incorretos, vão para dunning, para que o cliente possa atualizar o cartão.
- Um reprocessamento que tem sucesso retorna a assinatura para
activee reseta os contadores de dunning. - Se os reprocessamentos forem esgotados, a assinatura é cancelada.
- Enquanto estiver em dunning, o cliente pode corrigir o problema trocando para um cartão que funcione — veja Trocar o instrumento de pagamento.
Se você usar a capacidade Account Updater, uma atualização de cartão enviada pelo emissor em um instrumento em dunning pode acelerar o próximo reprocessamento automaticamente — sem chamada extra necessária.
Retenções de cobrança (billing hold)
Uma renovação só é cobrada quando o merchant tem um conector ativo para roteá-la, o provedor ainda aceita as credenciais desse conector e a oferta da assinatura ainda está disponível. Se qualquer um desses itens faltar no momento da renovação, o motor coloca a renovação em uma retenção de cobrança temporária, em vez de cobrar sobre uma configuração inválida: nenhuma cobrança é tentada, o cliente não entra em dunning e a assinatura não é cancelada. As renovações voltam automaticamente assim que a configuração é corrigida — um conector ativo, uma oferta válida ou novas credenciais salvas em um conector cuja chave o provedor recusou. Quando um merchant retido volta a operar, o período de cobrança é reancorado, de modo que a próxima renovação é agendada a partir desse ponto, em vez de retroagida sobre o intervalo.
Uma assinatura viva por plano
Um cliente pode manter apenas uma assinatura viva por plano por vez. Uma assinatura marcada para cancelar ao fim do período (cancel_at_period_end: true) ainda conta como viva. Iniciar uma segunda assinatura para um plano que o cliente já possui é recusado com 409 (conflict_error); a resposta aponta a reativação como o caminho para manter a assinatura existente, em vez de criar uma duplicata.
Endpoints
Todas as rotas de assinatura ficam aninhadas sob um merchant:
/api/v1/merchants/:merchant_id/subscriptionsOs endpoints de assinatura exigem uma chave com escopo de Merchant. O :merchant_id no caminho deve corresponder ao merchant da chave. Chaves de Organization não endereçam essas rotas aninhadas em merchant diretamente — emita uma chave de merchant para o merchant de destino durante o onboarding no Tokeflow Dashboard.
As mutações são protegidas pelo escopo subscriptions:write; as leituras exigem subscriptions:read.
GET/api/v1/merchants/:merchant_id/subscriptions
Lista as assinaturas de um merchant, das mais recentes para as mais antigas. Suporta paginação e filtragem.
Auth: Chave de Merchant (subscriptions:read)
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
page | integer | Não | Número da página, começando em 1. Padrão 1. |
limit | integer | Não | Itens por página. Padrão 20, máximo 100. |
customer_id | string | Não | Filtra por cliente (cust_). |
status | enum | Não | Filtra por status (trialing, active, dunning, paused, cancelled, expired). |
current_offer_id | string | Não | Filtra por oferta atual (ofr_). |
product_family_id | string | Não | Filtra por família de produtos (pfa_). |
curl -G "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions" \
-H "Authorization: Bearer sk_live_mer_…" \
-d page=1 \
-d limit=20 \
-d status=activeResponse 200 OK
{
"success": true,
"data": [
{
"id": "sub_3f9a7c2e1b",
"merchant_id": "mrc_8a1c2d",
"customer_id": "cust_5b2e9f",
"customer_name": "Ana Souza",
"customer_email": "ana@example.com",
"current_offer_id": "ofr_premium_monthly",
"offer_name": "Premium — Monthly",
"product_id": "prd_7d4a1c",
"product_name": "Premium Plan",
"product_family_id": "pfa_streaming",
"billing_cycle": "monthly",
"currency": "BRL",
"current_amount": 4990,
"current_period_start": "2026-06-25T00:00:00.000Z",
"current_period_end": "2026-07-25T00:00:00.000Z",
"next_billing_at": "2026-07-25T00:00:00.000Z",
"billing_anchor_day": 25,
"trial_start": null,
"trial_end": null,
"dunning_started_at": null,
"dunning_attempt_count": 0,
"dunning_next_retry_at": null,
"cycles_completed": 3,
"cycle_limit": null,
"status": "active",
"cancel_at_period_end": false,
"cancelled_at": null,
"cancellation_reason": null,
"payment_instrument_id": "pi_9c3f2a",
"preferred_connector_name": "acquirer_a",
"preferred_installments": 1,
"created_at": "2026-03-25T12:00:00.000Z",
"updated_at": "2026-06-25T00:00:01.000Z"
}
],
"meta": {
"pagination": {
"page": 1,
"limit": 20,
"total": 42,
"total_pages": 3,
"has_next": true,
"has_prev": false
}
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}GET/api/v1/merchants/:merchant_id/subscriptions/:subscription_id
Recupera uma única assinatura pelo id.
Auth: Chave de Merchant (subscriptions:read)
curl "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b" \
-H "Authorization: Bearer sk_live_mer_…"Response 200 OK
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"merchant_id": "mrc_8a1c2d",
"customer_id": "cust_5b2e9f",
"current_offer_id": "ofr_premium_monthly",
"product_family_id": "pfa_streaming",
"billing_cycle": "monthly",
"currency": "BRL",
"current_amount": 4990,
"current_period_start": "2026-06-25T00:00:00.000Z",
"current_period_end": "2026-07-25T00:00:00.000Z",
"next_billing_at": "2026-07-25T00:00:00.000Z",
"billing_anchor_day": 25,
"trial_start": null,
"trial_end": null,
"dunning_started_at": null,
"dunning_attempt_count": 0,
"dunning_next_retry_at": null,
"cycles_completed": 3,
"cycle_limit": null,
"status": "active",
"cancel_at_period_end": false,
"cancelled_at": null,
"cancellation_reason": null,
"payment_instrument_id": "pi_9c3f2a",
"preferred_installments": 1,
"created_at": "2026-03-25T12:00:00.000Z",
"updated_at": "2026-06-25T00:00:01.000Z"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}Um id ausente ou fora de escopo retorna 404 (not_found_error).
GET/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/transitions
Lista o histórico de transições da assinatura — um log de auditoria somente de acréscimo de cada mudança de estado e de oferta, das mais recentes para as mais antigas. Cada transição registra o que mudou, quem disparou e o pedido que a causou (quando aplicável). Este é o sistema de registro para o histórico de mudanças de oferta.
Auth: Chave de Merchant (subscriptions:read)
Objeto de transição
| Field | Type | Description |
|---|---|---|
id | string | Id da transição (sbt_). |
subscription_id | string | Assinatura proprietária (sub_). |
transition_type | enum | creation, upgrade, downgrade, reactivation, cancellation, trial_start, trial_conversion, payment_method_change, dunning_entry, dunning_retry, dunning_cancelled, expiration, cycle_limit_renewed, pause, resume. |
from_offer_id | string | null | Oferta antes da mudança (ofr_). null na criação. |
to_offer_id | string | null | Oferta após a mudança (ofr_). null no cancelamento. |
from_status | enum | null | Status antes da mudança. null no primeiro evento (criação). |
to_status | enum | Status após a mudança. |
triggered_by | enum | customer, system, ou admin. |
actor | object | null | Para uma transição disparada por admin, um snapshot do usuário do Dashboard que executou a ação, capturado no momento em que ela ocorreu: { "id", "type", "name", "email" }. null para transições disparadas por customer e system. |
order_id | string | null | Pedido que disparou a transição (ord_), se houver. |
reason | string | null | Motivo legível por humanos, quando fornecido. |
metadata | object | null | Contexto adicional, por exemplo o change_charge_behavior resolvido para uma mudança de oferta. |
created_at | string | Timestamp ISO 8601. |
curl "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/transitions" \
-H "Authorization: Bearer sk_live_mer_…"Response 200 OK
{
"success": true,
"data": [
{
"id": "sbt_2b7e1a",
"subscription_id": "sub_3f9a7c2e1b",
"transition_type": "upgrade",
"from_offer_id": "ofr_basic_monthly",
"to_offer_id": "ofr_premium_monthly",
"from_status": "active",
"to_status": "active",
"triggered_by": "customer",
"actor": null,
"order_id": null,
"reason": null,
"metadata": { "change_charge_behavior": "next_renew" },
"created_at": "2026-06-01T09:14:00.000Z"
},
{
"id": "sbt_1a9c4d",
"subscription_id": "sub_3f9a7c2e1b",
"transition_type": "creation",
"from_offer_id": null,
"to_offer_id": "ofr_basic_monthly",
"from_status": null,
"to_status": "active",
"triggered_by": "system",
"actor": null,
"order_id": "ord_5e2f8b",
"reason": null,
"metadata": null,
"created_at": "2026-03-25T12:00:00.000Z"
}
],
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/cancel
Cancela uma assinatura, seja imediatamente ou ao fim do período atual.
Auth: Chave de Merchant (subscriptions:write)
Body
| Field | Type | Required | Description |
|---|---|---|---|
at_period_end | boolean | Sim | true adia o cancelamento para current_period_end (o cliente mantém o acesso até lá). false cancela imediatamente. |
reason | string | Não | Motivo legível por humanos, persistido na assinatura. Máximo de 500 caracteres. |
Quando at_period_end é true, a assinatura é sinalizada (cancel_at_period_end: true) e a virada de status de fato acontece no próximo tick de renovação — nenhuma transição é registrada ainda, porque nada mudou de estado. Quando false, o status vira para cancelled imediatamente e uma transição cancellation é registrada.
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/cancel" \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "at_period_end": true, "reason": "customer no longer needs the service" }'Response 200 OK — o objeto de assinatura atualizado. Com at_period_end: true:
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"status": "active",
"cancel_at_period_end": true,
"cancellation_reason": "customer no longer needs the service",
"current_period_end": "2026-07-25T00:00:00.000Z",
"next_billing_at": "2026-07-25T00:00:00.000Z"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}Cancelar uma assinatura que já está cancelled ou expired retorna 400 (validation_error) — estados terminais não podem ser cancelados novamente.
POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/admin-cancel
Auth: Chave de Organization (com merchant_id) ou chave de Merchant.
Variante privilegiada do cancelamento, registrada como iniciada pelo merchant. Requer o escopo subscriptions:admin e não faz parte da API pública.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
merchant_id | string | Sim | — |
subscription_id | string | Sim | — |
Campos da requisição
| Field | Type | Required | Description |
|---|---|---|---|
at_period_end | boolean | Sim | Quando true, adia o cancelamento para a próxima renovação; false cancela imediatamente. |
reason | string | Não | Motivo legível por humanos opcional, persistido na assinatura. |
Exemplo de requisição
curl -X POST https://api.tokeflow.com/api/v1/merchants/mrc_8a3f12d9/subscriptions/sub_6d80b3a2/admin-cancel \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{
"at_period_end": true,
"reason": "customer no longer needs the service"
}'Exemplo de resposta — 200
{
"id": "sub_123",
"merchant_id": "mrc_123",
"customer_id": "cust_123",
"customer_name": "Acme Store",
"customer_email": "jane@example.com",
"current_offer_id": "off_123",
"offer_name": "Acme Store",
"product_id": "prd_9b1e6c05",
"product_name": "Acme Store",
"product_family_id": "pfam_123",
"billing_cycle": "monthly",
"currency": "BRL",
"current_amount": 4990,
"current_period_start": "2026-05-25T00:00:00Z",
"current_period_end": "2026-06-25T00:00:00Z",
"next_billing_at": "2026-06-25T00:00:00Z",
"billing_anchor_day": 25,
"trial_start": "2026-05-25T00:00:00Z",
"trial_end": "2026-06-08T00:00:00Z",
"dunning_started_at": "2026-01-15T12:30:00.000Z",
"dunning_attempt_count": 0,
"dunning_next_retry_at": "2026-01-15T12:30:00.000Z",
"cycles_completed": 3,
"cycle_limit": 12,
"status": "active",
"cancel_at_period_end": false
}POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/change-offer
Move a assinatura para uma oferta diferente (um upgrade ou downgrade) dentro da mesma família de produtos. A Tokeflow classifica a mudança como upgrade ou downgrade a partir da ordem de tiers das ofertas e registra a transição correspondente.
Auth: Chave de Merchant (subscriptions:write)
Body
| Field | Type | Required | Description |
|---|---|---|---|
to_offer_id | string | Sim | Oferta de destino (ofr_). Deve pertencer à mesma família de produtos da oferta atual e ter um preço na moeda da assinatura. |
Como o comportamento de cobrança é resolvido
Cada par de ofertas pode declarar um change_charge_behavior que governa como o dinheiro é tratado quando o plano muda:
| Behavior | Meaning |
|---|---|
next_renew | O novo valor entra em vigor na próxima renovação. Sem cobrança imediata, sem proporcionalidade. |
prorated | O cliente é cobrado (ou creditado) na diferença proporcional para o restante do período. |
override | Um valor personalizado definido para a transição é cobrado. |
O comportamento efetivo para um dado par (from_offer → to_offer) é resolvido nesta ordem:
- Se existir uma transição de oferta ativa para o par com um comportamento explícito, esse valor prevalece.
- Caso contrário, recorre ao padrão da família de produtos.
A engine de cobrança processa os três comportamentos. next_renew aplica o novo current_amount a partir do próximo ciclo, sem cobrança imediata ou proporcionalidade; prorated cobra ou credita a diferença proporcional ao restante do período atual; e override cobra o valor personalizado definido para a transição. Você pode resolver o comportamento efetivo antecipadamente por par de ofertas no recurso Ofertas.
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/change-offer" \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "to_offer_id": "ofr_premium_monthly" }'Response 200 OK — a assinatura com o novo current_offer_id, o current_amount atualizado e o billing_cycle re-sincronizado com o ciclo da nova oferta. O período atual mantém suas datas: next_billing_at e os campos de roteamento permanecem inalterados, e o novo ciclo passa a reger as renovações a partir da próxima data de cobrança.
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"current_offer_id": "ofr_premium_monthly",
"current_amount": 4990,
"billing_cycle": "monthly",
"next_billing_at": "2026-07-25T00:00:00.000Z",
"status": "active"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}Erros comuns:
400(validation_error) — a oferta de destino é a atual, a assinatura estácancelled/expired, não existe uma transição de oferta ativa para o par, a oferta de destino não tem preço na moeda da assinatura, ou as ofertas estão em famílias diferentes (trate uma mudança entre famílias como um cancelamento mais uma nova assinatura).
POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/change-payment-instrument
Troca a assinatura para um instrumento de pagamento diferente para renovações futuras. Este é o caminho de recuperação para sair do dunning.
Auth: Chave de Merchant (subscriptions:write)
Body
| Field | Type | Required | Description |
|---|---|---|---|
payment_instrument_id | string | Sim | O instrumento a cobrar daqui em diante (pi_). |
O instrumento já deve ter uma cobrança confirmada iniciada pelo cliente contra ele, para que a Tokeflow possa rotear as renovações futuras pela conexão correta. Se não tiver, a chamada retorna 422 (business_rule_error).
Uma mudança de instrumento de pagamento só é válida enquanto a assinatura está em dunning. Em caso de sucesso, a assinatura retorna para active, os contadores de dunning são resetados e o período de cobrança é reancorado um ciclo para a frente (sem cobrança retroativa do intervalo de dunning). Chamar isso em uma assinatura fora de dunning retorna 400 (validation_error).
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/change-payment-instrument" \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "payment_instrument_id": "pi_new1234" }'Response 200 OK
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"status": "active",
"payment_instrument_id": "pi_new1234",
"dunning_attempt_count": 0,
"dunning_started_at": null,
"dunning_next_retry_at": null,
"current_period_end": "2026-07-25T00:00:00.000Z",
"next_billing_at": "2026-07-25T00:00:00.000Z"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/pause
Suspende a cobrança. Enquanto pausada, nenhuma renovação dispara. Uma transição pause é registrada.
Auth: Chave de Merchant (subscriptions:write)
Body
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | Não | Motivo legível por humanos, persistido na transição. Máximo de 500 caracteres. |
Uma assinatura só pode ser pausada a partir de active ou trialing. Pausar a partir de qualquer outro estado retorna 409 (conflict_error).
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/pause" \
-H "Authorization: Bearer sk_live_mer_…" \
-H "Content-Type: application/json" \
-d '{ "reason": "customer travelling for 6 weeks" }'Response 200 OK
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"status": "paused"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/resume
Retoma uma assinatura pausada. Ela volta para active, ou para trialing se o trial ainda estiver em execução. Se a próxima data de cobrança tiver ficado no passado enquanto estava pausada, o período é avançado para começar a partir de agora — pausar para o relógio em vez de pular um ciclo, então cycles_completed não é incrementado. Uma transição resume é registrada. Sem corpo de requisição.
Auth: Chave de Merchant (subscriptions:write)
Somente uma assinatura paused pode ser retomada. Retomar a partir de qualquer outro estado retorna 409 (conflict_error).
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/resume" \
-H "Authorization: Bearer sk_live_mer_…"Response 200 OK
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"status": "active",
"current_period_start": "2026-06-25T00:00:00.000Z",
"current_period_end": "2026-07-25T00:00:00.000Z",
"next_billing_at": "2026-07-25T00:00:00.000Z"
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}POST/api/v1/merchants/:merchant_id/subscriptions/:subscription_id/reactivate
Suspende um cancelamento agendado e mantém a assinatura no plano atual. A reativação define cancel_at_period_end de volta para false e registra uma transição reactivation. Ela não altera a oferta, o valor nem as datas de cobrança — apenas cancela o cancelamento pendente.
Use-a quando um cliente que havia agendado um cancelamento decide continuar, e como remédio para o 409 retornado quando um cliente tenta comprar um plano que já possui (veja Uma assinatura viva por plano).
Auth: Merchant key (subscriptions:write)
A reativação se aplica a uma assinatura viva — active, trialing ou dunning. Uma assinatura em dunning permanece em dunning e sua escada de reprocessamento não é afetada; cancelar o cancelamento é independente do problema de pagamento. Sem corpo de requisição.
A reativação atua sobre uma assinatura viva que tenha um cancelamento agendado. Uma assinatura paused não pode ser reativada — retome-a com resume — e uma assinatura terminal (cancelled ou expired) é recusada. Ambos retornam 409 (conflict_error).
curl -X POST "https://api.tokeflow.com/api/v1/merchants/mrc_8a1c2d/subscriptions/sub_3f9a7c2e1b/reactivate" \
-H "Authorization: Bearer sk_live_mer_…"Response 200 OK
{
"success": true,
"data": {
"id": "sub_3f9a7c2e1b",
"status": "active",
"cancel_at_period_end": false
},
"request_id": "req_8f3c2a1b",
"timestamp": "2026-06-25T12:30:00.000Z"
}Erros
Os endpoints de assinatura usam o envelope de erro padrão. Os casos mais comuns:
| HTTP | Type | When |
|---|---|---|
400 | validation_error | Cancelamento/mudança em uma assinatura terminal, mudança de oferta entre famílias, change-payment-instrument fora do dunning, sem transição de oferta ativa. |
403 | authorization_error | Chave sem subscriptions:read / subscriptions:write. |
404 | not_found_error | Assinatura não encontrada ou não pertencente ao merchant. |
409 | conflict_error | Pausar a partir de um estado não pausável, retomar a partir de um estado não pausado, reativar uma assinatura pausada ou terminal, ou iniciar uma assinatura para um plano que o cliente já possui. |
422 | business_rule_error | O instrumento de pagamento de destino não tem cobrança anterior confirmada da qual rotear. |
Relacionados
- Ofertas — defina ciclos de cobrança, preços, trials e transições de oferta.
- Pedidos — o pedido criado a cada renovação.
- Transações — a cobrança subjacente e os instrumentos de pagamento.
- Visão geral da referência de API — envelopes, paginação, IDs e convenções de valores monetários.