plan_items)
— cada uno representa un cobro del bundle — y cada componente tiene una o más versiones de precio (prices),
siempre en centavos.
El flujo típico es: crear el plan en draft, agregar al menos un componente recurrente con precio (o usar el
endpoint atómico de cobro), y publicar el plan para que acepte suscripciones.
Todos los endpoints de esta página requieren el header
x-api-key. Consulta Autenticación.
Los ejemplos usan la base URL de sandbox https://billing-api.sandbox.z2pay.com.Conceptos
Plan
Template de cobro identificado por un
code único. Nace en draft y debe ser publicado.
IDs con prefijo plan_.Componente (plan_item)
Cada cobro dentro del plan. Puede ser
recurring (cobrado en cada ciclo) o activation
(cobrado una vez, en la adhesión). IDs con prefijo pli_.Precio (price)
Versión de precio de un componente, en centavos. Crear un precio nuevo marca el anterior de la misma
combinación (moneda, recurrencia) como no vigente. IDs con prefijo
price_.Recurrencia
Define la cadencia (
unit + interval), el ancla del ciclo y cuándo cobrar (prepaid/postpaid).Endpoints
| Método | Ruta | Descripción |
|---|---|---|
POST | /plans | Crea un plan en draft |
GET | /plans | Lista planes (paginado, con filtros) |
GET | /plans/{id} | Obtiene un plan por ID |
PATCH | /plans/{id} | Actualiza campos editables del plan |
POST | /plans/{id}/publish | Publica el plan (draft → active) |
POST | /plans/{id}/archive | Archiva el plan |
GET | /plans/{id}/template | Plan + componentes con el precio vigente de cada uno |
GET | /plans/{id}/items | Lista los componentes del plan |
POST | /plans/{id}/items | Agrega un componente al plan |
PATCH | /plans/{id}/items/{itemId} | Actualiza un componente |
DELETE | /plans/{id}/items/{itemId} | Archiva un componente |
GET | /plans/{id}/prices | Lista las versiones de precio del plan |
POST | /plans/{id}/prices | Crea una nueva versión de precio |
POST | /plans/{id}/prices/{priceId}/archive | Archiva una versión de precio |
POST | /plans/{id}/charges | Crea componente + precio de forma atómica |
Crear plan
POST /plans — retorna 201 Created. El plan nace en draft.Parámetros (body)
Identificador único del plan. De 1 a 100 caracteres. Solo letras minúsculas, números, guiones y
guiones bajos (regex
^[a-z0-9-_]+$).Nombre del plan. De 1 a 255 caracteres.
Descripción libre. Hasta 1000 caracteres. Opcional.
Objeto libre de clave/valor para datos propios. Opcional.
Listar planes
GET /plans — retorna 200 OK con una lista paginada.Parámetros (query)
Filtra por estado. Acepta CSV (
?status=active,draft). Valores válidos: draft, active,
inactive, archived. Hasta 100 caracteres.Búsqueda rápida — coincidencia parcial en
code O name. Hasta 100 caracteres.Coincidencia parcial en el campo
code. Hasta 100 caracteres.Coincidencia parcial en el campo
name. Hasta 255 caracteres.Coincidencia parcial en el nombre de algún componente del plan. Hasta 255 caracteres.
Incluye solo planes con algún componente cuyo precio vigente sea mayor o igual a este valor (en centavos). Mínimo 0.
Incluye solo planes con algún componente cuyo precio vigente sea menor o igual a este valor (en centavos). Mínimo 0.
Fecha ISO 8601 (con offset) o fecha simple (
YYYY-MM-DD). Incluye solo planes creados a partir de esta fecha (inclusivo).Fecha ISO 8601 (con offset) o fecha simple (
YYYY-MM-DD). Incluye solo planes creados hasta esta fecha (inclusivo).Campo de ordenamiento. Valores válidos:
createdAt, name.Dirección del ordenamiento. Valores válidos:
asc, desc.Página de la paginación.
Cantidad de ítems por página.
Obtener plan por ID
GET /plans/{id} — retorna 200 OK o 404 Not Found si el plan no existe.Template del plan
GET /plans/{id}/template — retorna 200 OK con el plan más cada componente acompañado de su precio vigente. 404 Not Found si el plan no existe.Parámetros (query)
Restringe los precios a una única moneda (ej.:
BRL). Opcional — sin él, retorna el precio vigente de cada componente en todas las monedas.Actualizar plan
PATCH /plans/{id} — actualización parcial. Retorna 200 OK o 404 Not Found.publish / archive.
Parámetros (body)
Nuevo nombre. De 1 a 255 caracteres. Opcional.
Nueva descripción. Hasta 1000 caracteres. Acepta
null para limpiar. Opcional.Nuevo objeto de metadatos. Opcional.
Publicar y archivar plan
POST /plans/{id}/publish lleva el plan de draft a active.
POST /plans/{id}/archive archiva el plan. Ambos retornan 200 OK o 404 Not Found.Componentes (plan_items)
Cada componente es un cobro dentro del plan.kind: recurring vs activation
kind: recurring vs activation
recurring— cobrado en cada ciclo. Se convierte en un ítem de suscripción cuando se crea una suscripción a partir del plan.activation— cobrado/entregado una vez, en la adhesión. Se materializa en la factura de adhesión.
recurring.Agregar componente
POST /plans/{id}/items — retorna 201 Created. 404 si el plan no existe, 409 si el key ya existe en el plan.Slug estable, único por plan. De 1 a 100 caracteres. Solo letras minúsculas, números, guiones y
guiones bajos (regex
^[a-z0-9-_]+$).Nombre del componente. De 1 a 255 caracteres.
recurring (cobrado en cada ciclo) o activation (cobrado una vez, en la adhesión).Cantidad por defecto. Entero positivo.
Cantidad ya incluida (no cobrada adicionalmente). Entero mayor o igual a 0.
Si el componente es opcional en el bundle.
Orden de visualización. Entero mayor o igual a 0.
Descripción. Hasta 1000 caracteres. Opcional.
Objeto libre. Opcional.
Listar, actualizar y archivar componentes
GET /plans/{id}/items lista los componentes (sin paginación).
PATCH /plans/{id}/items/{itemId} actualiza un componente (200 / 404).
DELETE /plans/{id}/items/{itemId} archiva un componente (200 / 404).PATCH, los campos editables son: name, quantityDefault, quantityIncluded, optional,
displayOrder, description (acepta null) y metadata. Todos opcionales. key y kind no son editables.
Precios (prices)
Cada precio es una versión de cobro de un componente, siempre en centavos.Crear versión de precio
POST /plans/{id}/prices — retorna 201 Created y marca este precio como vigente. 404 si el plan no existe.ID del componente (
plan_items.id) que este precio versiona. De 1 a 36 caracteres. Opcional — preferido
cuando acabas de crear el componente.Slug del componente (
plan_items.key). De 1 a 100 caracteres, regex ^[a-z0-9-_]+$. Opcional.
Si no se informa ni planItemId ni planItemKey, usa el componente default (heredado).Esquema de cobro. Valores válidos:
fixed, tiered, per_unit, package, metered.Valor del precio.
Regla de recurrencia.
Tramos de precio (para
billingScheme=tiered). Cada tramo tiene upTo (entero positivo o null
en el último tramo, indicando infinito) y unitAmount (centavos, entero mayor o igual a 0). Opcional.Tamaño del paquete (para
billingScheme=package). Entero positivo. Opcional.Identificador del medidor (para
billingScheme=metered). Hasta 100 caracteres. Opcional.Configuración del período de prueba. Opcional.
Listar y archivar precios
GET /plans/{id}/prices lista las versiones de precio del plan (sin paginación).
POST /plans/{id}/prices/{priceId}/archive archiva una versión específica (200 / 404).Crear cobro (componente + precio) de forma atómica
POST /plans/{id}/charges — retorna 201 Created con { item, price }. 400 si la validación falla (ítem o precio), 404 si el plan no existe.POST /items + POST /prices en secuencia).
Mismos campos de Agregar componente (
key, name, kind, etc.).Mismos campos de Crear versión de precio, excepto
planItemId y
planItemKey — el servicio vincula el precio al componente recién creado de forma automática.Flujo recomendado
Agrega el cobro
Usa
POST /plans/{id}/charges para crear el componente recurrente y su precio de una sola vez, o
realiza POST /plans/{id}/items seguido de POST /plans/{id}/prices.Con el plan
active y al menos un componente recurrente con precio, ya puedes crear suscripciones.Ver también
Suscripciones
Crea y gestiona suscripciones a partir de un plan publicado.
Facturas
Cómo se generan y cobran las facturas en cada ciclo.
Ciclos
Entiende la cadencia, las anclas y el timing de cobro.
Visión general de suscripciones
Panorama del módulo de cobro recurrente.

