Actívate con TelcelAPI v0.368.0

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:write

Crea 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)

CampoTipoDescripción
source obligatorio"herramienta"Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta.
referencia_externa obligatoriostringTu 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 obligatorioobjectCó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 obligatoriostringNombre del cliente.
contact_phone obligatoriostringCelular de 10 dígitos (admite +52, 52, 044, 045, 521, espacios y guiones). Diez dígitos iguales o una secuencia trivial se rechazan.
contact_emailstring (email)Un + en cualquier parte se rechaza (EMAIL_PLUS_NO_PERMITIDO).
plan_refstringCampo 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_extendidasobjectObjeto {activar, paperless, esim}, cada llave booleana; activar vale true por omisión.
validacion_previaobjectReferencia de una validación previa de identidad que hizo tu herramienta (request_id y sistema). Evidencia, nunca veredicto.
activacion_automaticaobjectFunció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

StatusCuándo
201Trámite nuevo.
200Repetición idempotente — el mismo folio (resumed:true).
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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.
404key inexistente (SITE_NOT_FOUND).
409Conflicto de referencia o de teléfono (ver error).
422Validación. error es un código estable.
423El sitio tiene el aviso de privacidad pendiente (G0.8_AVISO_PRIVACIDAD_PENDIENTE). No depende de la herramienta.
429Tope diario de altas (TOPE_DIARIO).
500Error 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:write

has_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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Cuerpo (JSON)

CampoTipoDescripció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_keepbooleanfalse ⇒ línea nueva. Cualquier otro valor, incluida la ausencia, conserva número.
current_carrierstringCompañí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_planbooleanSolo con telcel: true ⇒ cambio de plan.
line_msisdnstringNúmero a portar (10 dígitos).
line_ladastringSolo línea nueva; debe existir en el catálogo de LADA.
plan_refstringUn valor inexistente se ignora en silencio.
modalidad"abierta" | "controlada"
orden_prepagoboolean

Respuestas

StatusCuándo
200Etapa aplicada.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

409El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]).
422Validación.
42930 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff.
503El servicio de pedidos no respondió. Reintentable.

Plan y modalidad

PATCH/v1/sites/{key}/leads/{folio}/plan19:tramites:write

plan_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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Cuerpo (JSON)

CampoTipoDescripción
source obligatorio"herramienta"Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta.
plan_refstring
modalidad"abierta" | "controlada"

Ejemplo

{
  "source": "herramienta",
  "plan_ref": "libre-2",
  "modalidad": "controlada"
}

Respuestas

StatusCuándo
200Plan aplicado.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

409El trámite ya fue enviado al operador y el plan no cambia (PLAN_CONGELADO_POR_SISACT).
422PLAN_REF_REQUIRED · MODALIDAD_INVALIDA · PLAN_NOT_FOUND.
42930 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:write

nombre_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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Cuerpo (JSON)

CampoTipoDescripción
source obligatorio"herramienta"Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta.
contact_emailstring (email)Obligatorio si el trámite aún no tiene correo.
nombre_completo obligatorioobject | stringObjeto estructurado, o texto de al menos 3 palabras (el texto no pasa por el filtro de palabras genéricas).
address obligatorioobjectActívate completa estado, municipio y ciudad a partir del CP.
home_phone obligatoriostringTeléfono adicional de 10 dígitos (si mandas más, se queda con los últimos 10), distinto del de contacto. Obligatorio.
geoobjectSolo 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

StatusCuándo
200Datos aplicados (status pasa a submitted).
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

409El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]).
422Validación. field indica el campo cuando aplica.
42930 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:write

Se 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Cuerpo (JSON)

CampoTipoDescripción
source obligatorio"herramienta"Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta.
references obligatorioarray de objectSolo 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

StatusCuándo
200Referencias capturadas.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

409El trámite ya fue enviado al operador y ese dato no cambia (DATOS_CONGELADOS_POR_SISACT, con campos[]).
422Validación. field es references[i].name o references[i].phone.
42930 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:write

Exige 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Cuerpo (JSON)

CampoTipoDescripción
source obligatorio"herramienta"Siempre "herramienta". Con otro valor la ruta se comporta como la del sitio y no es la puerta.
nipstringNIP de portabilidad (4 dígitos; cadena vacía lo borra y no exige INE). Dato de vida corta.
iccidstringCadena 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

StatusCuándo
200Dato aplicado.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

409El trámite ya fue enviado al operador y el dato no cambia (DATOS_CONGELADOS_POR_SISACT, campos:["activacion"]).
422Formato o INE incompleta.
42930 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:write

El 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).
kind obligatoriopathSolo 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 obligatorioheader
X-Adjunto-RefheaderTu referencia para este archivo; hace idempotente la subida del mismo kind.
X-Original-NameheaderNombre 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

StatusCuándo
201Foto recibida.
200Repetición idempotente (mismo X-Adjunto-Ref y mismo kind).
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

410El trámite venció o se perdió (LEAD_EXPIRED).
413Má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

KIND_INVALIDO · KIND_NO_DISPONIBLE · ARCHIVO_VACIO · DOCUMENTO_RECHAZADO (el almacén rechazó el contenido; detail) · DOCUMENTO_MUY_GRANDE (lo dio el almacén) · DOCUMENTO_RECHAZADO_IA (la revisión la rechazó; trae motivo_code, lado_detectado? y data con el expediente ya actualizado).

423El sitio no recibe documentos (ETAPA_DOCUMENTOS_APAGADA).
429DEMASIADOS_DOCUMENTOS (20 por trámite) o RATE_LIMITED (12 por minuto por IP, sin Retry-After).
503El almacén de documentos no responde (ALMACEN_NO_DISPONIBLE). Reintentable.

Estado público del trámite

GET/v1/sites/{key}/leads/{folio}/estado19:tramites:access

Requiere 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).

Respuestas

StatusCuándo
200Estado.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

42930 consultas por minuto por IP (RATE_LIMITED). Sin Retry-After: baja el ritmo y reintenta con backoff.
503No se pudo armar la ficha (TRAMITE_NO_DISPONIBLE). Reintentable.

Expediente de documentos

GET/v1/sites/{key}/leads/{folio}/documents19:tramites:access

Requiere 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).
X-Funnel-Source obligatorioheader

Respuestas

StatusCuándo
200Expediente.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.

Lectura de la foto del chip y de la pantalla

GET/v1/sites/{key}/leads/{folio}/identificadores19:tramites:access

Requiere 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

NombreEnDescripción
folio obligatoriopathFolio del trámite que devolvió el alta (ej. PLN-XXXXXX). Un folio ajeno o inexistente responde igual (404).
X-Funnel-Source obligatorioheader

Respuestas

StatusCuándo
200Lectura.
401

Sin token, token inválido o revocado. error es texto libre, no un código estable: se ramifica por el status (Authorization token required, Invalid or expired token, Service token revocado).

403Falta 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

LEAD_NOT_FOUND. Folio inexistente, de otro dueño, o llamada sin declarar herramienta (source en el cuerpo o X-Funnel-Source). Es idéntico en todos los casos a propósito.