Commet ahora es completamente headless. Todo lo que podés hacer en el dashboard, ahora lo podés hacer desde el SDK, API y CLI. Se publica en los cinco lenguajes con los mismos recursos, métodos y tipos.
Todas las versiones de la API siguen funcionando. Desde la v1 hasta la v5, cada versión es aceptada y lo va a seguir siendo.
Nuevos recursos
Antes eran solo desde el dashboard. Ahora los podés manejar programáticamente:
- Plans — crear, actualizar, eliminar, gestionar features y precios, visibilidad, precios regionales
- Invoices — listar, ver detalle, descargar PDF, enviar al cliente, actualizar estado, crear ajustes
- Transactions — listar, ver detalle, reembolsar, reintentar pagos fallidos
- Plan Groups — organizar planes en grupos, reordenar, gestionar membresía
- Promo Codes — crear y gestionar códigos de descuento
- Credit Packs — crear y gestionar paquetes de créditos
- API Keys — crear, listar, eliminar keys programáticamente
- Webhooks — crear, listar, eliminar endpoints y disparar envíos de prueba
- Addons — CRUD completo para definiciones de addons, más activar/desactivar en una suscripción
Recursos existentes también tienen métodos nuevos:
- Subscriptions —
list(),previewChange(),activateAddon(),deactivateAddon(),adjustBalance(),topupBalance(),purchaseCredits() - Features —
create(),update(),delete()
Breaking changes
Todos los .get() ahora reciben objetos
Todos los getters de recursos cambiaron de argumentos posicionales a un objeto de parámetros.
// v4
await commet.customers.get("cus_xxx");
await commet.plans.get("pro");
// v5
await commet.customers.get({ id: "cus_xxx" });
await commet.plans.get({ id: "pro" });subscriptions.get() → getActive()
Renombrado y recibe un objeto.
// v4
const sub = await commet.subscriptions.get(userId);
// v5
const sub = await commet.subscriptions.getActive({ customerId: userId });subscriptionId → id en cancel, uncancel, changePlan
// v4
await commet.subscriptions.cancel({ subscriptionId: "sub_xxx", reason: "..." });
await commet.subscriptions.uncancel({ subscriptionId: "sub_xxx" });
await commet.subscriptions.changePlan({ subscriptionId: "sub_xxx", newPlanId: "plan_xxx" });
// v5
await commet.subscriptions.cancel({ id: "sub_xxx", reason: "..." });
await commet.subscriptions.uncancel({ id: "sub_xxx" });
await commet.subscriptions.changePlan({ id: "sub_xxx", newPlanId: "plan_xxx" });customerId → id en customers.update
// v4
await commet.customers.update({ customerId: "cus_xxx", email: "new@co.com" });
// v5
await commet.customers.update({ id: "cus_xxx", email: "new@co.com" });features.check() eliminado
Usá canUse() — devuelve más contexto (impacto de billing, razón si está bloqueado).
// v4
const { allowed } = await commet.features.check({ customerId: userId, code: "api_calls" });
// v5
const { allowed } = await commet.features.canUse({ customerId: userId, code: "api_calls" });features.list() recibe un objeto
// v4
const features = await commet.features.list(userId);
// v5
const features = await commet.features.list({ customerId: userId });addons.getActive() → listActive()
// v4
const addons = await commet.addons.getActive({ customerId: userId });
// v5
const addons = await commet.addons.listActive({ customerId: userId });seatType → featureCode
Los seats son features. El nombre del parámetro ahora lo refleja. featureCode ahora es requerido (antes era opcional junto al deprecado seatType en v4).
// v4
commet.seats.add({ customerId: userId, seatType: "member", count: 1 });
// v5
commet.seats.add({ customerId: userId, featureCode: "member" });count tiene default 1 — no hace falta pasarlo para operaciones de un solo seat.
Sin más customer() context
Todos los métodos ahora reciben customerId como parámetro directo. Menos indirección, más fácil de entender.
// v4
const customer = commet.customer(userId);
await customer.features.canUse("editor");
await customer.seats.add("member");
// v5
await commet.features.canUse({ customerId: userId, code: "editor" });
await commet.seats.add({ customerId: userId, featureCode: "member" });externalId eliminado
Si estabas pasando externalId para identificar clientes en seats, usage o subscriptions — usá customerId. Para crear un customer, seguí usando id. También fue eliminado de los payloads de WebhookData.
// v4 — externalId en varios recursos
commet.usage.track({ feature: "api_calls", externalId: userId });
// v5 — customerId en todos lados
commet.usage.track({ feature: "api_calls", customerId: userId });Formato de respuesta de errores
ApiResponse ya no tiene code, message, details en el nivel superior. Usá el objeto error.
// v4
if (!response.success) {
console.log(response.code, response.message);
}
// v5
if (!response.success) {
console.log(response.error?.code, response.error?.message);
}Los errores lanzados también son más ricos. CommetAPIError ahora incluye type, param y docUrl.
try {
await commet.subscriptions.create({ customerId, planCode: "pro" });
} catch (error) {
if (error instanceof CommetAPIError) {
console.log(error.type); // "invalid_request_error"
console.log(error.param); // "planCode"
console.log(error.docUrl); // link a la documentación
}
}Modo debug
Pasá debug: true para ver cada request y response en tu consola. Útil cuando estás integrando.
const commet = new Commet({ apiKey: "ck_...", debug: true });
// [Commet SDK] POST https://commet.co/api/v1/subscriptions
// [Commet SDK] Response status: 201 CreatedCLI con resource commands
Cada método del SDK ahora disponible desde la terminal. Sin escribir código — creá clientes, planes, suscripciones, emití reembolsos, todo desde la línea de comandos.
commet customers create --email user@example.com --id user_123
commet plans create --name "Pro" --code pro
commet plans add-price --plan-id pln_abc --billing-interval monthly --price 2900
commet subscriptions create --customer-id user_123 --plan-code pro
commet invoices list --customer-id user_123
commet transactions refund --id txn_abcMisma estructura en todos: commet <recurso> <acción> [--flags].
--output agent devuelve JSON crudo. --help en cada nivel muestra las acciones y flags disponibles. Los errores siempre te dicen qué salió mal y qué valores son válidos.
commet link ahora auto-genera una API key para tu org — sin pasos extra.
Todos los lenguajes, misma API
Node, Python, Go, Java y PHP — todos con los mismos recursos y firmas de métodos idénticas.
npm install @commet/node@5
pip install commet-sdk==5.0.0
go get github.com/commet-labs/commet-go/v5
composer require commet/commet-php:^5.0
implementation("co.commet:commet-java:5.0.0") // Gradle