Referencia
Referencia de la API
Las 10 operaciones de la puerta, generadas desde el openapi.yaml publicado. Para el recorrido completo, los errores y los límites, ver la guía; si algo difiere, manda el contrato.
Antes de llamar
Todas las rutas cuelgan de https://api-activate.brainsuite.mx/v1/sites/zom (en la tabla, {key} = zom). Declara source:"herramienta" en el cuerpo (alta y etapas) o el header X-Funnel-Source: herramienta (subida de INE y lecturas de expediente); sin eso recibirás 404.
Crear el trámite
POST/v1/sites/{key}/leads19:tramites:writeCrea un trámite con source:"herramienta". Requiere 19:tramites:write. El consumidor sale del sub del token, nunca del cuerpo.
Idempotencia. La misma referencia_externa con el mismo teléfono devuelve el mismo folio con 200 y resumed:true, aun con el tope diario lleno. Se comparan referencia, teléfono y la petición de activación; el resto del cuerpo se valida de nuevo pero no se aplica. La misma referencia con otro teléfono, o en otro sitio, es 409 REFERENCIA_EN_CONFLICTO.
Teléfono con trámite abierto. Si es tuyo con otra referencia: 409 TRAMITE_ABIERTO con su folio. Si es de otro canal u otra herramienta: 409 TRAMITE_ABIERTO_OTRO_CANAL sin folio ni datos.
Tope. 20 altas por consumidor y día de México.
Activación automática (restringida). activacion_automatica pide que Actívate active el trámite cuando cumpla los requisitos. Solo con clase:"real", consumidor en modo real y la función habilitada (403 ACTIVACION_AUTOMATICA_NO_HABILITADA). Queda fija desde el alta.
Orden de evaluación: sitio → autenticación, consumidor dado de alta y no suspendido, permiso → referencia_externa → clase → consent → validacion_previa → activacion_automatica → aviso de privacidad → nombre, teléfono y correo → idempotencia, conflictos de teléfono y tope diario → inserción.
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
referencia_externa obligatorio | string | Tu id de negocio para este trámite; sin caracteres de control. Única por consumidor en todos los sitios. Llave de idempotencia. |
clase obligatorio | "real" | "prueba" | Sin valor por omisión. real solo para consumidores en modo real, que fija Actívate con Telcel. prueba es siempre simulada. |
consent obligatorio | object | Cómo y cuándo aceptó el cliente. Compuerta propia de la puerta. marketing se ignora (siempre false). Los límites recortan, no rechazan (se descartan en silencio lo que sobra o no es válido; si no queda ninguna entrada válida, CONSENTIMIENTO_REQUERIDO). |
contact_name obligatorio | string | Nombre del cliente. |
contact_phone obligatorio | string | Celular de 10 dígitos (admite +52, 52, 044, 045, 521, espacios y guiones). Diez dígitos iguales o una secuencia trivial se rechazan. |
contact_email | string (email) | Un + en cualquier parte se rechaza (EMAIL_PLUS_NO_PERMITIDO). |
plan_ref | string | Campo key de GET /v1/sites/{key}/plans. Uno inexistente se ignora en silencio. |
modalidad | "abierta" | "controlada" | En esta puerta el esquema restringe a los dos valores; el servidor, ante otro valor, lo trata como abierta. |
opciones_extendidas | object | Objeto {activar, paperless, esim}, cada llave booleana; activar vale true por omisión. |
validacion_previa | object | Referencia de una validación previa de identidad que hizo tu herramienta (request_id y sistema). Evidencia, nunca veredicto. |
activacion_automatica | object | Función restringida. Pide que Actívate active el trámite cuando cumpla los requisitos. Solo con clase:"real" y con la función habilitada
para el consumidor. Otra forma: 422 ACTIVACION_AUTOMATICA_INVALIDA; con clase:"prueba": 422 ACTIVACION_AUTOMATICA_SOLO_REAL.
Queda fija desde el alta (409 ACTIVACION_AUTOMATICA_NO_COINCIDE). {solicitada:false} equivale a no mandarla. Actívate con Telcel entrega la especificación completa al habilitar la función. |
Ejemplo
{
"source": "herramienta",
"referencia_externa": "mi-herramienta-000123",
"clase": "prueba",
"consent": {
"basis": "aviso_aceptado",
"evidence": {
"aceptado_at": "2026-10-22T09:00:00-06:00",
"canal": "app_socio"
}
},
"contact_name": "Juan Pérez López",
"contact_phone": "5500000921",
"contact_email": "cliente@example.com",
"plan_ref": "libre-1",
"modalidad": "abierta",
"validacion_previa": {
"request_id": "val-000123",
"sistema": "mi-sistema"
}
}Respuestas
| Status | Cuándo |
|---|---|
| 201 | Trámite nuevo. |
| 200 | Repetición idempotente — el mismo folio (resumed:true). |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta el permiso, el token no es un service token, el consumidor no está dado de alta o está suspendido, clase:"real" sin estar habilitado, o activacion_automatica sin la función habilitada. |
| 404 | key inexistente (SITE_NOT_FOUND). |
| 409 | Conflicto de referencia o de teléfono (ver error). |
| 422 | Validación. error es un código estable. |
| 423 | El sitio tiene el aviso de privacidad pendiente (G0.8_AVISO_PRIVACIDAD_PENDIENTE). No depende de la herramienta. |
| 429 | Tope diario de altas (TOPE_DIARIO). |
| 500 | Error no previsto (INTERNAL). Reintenta una vez con backoff. |
Camino (línea nueva o portabilidad) y línea
PATCH/v1/sites/{key}/leads/{folio}/plan_linea19:tramites:writehas_number_to_keep:false ⇒ línea nueva. Con número: current_carrier distinto de telcel ⇒ portabilidad; telcel (comparado sin mayúsculas, acentos ni espacios de sobra) ⇒ migración o cambio de plan, que responden 422 CAMINO_NO_DISPONIBLE. Crea el pedido del trámite (503 PEDIDOS_NO_DISPONIBLE si el servicio de pedidos no responde). Un plan_ref inexistente aquí se ignora en silencio. Rate limit: 30 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
has_number_to_keep | boolean | false ⇒ línea nueva. Cualquier otro valor, incluida la ausencia, conserva número. |
current_carrier | string | Compañía actual (se guarda tal cual, sin catálogo). Se compara sin mayúsculas, acentos ni espacios de sobra: telcel, Telcel o TÉLCEL ⇒ migración o cambio de plan (rechazados). |
has_plan | boolean | Solo con telcel: true ⇒ cambio de plan. |
line_msisdn | string | Número a portar (10 dígitos). |
line_lada | string | Solo línea nueva; debe existir en el catálogo de LADA. |
plan_ref | string | Un valor inexistente se ignora en silencio. |
modalidad | "abierta" | "controlada" | |
orden_prepago | boolean |
Respuestas
| Status | Cuándo |
|---|---|
| 200 | Etapa aplicada. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 409 | El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]). |
| 422 | Validación. |
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
| 503 | El servicio de pedidos no respondió. Reintentable. |
Plan y modalidad
PATCH/v1/sites/{key}/leads/{folio}/plan19:tramites:writeplan_ref es el campo key de GET /v1/sites/{key}/plans (ej. libre-1). A diferencia del alta y de plan_linea, un plan_ref inexistente aquí sí da 422 PLAN_NOT_FOUND. Rate limit: 30 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
plan_ref | string | |
modalidad | "abierta" | "controlada" |
Ejemplo
{
"source": "herramienta",
"plan_ref": "libre-2",
"modalidad": "controlada"
}Respuestas
| Status | Cuándo |
|---|---|
| 200 | Plan aplicado. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 409 | El trámite ya fue enviado al operador y el plan no cambia (PLAN_CONGELADO_POR_SISACT). |
| 422 | PLAN_REF_REQUIRED · MODALIDAD_INVALIDA · PLAN_NOT_FOUND. |
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
Nombre, correo, domicilio y teléfono adicional
PATCH/v1/sites/{key}/leads/{folio}/datos19:tramites:writenombre_completo y home_phone son obligatorios para una herramienta (una herramienta no puede declinar el teléfono adicional: no mandes home_phone_declinado). El correo es obligatorio si el trámite aún no tiene uno (el del alta cuenta). El nombre en objeto rechaza palabras genéricas (prueba, test, demo, cliente, …) con NOMBRE_GENERICO; el nombre en texto no pasa por ese filtro. Puede traer region_avisos (avisa, nunca bloquea a una herramienta). Rate limit: 30 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
contact_email | string (email) | Obligatorio si el trámite aún no tiene correo. |
nombre_completo obligatorio | object | string | Objeto estructurado, o texto de al menos 3 palabras (el texto no pasa por el filtro de palabras genéricas). |
address obligatorio | object | Actívate completa estado, municipio y ciudad a partir del CP. |
home_phone obligatorio | string | Teléfono adicional de 10 dígitos (si mandas más, se queda con los últimos 10), distinto del de contacto. Obligatorio. |
geo | object | Solo con permiso del cliente. |
Ejemplo
{
"source": "herramienta",
"contact_email": "cliente@example.com",
"nombre_completo": {
"nombres": "Juan",
"apellido_paterno": "Pérez",
"apellido_materno": "López"
},
"address": {
"cp": "06600",
"colonia": "Juárez",
"calle": "Calle Ejemplo",
"numero_ext": "10"
},
"home_phone": "5500000922"
}Respuestas
| Status | Cuándo |
|---|---|
| 200 | Datos aplicados (status pasa a submitted). |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 409 | El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]). |
| 422 | Validación. field indica el campo cuando aplica. |
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
Dos referencias
PATCH/v1/sites/{key}/leads/{folio}/referencias19:tramites:writeSe requieren 2 (references_required); solo cuentan las dos primeras. Reenviar reemplaza por posición. Los teléfonos deben ser distintos entre sí y del contacto, del adicional y de la línea. Rate limit: 30 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
references obligatorio | array de object | Solo cuentan las dos primeras; se requieren 2. |
Ejemplo
{
"source": "herramienta",
"references": [
{
"name": "María Gómez",
"phone": "5500000923",
"relationship": "amiga",
"holder_informed": true
},
{
"name": "Luis Ramos",
"phone": "5500000924",
"relationship": "familiar",
"holder_informed": true
}
]
}Respuestas
| Status | Cuándo |
|---|---|
| 200 | Referencias capturadas. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 409 | El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]). |
| 422 | Validación. field es references[i].name o references[i].phone. |
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
NIP (portabilidad) o ICCID
PATCH/v1/sites/{key}/leads/{folio}/portabilidad19:tramites:writeExige las dos caras de la INE ya subidas cuando el cuerpo trae nip o iccid con valor (422 DOCUMENTOS_INCOMPLETOS). Un valor vacío borra el dato y no exige INE. En línea nueva la etapa no aplica pero la ruta acepta iccid. activation_status pasa a complete cuando un trámite de portabilidad tiene NIP.
Rate limit: 30 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
source obligatorio | "herramienta" | Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta. |
nip | string | NIP de portabilidad (4 dígitos; cadena vacía lo borra y no exige INE). Dato de vida corta. |
iccid | string | Cadena vacía lo borra y no exige INE. 19 dígitos que empiezan con 89; si no empieza con 8999 debe pasar el dígito Luhn (ICCID_LUHN). |
Ejemplo
{
"source": "herramienta",
"nip": "1234"
}Respuestas
| Status | Cuándo |
|---|---|
| 200 | Dato aplicado. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 409 | El trámite ya fue enviado al operador y el dato no cambia (DATOS_CONGELADOS_POR_SISACT, campos:["activacion"]). |
| 422 | Formato o INE incompleta. |
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
Subir una cara de la INE
POST/v1/sites/{key}/leads/{folio}/documents/{kind}19:tramites:writeEl cuerpo son los bytes de la imagen (no multipart), con su Content-Type real. Máximo 20 MB y 20 documentos vivos por trámite (las rechazadas cuentan). X-Funnel-Source: herramienta es obligatorio. Con X-Adjunto-Ref (tu id para este archivo, ^[A-Za-z0-9-]{1,64}$) repetir la subida del mismo kind responde 200 duplicado:true sin duplicar; un valor con otra forma se descarta en silencio. Dos subidas simultáneas con el mismo X-Adjunto-Ref todavía pueden duplicar.
Cada foto se analiza al llegar (recomendado: timeout de hasta ~90 s). En un trámite de venta real, si la revisión lee datos de identidad, inicia una consulta con el operador, también con la foto rechazada; en prueba simulada no (en pruebas sube solo fotos ficticias). Una foto que la revisión rechaza responde 422 DOCUMENTO_RECHAZADO_IA pero se guarda y cuenta contra el máximo; se corrige con otra foto. Rate limit propio: 12 por minuto por IP.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
kind obligatorio | path | Solo ine_frente e ine_reverso. Cualquier otro tipo válido del sitio da 422 KIND_NO_DISPONIBLE; uno que no existe, 422 KIND_INVALIDO. |
X-Funnel-Source obligatorio | header | |
X-Adjunto-Ref | header | Tu referencia para este archivo; hace idempotente la subida del mismo kind. |
X-Original-Name | header | Nombre del archivo codificado con encodeURIComponent (≤200 caracteres). Por omisión documento. |
Cuerpo
Los bytes de la imagen, con su Content-Type real (image/jpeg, image/png, application/octet-stream). No es multipart.
Respuestas
| Status | Cuándo |
|---|---|
| 201 | Foto recibida. |
| 200 | Repetición idempotente (mismo X-Adjunto-Ref y mismo kind). |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 410 | El trámite venció o se perdió (LEAD_EXPIRED). |
| 413 | Más de 20 MB (DOCUMENTO_MUY_GRANDE), en JSON y antes de resolver el sitio y autenticar. Si lo rechaza el almacén, la respuesta es 422 DOCUMENTO_MUY_GRANDE. |
| 422 |
|
| 423 | El sitio no recibe documentos (ETAPA_DOCUMENTOS_APAGADA). |
| 429 | DEMASIADOS_DOCUMENTOS (20 por trámite) o RATE_LIMITED (12 por minuto por IP, sin Retry-After). |
| 503 | El almacén de documentos no responde (ALMACEN_NO_DISPONIBLE). Reintentable. |
Estado público del trámite
GET/v1/sites/{key}/leads/{folio}/estado19:tramites:accessRequiere 19:tramites:access (write no implica access). No necesita X-Funnel-Source. Sin aviso de vuelta: consulta con intervalo. Rate limit: 30 por minuto por IP. Nunca trae datos internos del proceso (folios del operador, dictámenes, consultas de crédito, notas).
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
Respuestas
| Status | Cuándo |
|---|---|
| 200 | Estado. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
| 429 | 30 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff. |
| 503 | No se pudo armar la ficha (TRAMITE_NO_DISPONIBLE). Reintentable. |
Expediente de documentos
GET/v1/sites/{key}/leads/{folio}/documents19:tramites:accessRequiere 19:tramites:access y el header X-Funnel-Source: herramienta (sin él: 404). Trae datos de personas (name_check: nombre leído de la INE cuando no coincide con el declarado). Manda siempre el token.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
X-Funnel-Source obligatorio | header |
Respuestas
| Status | Cuándo |
|---|---|
| 200 | Expediente. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|
Lectura de la foto del chip y de la pantalla
GET/v1/sites/{key}/leads/{folio}/identificadores19:tramites:accessRequiere 19:tramites:access y X-Funnel-Source: herramienta. No aplica a herramientas en la práctica: lee iccid_foto y pantalla_foto, que una herramienta no puede subir; siempre responde estado:"sin_foto". Manda siempre el token.
Parámetros
| Nombre | En | Descripción |
|---|---|---|
folio obligatorio | path | Folio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404). |
X-Funnel-Source obligatorio | header |
Respuestas
| Status | Cuándo |
|---|---|
| 200 | Lectura. |
| 401 | Sin token, token inválido o revocado. |
| 403 | Falta 19:tramites:write/access, el token no es de servicio, la ruta no está disponible para herramientas, o el consumidor no está dado de alta (CONSUMIDOR_NO_REGISTRADO) o está suspendido (CONSUMIDOR_SUSPENDIDO). |
| 404 |
|