Ir al contenido

Suscriptores (Customers)

Ver .md

Un suscriptor es tu cliente dentro de nuestro sistema: guarda su identidad y sus datos de facturación, y es a quien después le asocias un plan para crear la suscripción.

Créalo una sola vez y reutilízalo: un mismo suscriptor puede tener varias suscripciones y varias tarjetas guardadas, con una marcada como predeterminada (default_payment_method).

Descripción: Devuelve todos los suscriptores de las sucursales a las que tienes acceso.

GET /api/v1/subscriptions/subscriber

GEThttps://sag.efipay.co/api/v1/subscriptions/subscriber

Puedes filtrar por tu metadata con coincidencia exacta: GET /api/v1/subscriptions/subscriber?filter[metadata][crm_id]=C-881.

Ventana de terminal
curl -X GET \
'/api/v1/subscriptions/subscriber' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Accept: application/json'
200OK
[
{
"id": "9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f",
"identification_type": "CC",
"id_number": "1020304050",
"name": "Ana",
"last_name": "Gómez",
"email": "ana@ejemplo.com",
"phone_code": 57,
"cellphone_number": "3001234567",
"billing_address": "Calle 100 # 20-30",
"billing_city": "Bogotá",
"billing_country": "Colombia",
"metadata": { "crm_id": "C-881" },
"office_id": 1,
"commerce_id": 42,
"created_at": "2026-07-31 10:15:00"
}
]

Descripción: Devuelve un suscriptor por su id, su correo o su número de documento. El mismo endpoint acepta las tres cosas, así que no necesitas guardar nuestro id si ya tienes cualquiera de los otros dos.

GET /api/v1/subscriptions/subscriber/{emailOrId}

Puedes buscar por Ejemplo
Id (uuid) /subscriber/9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f
Correo /subscriber/ana@ejemplo.com
Documento /subscriber/1020304050
GEThttps://sag.efipay.co/api/v1/subscriptions/subscriber/ana@ejemplo.com
Ventana de terminal
curl -X GET \
'/api/v1/subscriptions/subscriber/ana@ejemplo.com' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Accept: application/json'
200OK
{
"id": "9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f",
"identification_type": "CC",
"id_number": "1020304050",
"name": "Ana",
"last_name": "Gómez",
"email": "ana@ejemplo.com",
"phone_code": 57,
"cellphone_number": "3001234567",
"billing_address": "Calle 100 # 20-30",
"billing_city": "Bogotá",
"billing_country": "Colombia",
"default_payment_method_id": "9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e81",
"balance": 0,
"currency": "COP",
"active": true,
"office_id": 1,
"commerce_id": 42,
"created_at": "2026-07-31 10:15:00"
}
404Not Found

Un id que guardaste y que funcionaba puede empezar a devolver 422 al crear una suscripción. Hay tres causas y cada una tiene su propio mensaje en errors.subscriber_id:

Mensaje Qué pasó Cómo se arregla
«El suscriptor pertenece a la sucursal N y estás enviando office=M» El suscriptor vive en otra sede Manda el office de su sede, o crea el suscriptor en la sede que estás usando
«El suscriptor fue eliminado» Alguien lo borró. La fila sigue existiendo, por eso el id “parece” válido Créalo de nuevo
«El suscriptor pertenece a otro comercio» El token es de otro comercio Revisa el token
«No existe un suscriptor con ese id» El id nunca existió Revisa el id

Lo que no invalida un suscriptor:

  • El paso del tiempo. Un subscriber_id no caduca.
  • Tokenizar o cambiar la tarjeta. Las tarjetas cuelgan del suscriptor; cambiarlas no lo toca.
  • El ambiente. A diferencia de planes y suscripciones, los suscriptores no tienen eje prueba/producción: el mismo suscriptor sirve para ambos.

Descripción: Registra un cliente. Los datos de facturación son obligatorios porque viajan a la red en cada cobro recurrente.

POST /api/v1/subscriptions/subscriber

Nombre del campo Descripción Reglas
identification_type Tipo de documento. Ver enumeraciones ['required', 'string', 'in:CC,CE,TI,PPT,DNI,NIT,Pasaporte,Otro']
id_number Número de documento. No puede ser un número de tarjeta: lo rechazamos a propósito ['required', 'numeric', 'digits_between:5,15']
name Nombres del cliente ['required', 'string', 'max:255']
last_name Apellidos del cliente ['required', 'string', 'max:255']
email Correo del cliente. Único dentro de la sucursal ['required', 'email', 'max:255', 'unique:subscribers,email']
phone_code Indicativo del país, sin + (Colombia: 57) ['required', 'integer', 'min_digits:1', 'max_digits:3']
cellphone_number Celular. Se valida como número real del país que resulte de phone_code ['required', 'numeric', 'phone']
billing_address Dirección de facturación ['required', 'string', 'max:255']
billing_city Ciudad de facturación ['required', 'string', 'max:255']
billing_country País de facturación. Ver lista de países ['required', 'string', 'max:255']
office Sucursal a la que pertenece el suscriptor. Debe ser una de tus sucursales ['required', 'exists:offices,id']
metadata Tus pares clave-valor. Ver Metadata ['sometimes', 'nullable', 'metadata']
POSThttps://sag.efipay.co/api/v1/subscriptions/subscriber
Ventana de terminal
curl -X POST \
'/api/v1/subscriptions/subscriber' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H "Content-type: application/json" \
-d '{
"identification_type": "CC",
"id_number": "1020304050",
"name": "Ana",
"last_name": "Gómez",
"email": "ana@ejemplo.com",
"phone_code": "57",
"cellphone_number": "3001234567",
"billing_address": "Calle 100 # 20-30",
"billing_city": "Bogotá",
"billing_country": "Colombia",
"office": 1
}'
201Created
{
"saved": true,
"subscriber": {
"id": "9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f",
"name": "Ana",
"lastName": "Gómez",
"email": "ana@ejemplo.com",
"phoneCode": 57,
"cellphoneNumber": "3001234567",
"billingAddress": "Calle 100 # 20-30",
"billingCity": "Bogotá",
"billingCountry": "Colombia",
"metadata": null,
"active": true,
"subscriptionsCount": 0,
"activeSubscriptionsCount": 0,
"inactiveSubscriptionsCount": 0,
"createdAt": "2026-07-31 10:15:00"
}
}
422Unprocessable Entity
{
"message": "El campo email ya está en uso.",
"errors": {
"email": ["El campo email ya está en uso."]
},
"error": {
"type": "invalid_request_error",
"code": "validation_failed",
"message": "El campo email ya está en uso.",
"param": "email"
}
}

