Transições de oferta do Merchant

Gerencie regras de cobrança por par para mudanças de plano a partir do dashboard do Merchant — liste, crie, atualize e exclua transições de oferta com uma sessão do dashboard.

Uma transição de oferta é uma regra de cobrança por par para mudanças de plano. Ela fixa uma movimentação específica from_offer_id → to_offer_id — um upgrade, um downgrade ou uma troca de plano dentro da mesma família de produtos — a uma regra de cobrança (change_charge_behavior) e a um interruptor liga/desliga (is_active). Quando uma assinatura muda entre esse par exato de ofertas, a regra da transição tem precedência sobre o padrão da família de produtos.

Esses endpoints são a superfície por trás das telas de catálogo do dashboard: a tabela de transições, o diálogo de criação e os controles de ativar/desativar e excluir. Eles operam sobre as mesmas linhas de transição subjacentes que a API pública de transições de oferta — uma regra criada aqui fica imediatamente visível lá, e vice-versa.

Os endpoints do Dashboard alimentam a Tokeflow Dashboard UI. Eles são autenticados por sessão: faça login para obter um JWT e envie-o como um token bearer. Eles não aceitam chaves de API sk_ ou pk_ — para automação programática do catálogo, use a API pública de transições de oferta em vez disso.

Todo endpoint nesta página também requer o header x-merchant-id:

HeaderTipoObrigatórioDescrição
x-merchant-idstringSimO Merchant cujo catálogo você está gerenciando, prefixado com mrc_. Seleciona o contexto de Merchant ativo quando sua conta pertence a mais de um Merchant.

Como uma transição entra em vigor

Criar, desativar ou excluir uma transição muda qual regra de cobrança se aplica na próxima vez que uma assinatura se mover entre o par:

Uma transição inativa ou excluída nunca bloqueia uma mudança de plano — a movimentação simplesmente recorre ao change_charge_behavior padrão da família de produtos. Desativar (PATCH) é reversível; excluir não é.

O motor de transição executa os três comportamentos — next_renew, prorated e override. O change_charge_behavior definido para um par é o que será aplicado quando uma assinatura se mover entre essas ofertas.

O objeto de transição de oferta

FieldTypeDescription
idstringIdentificador único, prefixado com oft_.
from_offer_idstringA oferta da qual a assinatura está saindo. Prefixado com ofr_.
to_offer_idstringA oferta para a qual a assinatura está indo. Prefixado com ofr_. Deve pertencer à mesma família de produtos que from_offer_id.
change_charge_behaviorenum | nullSubstituição por par do change_charge_behavior da família de produtos — next_renew, prorated ou override. null significa recorrer ao padrão da família.
is_activebooleanSe a transição está ativa (elegível para processamento). Transições inativas são ignoradas e o padrão da família se aplica.
created_atstringTimestamp de criação em ISO 8601 UTC.
updated_atstringTimestamp da última atualização em ISO 8601 UTC.

Os três valores de change_charge_behavior:

ValueMeaning
next_renewAplica a mudança na próxima renovação — o novo preço entra em vigor no ciclo de cobrança seguinte.
proratedRateia proporcionalmente a diferença para o ciclo atual.
overrideSubstitui a cobrança atual pelos termos da nova oferta imediatamente.

Os endpoints do Dashboard retornam o objeto diretamente — não há um envelope success/data em torno das respostas de recurso único.


Endpoints

GET/api/v1/merchant/offer-transitions

Merchant

Auth: Dashboard session (JWT bearer). É necessário ser membro do Merchant.

Retorna uma lista paginada das transições de oferta do Merchant. Esta é a consulta por trás da tabela de transições do dashboard, incluindo seus filtros de oferta e status.

Parâmetros de consulta

FieldTypeRequiredDescription
pagenumberNãoNúmero da página, indexado a partir de 1. Padrão 1.
limitnumberNãoItens por página. Padrão 20, mín. 1, máx. 100.
from_offer_idstringNãoFiltra transições originadas de uma oferta específica.
to_offer_idstringNãoFiltra transições direcionadas a uma oferta específica.
is_activebooleanNãoFiltra apenas as transições ativas (envie true).
change_charge_behaviorstringNãoFiltra pela regra de cobrança — next_renew, prorated ou override.

Exemplo de solicitação

curl -G https://api.tokeflow.com/api/v1/merchant/offer-transitions \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs…" \
  -H "x-merchant-id: mrc_123" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20" \
  --data-urlencode "is_active=true"

Exemplo de resposta — 200 OK

