Plans
/v1/plans — productos recurrentes que tú defines y vendes a tus clientes.
Ver también el concepto Plan.
El objeto Plan
{
"id": "plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
"code": "pro-mensual",
"name": "Plan Pro",
"price_monthly_cents": 5000000,
"price_annual_cents": 50000000,
"trial_days": 7,
"description": "Acceso completo a todas las funciones",
"active": true,
"created_at": "2026-08-24T15:00:00Z"
}| Campo | Tipo |
|---|---|
id | string |
code | string |
name | string |
price_monthly_cents | integer |
price_annual_cents | integer | null |
trial_days | integer | null |
description | string | null |
active | boolean |
created_at | datetime (ISO-8601 UTC) |
Crear un plan
POST /v1/plans
Request body
{
"code": "pro-mensual",
"name": "Plan Pro",
"price_monthly_cents": 5000000,
"price_annual_cents": 50000000,
"trial_days": 7,
"description": "Acceso completo a todas las funciones",
"active": true
}| Campo | Requerido | Descripción |
|---|---|---|
code | Sí | Código único |
name | Sí | Nombre visible |
price_monthly_cents | Sí | Precio mensual en centavos COP |
price_annual_cents | No | Precio anual en centavos COP |
trial_days | No | Días de prueba |
description | No | Descripción libre |
active | No | Por defecto true |
Response — 201 Created
Devuelve el objeto Plan creado.
curl
curl -X POST https://api.rekurra.dev/v1/plans \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{
"code": "pro-mensual",
"name": "Plan Pro",
"price_monthly_cents": 5000000,
"trial_days": 7
}'JavaScript (fetch)
const res = await fetch("https://api.rekurra.dev/v1/plans", {
method: "POST",
headers: {
Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
body: JSON.stringify({
code: "pro-mensual",
name: "Plan Pro",
price_monthly_cents: 5000000,
trial_days: 7,
}),
});
const plan = await res.json();Python (requests)
import requests
res = requests.post(
"https://api.rekurra.dev/v1/plans",
headers={
"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
json={
"code": "pro-mensual",
"name": "Plan Pro",
"price_monthly_cents": 5000000,
"trial_days": 7,
},
)
plan = res.json()Errores posibles
| Status | error.type | Causa |
|---|---|---|
400 | invalid_request | Falta code, name o price_monthly_cents, o code con formato inválido |
401 | authentication_error | API key inválida o ausente |
409 | invalid_request | Ya existe un plan con ese code |
Listar planes
GET /v1/plans
Soporta paginación estándar: ?limit= (default 25, máx 100) y
?starting_after=<id>.
curl
curl "https://api.rekurra.dev/v1/plans?limit=25" \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch("https://api.rekurra.dev/v1/plans?limit=25", {
headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" },
});
const { data, has_more, next_cursor } = await res.json();Python (requests)
import requests
res = requests.get(
"https://api.rekurra.dev/v1/plans",
params={"limit": 25},
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
body = res.json()Response — 200 OK
{ "data": [ /* Plan[] */ ], "has_more": false, "next_cursor": null }Obtener un plan
GET /v1/plans/{id}
curl
curl https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2 \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
const res = await fetch(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{ headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" } }
);
const plan = await res.json();Python (requests)
import requests
res = requests.get(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)
plan = res.json()Errores posibles
| Status | error.type | Causa |
|---|---|---|
404 | invalid_request | El plan no existe o no pertenece a tu cuenta |
Actualizar un plan
PATCH /v1/plans/{id}
Acepta cualquier subconjunto de los campos de creación.
curl
curl -X PATCH https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2 \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{ "name": "Plan Pro (nuevo nombre)" }'JavaScript (fetch)
const res = await fetch(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{
method: "PATCH",
headers: {
Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
body: JSON.stringify({ name: "Plan Pro (nuevo nombre)" }),
}
);
const plan = await res.json();Python (requests)
import requests
res = requests.patch(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
headers={
"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX",
"Content-Type": "application/json",
},
json={"name": "Plan Pro (nuevo nombre)"},
)
plan = res.json()Errores posibles
| Status | error.type | Causa |
|---|---|---|
400 | invalid_request | Campo con formato inválido |
404 | invalid_request | El plan no existe |
Desactivar un plan
DELETE /v1/plans/{id}
Desactivación suave: marca active: false. Las suscripciones existentes que
usan este plan no se ven afectadas.
curl
curl -X DELETE https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2 \
-H "Authorization: Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"JavaScript (fetch)
await fetch(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
{
method: "DELETE",
headers: { Authorization: "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX" },
}
);Python (requests)
import requests
requests.delete(
"https://api.rekurra.dev/v1/plans/plan_01HZXK7QJ5M8Z9X2R3TVQ7A1B2",
headers={"Authorization": "Bearer rk_live_XXXXXXXXXXXXXXXXXXXXXXXX"},
)Response — 200 OK
Devuelve el objeto Plan con active: false.