Descripción: Cambia los datos de un suscriptor. Envía solo los campos que quieres cambiar; los que omitas se quedan como estaban. El tipo y número de documento no se modifican, ni la sucursal.

PUT /api/v1/subscriptions/subscriber/{subscriber-id}

Nombre del campo Descripción Reglas
name Nombres del cliente ['sometimes', 'required', 'string', 'max:255']
last_name Apellidos del cliente ['sometimes', 'required', 'string', 'max:255']
email Nuevo correo. Único dentro de la misma sucursal, ignorando a este suscriptor ['sometimes', 'required', 'email', 'max:255', 'unique:subscribers,email']
phone_code Indicativo del país ['sometimes', 'required', 'integer', 'min_digits:1', 'max_digits:3']
cellphone_number Celular. Aquí no se valida contra el formato del país, a diferencia de crear ['sometimes', 'required', 'numeric']
billing_address Dirección de facturación ['sometimes', 'required', 'string', 'max:255']
billing_city Ciudad de facturación ['sometimes', 'required', 'string', 'max:255']
billing_country País de facturación ['sometimes', 'required', 'string', 'max:255']
metadata Se combina con la existente. Una clave con "" o null se borra; metadata: null borra todo. Ver Metadata ['sometimes', 'nullable', 'metadata']
PUThttps://sag.efipay.co/api/v1/subscriptions/subscriber/your-subscriber-id
Ventana de terminal
curl -X PUT \
'/api/v1/subscriptions/subscriber/9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H "Content-type: application/json" \
-d '{
"email": "ana.gomez@ejemplo.com",
"cellphone_number": "3009876543"
}'
200OK
{
"saved": true,
"subscriber": {
"id": "9b0f2a13-2c44-4a1a-9f2e-1d3b4c5d6e7f",
"name": "Ana",
"lastName": "Gómez",
"email": "ana.gomez@ejemplo.com",
"cellphoneNumber": "3009876543",
"subscriptionsCount": 2,
"activeSubscriptionsCount": 1,
"inactiveSubscriptionsCount": 1,
"createdAt": "2026-07-31 10:15:00"
}
}

metadata guarda tus propias referencias del cliente (id en tu CRM, segmento…), al estilo de Stripe. Mismas reglas que en suscripciones:

Límite Valor
Claves Hasta 50, de 1 a 40 caracteres [A-Za-z0-9_-]
Valor Texto o número, hasta 500 caracteres. Se guarda como texto
Al actualizar Las claves se combinan; "" o null borra una clave; metadata: null borra todo

Llega en los GET, en el listado y en los webhooks de suscripción, dentro de subscription.subscriber.metadata. Un valor inválido responde 422 con error.code: "validation_failed" y error.param: "metadata".

Descripción: Elimina un suscriptor.

DELETE /api/v1/subscriptions/subscriber/{subscriber-id}

DELETEhttps://sag.efipay.co/api/v1/subscriptions/subscriber/your-subscriber-id
200OK
{
"deleted": true
}
400Bad Request
{
"message": "Este suscriptor no puede ser eliminado ya que tiene una suscripción activa"
}

Las mismas operaciones, con el nombre de Stripe. Comportamiento, parámetros y respuestas son idénticos a los de arriba; solo cambia el segmento de la ruta.

Listar — GET /api/v1/subscriptions/customer

GEThttps://sag.efipay.co/api/v1/subscriptions/customer

Buscar por correo o id — GET /api/v1/subscriptions/customer/{emailOrId}

GEThttps://sag.efipay.co/api/v1/subscriptions/customer/ana@ejemplo.com

Crear — POST /api/v1/subscriptions/customer

POSThttps://sag.efipay.co/api/v1/subscriptions/customer

Actualizar — PUT /api/v1/subscriptions/customer/{customer-id}

PUThttps://sag.efipay.co/api/v1/subscriptions/customer/your-subscriber-id

Eliminar — DELETE /api/v1/subscriptions/customer/{customer-id}

DELETEhttps://sag.efipay.co/api/v1/subscriptions/customer/your-subscriber-id

Última actualización: