plan_items)
— cada um representa uma cobrança do bundle — e cada componente tem uma ou mais versões de preço (prices),
sempre em centavos.
O fluxo típico é: cria o plano em draft, adiciona pelo menos um componente recorrente com preço (ou usa o
endpoint atômico de cobrança), e publica o plano para que ele aceite assinaturas.
Todos os endpoints desta página exigem o header
x-api-key. Veja Autenticação.
Os exemplos usam a base URL de sandbox https://billing-api.sandbox.z2pay.com.Conceitos
Plano
Template de cobrança identificado por um
code único. Nasce em draft e precisa ser publicado.
IDs com prefixo plan_.Componente (plan_item)
Cada cobrança dentro do plano. Pode ser
recurring (cobrado todo ciclo) ou activation
(cobrado uma vez, na adesão). IDs com prefixo pli_.Preço (price)
Versão de preço de um componente, em centavos. Criar um preço novo marca o anterior da mesma
combinação (moeda, recorrência) como não-corrente. IDs com prefixo
price_.Recorrência
Define a cadência (
unit + interval), a âncora do ciclo e quando cobrar (prepaid/postpaid).Endpoints
| Método | Rota | Descrição |
|---|---|---|
POST | /plans | Cria um plano em draft |
GET | /plans | Lista planos (paginado, com filtros) |
GET | /plans/{id} | Busca um plano por ID |
PATCH | /plans/{id} | Atualiza campos editáveis do plano |
POST | /plans/{id}/publish | Publica o plano (draft → active) |
POST | /plans/{id}/archive | Arquiva o plano |
GET | /plans/{id}/template | Plano + componentes com o preço corrente de cada um |
GET | /plans/{id}/items | Lista os componentes do plano |
POST | /plans/{id}/items | Adiciona um componente ao plano |
PATCH | /plans/{id}/items/{itemId} | Atualiza um componente |
DELETE | /plans/{id}/items/{itemId} | Arquiva um componente |
GET | /plans/{id}/prices | Lista as versões de preço do plano |
POST | /plans/{id}/prices | Cria uma nova versão de preço |
POST | /plans/{id}/prices/{priceId}/archive | Arquiva uma versão de preço |
POST | /plans/{id}/charges | Cria componente + preço atomicamente |
Criar plano
POST /plans — retorna 201 Created. O plano nasce em draft.Parâmetros (body)
Identificador único do plano. 1 a 100 caracteres. Apenas letras minúsculas, números, hífen e
underscore (regex
^[a-z0-9-_]+$).Nome do plano. 1 a 255 caracteres.
Descrição livre. Até 1000 caracteres. Opcional.
Objeto livre de chave/valor para dados próprios. Opcional.
Listar planos
GET /plans — retorna 200 OK com uma lista paginada.Parâmetros (query)
Filtra por status. Aceita CSV (
?status=active,draft). Valores válidos: draft, active,
inactive, archived. Até 100 caracteres.Busca rápida — match parcial em
code OU name. Até 100 caracteres.Match parcial no campo
code. Até 100 caracteres.Match parcial no campo
name. Até 255 caracteres.Match parcial no nome de algum componente do plano. Até 255 caracteres.
Inclui só planos com algum componente cujo preço corrente seja maior ou igual a este valor (em centavos). Mínimo 0.
Inclui só planos com algum componente cujo preço corrente seja menor ou igual a este valor (em centavos). Mínimo 0.
Data ISO 8601 (com offset) ou data simples (
YYYY-MM-DD). Inclui só planos criados a partir desta data (inclusivo).Data ISO 8601 (com offset) ou data simples (
YYYY-MM-DD). Inclui só planos criados até esta data (inclusivo).Campo de ordenação. Valores válidos:
createdAt, name.Direção da ordenação. Valores válidos:
asc, desc.Página da paginação.
Quantidade de itens por página.
Buscar plano por ID
GET /plans/{id} — retorna 200 OK ou 404 Not Found se o plano não existir.Template do plano
GET /plans/{id}/template — retorna 200 OK com o plano mais cada componente acompanhado do seu preço corrente. 404 Not Found se o plano não existir.Parâmetros (query)
Restringe os preços a uma única moeda (ex.:
BRL). Opcional — sem ela, retorna o preço corrente de cada componente em todas as moedas.Atualizar plano
PATCH /plans/{id} — atualização parcial. Retorna 200 OK ou 404 Not Found.publish / archive.
Parâmetros (body)
Novo nome. 1 a 255 caracteres. Opcional.
Nova descrição. Até 1000 caracteres. Aceita
null para limpar. Opcional.Novo objeto de metadados. Opcional.
Publicar e arquivar plano
POST /plans/{id}/publish leva o plano de draft para active.
POST /plans/{id}/archive arquiva o plano. Ambos retornam 200 OK ou 404 Not Found.Componentes (plan_items)
Cada componente é uma cobrança dentro do plano.kind: recurring vs activation
kind: recurring vs activation
recurring— cobrado todo ciclo. Vira um item de assinatura quando uma assinatura é criada a partir do plano.activation— cobrado/entregue uma vez, na adesão. Materializa na fatura de adesão.
recurring.Adicionar componente
POST /plans/{id}/items — retorna 201 Created. 404 se o plano não existir, 409 se o key já existir no plano.Slug estável, único por plano. 1 a 100 caracteres. Apenas letras minúsculas, números, hífen e
underscore (regex
^[a-z0-9-_]+$).Nome do componente. 1 a 255 caracteres.
recurring (cobrado todo ciclo) ou activation (cobrado uma vez, na adesão).Quantidade padrão. Inteiro positivo.
Quantidade já incluída (não cobrada além). Inteiro maior ou igual a 0.
Se o componente é opcional no bundle.
Ordem de exibição. Inteiro maior ou igual a 0.
Descrição. Até 1000 caracteres. Opcional.
Objeto livre. Opcional.
Listar, atualizar e arquivar componentes
GET /plans/{id}/items lista os componentes (não paginado).
PATCH /plans/{id}/items/{itemId} atualiza um componente (200 / 404).
DELETE /plans/{id}/items/{itemId} arquiva um componente (200 / 404).PATCH, os campos editáveis são: name, quantityDefault, quantityIncluded, optional,
displayOrder, description (aceita null) e metadata. Todos opcionais. key e kind não são editáveis.
Preços (prices)
Cada preço é uma versão de cobrança de um componente, sempre em centavos.Criar versão de preço
POST /plans/{id}/prices — retorna 201 Created e marca este preço como corrente. 404 se o plano não existir.ID do componente (
plan_items.id) que este preço versiona. 1 a 36 caracteres. Opcional — preferido
quando você acabou de criar o componente.Slug do componente (
plan_items.key). 1 a 100 caracteres, regex ^[a-z0-9-_]+$. Opcional.
Se nem planItemId nem planItemKey forem informados, usa o componente default (legado).Esquema de cobrança. Valores válidos:
fixed, tiered, per_unit, package, metered.Valor do preço.
Regra de recorrência.
Faixas de preço (para
billingScheme=tiered). Cada faixa tem upTo (inteiro positivo ou null
na última faixa, indicando infinito) e unitAmount (centavos, inteiro maior ou igual a 0). Opcional.Tamanho do pacote (para
billingScheme=package). Inteiro positivo. Opcional.Identificador do medidor (para
billingScheme=metered). Até 100 caracteres. Opcional.Configuração de trial. Opcional.
Listar e arquivar preços
GET /plans/{id}/prices lista as versões de preço do plano (não paginado).
POST /plans/{id}/prices/{priceId}/archive arquiva uma versão específica (200 / 404).Criar cobrança (componente + preço) atomicamente
POST /plans/{id}/charges — retorna 201 Created com { item, price }. 400 se a validação falhar (item ou preço), 404 se o plano não existir.POST /items + POST /prices em sequência).
Mesmos campos de Adicionar componente (
key, name, kind, etc.).Mesmos campos de Criar versão de preço, exceto
planItemId e
planItemKey — o service liga o preço ao componente recém-criado automaticamente.Fluxo recomendado
Adicione a cobrança
Use
POST /plans/{id}/charges para criar o componente recorrente e seu preço de uma vez, ou
faça POST /plans/{id}/items seguido de POST /plans/{id}/prices.Com o plano
active e ao menos um componente recorrente com preço, você já pode criar assinaturas.Veja também
Assinaturas
Crie e gerencie assinaturas a partir de um plano publicado.
Faturas
Como as faturas são geradas e cobradas a cada ciclo.
Ciclos
Entenda a cadência, âncoras e o timing de cobrança.
Visão geral de assinaturas
Panorama do módulo de cobrança recorrente.

