Clientes

Crea y consulta los clientes de tu negocio.

Usa billete.customers desde tu servidor. Configura el cliente con el entorno y la clave de tu negocio.

Ejemplo

const customer = await billete.customers.create({
  email: "cliente@example.com",
  name: "Cliente de ejemplo",
  externalId: "user_123",
}, { idempotencyKey: "customer-user-123" });

const saved = await billete.customers.retrieve(customer.id);
await billete.customers.update(customer.id, { name: "Nombre actualizado" });

Métodos

MétodoQué hace
create(input, options?)Crear un cliente; email es obligatorio.
retrieve(id, options?)Consultar un cliente por ID de Billete o externalId.
update(id, input, options?)Actualizar sus datos.
list(query?, options?)Listar; admite email y search.
iterate(query?)Recorrer todos los clientes.

Qué debes tener en cuenta

externalId conecta el cliente con tu usuario. No uses datos personales como claves de idempotencia ni los incluyas en registros.

También puede representar una organización. Dos clientes con distintos externalId pueden compartir correo: enviar un identificador externo nunca fusiona clientes por email.

Crear un cliente si no existe

create no reutiliza un cliente con el mismo externalId: devuelve customer_exists. Un cliente inexistente devuelve customer_not_found.

import { BilleteError } from "@boelabs/billete-sdk";

const isCode = (error: unknown, code: string) =>
  error instanceof BilleteError && error.code === code;

async function customerFor(externalId: string, email: string) {
  try {
    return await billete.customers.retrieve(externalId);
  } catch (error) {
    if (!isCode(error, "customer_not_found")) throw error;
  }
  try {
    return await billete.customers.create({ externalId, email });
  } catch (error) {
    // Another request created it first.
    if (isCode(error, "customer_exists")) return billete.customers.retrieve(externalId);
    throw error;
  }
}

Al crear una suscripción o un checkout también puedes pasar customer: { externalId, email }: Billete crea el cliente o reutiliza el existente.

Miembros

await billete.members.create("org_123", { externalId: "user_42", name: "Ana" });
const members = await billete.members.list("org_123", { status: "active" });
await billete.members.update("org_123", "user_42", { name: "Ana María" });
// Conserva su puesto antes que los demás si faltan puestos.
await billete.members.update("org_123", "user_42", { priority: true });
await billete.members.remove("org_123", "user_42");
// Recupera el mismo ID y consumo, sujeto al límite de puestos.
await billete.members.create("org_123", { externalId: "user_42" });

members.create es idempotente por ID externo: devuelve el miembro si ya está activo, así que no hace falta consultarlo antes. members.retrieve(customer, member) consulta un miembro por mem_ o por ID externo; si no existe devuelve member_not_found, y si falta el cliente, customer_not_found. enabled refleja si tiene puesto: la capacidad es la suma de los puestos de todas las suscripciones vigentes del cliente (list la devuelve en capacity). Si faltan puestos, los conservan primero los miembros con priority: true y luego los más antiguos. Quitarlo conserva el historial y las operaciones pendientes.

Referencia HTTP y reglas de clientes.