{
  "data": [
    {
      "id": "oft_a1b2c3d4e5",
      "from_offer_id": "ofr_3hk9d2",
      "to_offer_id": "ofr_7pq4m1",
      "change_charge_behavior": "next_renew",
      "is_active": true,
      "created_at": "2026-05-19T12:00:00Z",
      "updated_at": "2026-05-19T12:00:00Z"
    },
    {
      "id": "oft_f6g7h8i9j0",
      "from_offer_id": "ofr_7pq4m1",
      "to_offer_id": "ofr_3hk9d2",
      "change_charge_behavior": null,
      "is_active": true,
      "created_at": "2026-06-02T15:45:00Z",
      "updated_at": "2026-06-02T15:45:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 2,
    "total_pages": 1,
    "has_next": false,
    "has_prev": false
  }
}

A segunda transição do exemplo define change_charge_behavior como null — a linha existe por causa do seu interruptor is_active, e a regra de cobrança recorre ao padrão da família.

Metadados de paginação

FieldTypeDescription
pagenumberNúmero da página atual.
limitnumberNúmero de itens por página.
totalnumberNúmero total de itens.
total_pagesnumberNúmero total de páginas.
has_nextbooleanSe há uma próxima página.
has_prevbooleanSe há uma página anterior.

POST/api/v1/merchant/offer-transitions

Merchant

Auth: Dashboard session (JWT bearer). É necessário ser membro do Merchant.

Cria uma transição de oferta para um par from_offer_id → to_offer_id. Ambas as ofertas devem pertencer à mesma família de produtos.

Campos da solicitação

FieldTypeRequiredDescription
from_offer_idstringSimOferta da qual a assinatura está saindo, prefixada com ofr_.
to_offer_idstringSimOferta para a qual a assinatura está indo, prefixada com ofr_. Deve pertencer à mesma família de produtos que from_offer_id.
change_charge_behaviorstringNãoSubstitui o change_charge_behavior da família de produtos para este par — next_renew, prorated ou override. Omita ou envie null para recorrer ao padrão da família. Os três comportamentos são processados pelo motor.
is_activebooleanNãoSe esta transição está ativa (elegível para processamento). O padrão é true.

Exemplo de solicitação

curl -X POST https://api.tokeflow.com/api/v1/merchant/offer-transitions \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs…" \
  -H "x-merchant-id: mrc_123" \
  -H "Content-Type: application/json" \
  -d '{
    "from_offer_id": "ofr_3hk9d2",
    "to_offer_id": "ofr_7pq4m1",
    "change_charge_behavior": "next_renew",
    "is_active": true
  }'

Exemplo de resposta — 201 Created

{
  "id": "oft_a1b2c3d4e5",
  "from_offer_id": "ofr_3hk9d2",
  "to_offer_id": "ofr_7pq4m1",
  "change_charge_behavior": "next_renew",
  "is_active": true,
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:00:00Z"
}

Um 400 é retornado quando to_offer_id não pertence à mesma família de produtos que from_offer_id, ou quando change_charge_behavior não é um dos três valores permitidos.


GET/api/v1/merchant/offer-transitions/:id

Merchant

Auth: Dashboard session (JWT bearer). É necessário ser membro do Merchant.

Recupera uma única transição de oferta pelo ID. Retorna o objeto de transição de oferta.

Exemplo de solicitação

curl https://api.tokeflow.com/api/v1/merchant/offer-transitions/oft_a1b2c3d4e5 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs…" \
  -H "x-merchant-id: mrc_123"

Exemplo de resposta — 200 OK

{
  "id": "oft_a1b2c3d4e5",
  "from_offer_id": "ofr_3hk9d2",
  "to_offer_id": "ofr_7pq4m1",
  "change_charge_behavior": "next_renew",
  "is_active": true,
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:00:00Z"
}

Um 404 é retornado se a transição não existir ou não pertencer ao Merchant em x-merchant-id.


PATCH/api/v1/merchant/offer-transitions/:id

Merchant

Auth: Dashboard session (JWT bearer). É necessário ser membro do Merchant.

Atualiza uma transição de oferta. O payload é um objeto parcial — envie apenas os campos que deseja alterar. As atualizações mais comuns são alternar is_active (o controle de ativar/desativar do dashboard) e ajustar change_charge_behavior, inclusive definindo-o como null para recorrer ao padrão da família.

Para redirecionar uma regra para um par de ofertas diferente, prefira excluir a transição e criar uma nova — o par from_offer_id → to_offer_id é a identidade da transição.

Exemplo de solicitação — desativar uma transição

curl -X PATCH https://api.tokeflow.com/api/v1/merchant/offer-transitions/oft_a1b2c3d4e5 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs…" \
  -H "x-merchant-id: mrc_123" \
  -H "Content-Type: application/json" \
  -d '{ "is_active": false }'

Exemplo de resposta — 200 OK

{
  "id": "oft_a1b2c3d4e5",
  "from_offer_id": "ofr_3hk9d2",
  "to_offer_id": "ofr_7pq4m1",
  "change_charge_behavior": "next_renew",
  "is_active": false,
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-08-12T09:30:00Z"
}

Enquanto is_active é false, o par é cobrado pelo change_charge_behavior padrão da família de produtos. Reative a qualquer momento com { "is_active": true }.


DELETE/api/v1/merchant/offer-transitions/:id

Merchant

Auth: Dashboard session (JWT bearer). É necessário ser membro do Merchant.

Exclui uma transição de oferta. A partir daí, as mudanças de plano entre o par seguem o change_charge_behavior padrão da família de produtos.

A exclusão é permanente. Se você só quer pausar uma regra — mantendo sua configuração para depois — desative-a com PATCH e { "is_active": false } em vez disso.

Exemplo de solicitação

curl -X DELETE https://api.tokeflow.com/api/v1/merchant/offer-transitions/oft_a1b2c3d4e5 \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs…" \
  -H "x-merchant-id: mrc_123"

Exemplo de resposta — 204 No Content

A resposta não tem corpo.


Erros

HTTPCausa típica
400Corpo ou consulta inválidos — to_offer_id fora da família de produtos de from_offer_id, ou um valor de change_charge_behavior desconhecido.
401Token de sessão ausente, inválido ou expirado — faça login novamente.
403A conta da sessão não é membro do Merchant em x-merchant-id.
404Nenhuma transição com esse id para este Merchant.

Consulte Erros para o formato de erro usado em toda a API.

Relacionados

Nesta página