# Validar recibo de CFE Fuente: /cfe/create-cfe-receipt-validation/ El objetivo de esta sección es explicar cómo utilizar el endpoint para **validar un recibo de la Comisión Federal de Electricidad (CFE)** contra el portal oficial, comprobando que el número de servicio, el nombre del titular y el importe correspondan a un recibo realmente emitido. #### **Descripción** La validación es **asíncrona**. Una vez generada la solicitud: - El endpoint responde de inmediato con un `uuid` y el estado `pendiente`. - Se realiza la consulta contra el portal de CFE, un proceso que puede tardar algunos minutos. - Al terminar, el resultado se entrega en la URL que hayas indicado en el parámetro `webhook`, o puedes consultarlo con [Mostrar validación de recibo CFE](/cfe/show-cfe-receipt-validation/). **Método:** POST #### **Endpoint** ``` https://api.verificamex.com/identity/v1/miscellaneous/cfe/recibo ``` > **Nota** > > Recuerda que debes tener un token válido para realizar la solicitud. > Puedes obtener un token siguiendo los pasos descritos en la sección [Generar tokens](/authentication/generate-tokens/). ### **Encabezados de la Solicitud** Para realizar la solicitud es necesario incluir los siguientes encabezados: | Encabezado | Valor | Descripción | | - | - | - | | Accept | `application/json` | Tipo de contenido de la solicitud. | | Content-Type | `application/json` | Formato del cuerpo de la solicitud. | | Authorization | `Bearer {tu_token}` | Token generado para autenticar al usuario. | ### **Cuerpo de la Solicitud** El cuerpo de la solicitud debe contener los siguientes parámetros: | Parámetro | Tipo | Descripción | | - | - | - | | `numero_servicio` | `String` | **Requerido.** Número de servicio tal como aparece en el recibo. Máximo 30 caracteres. | | `nombre_titular` | `String` | **Requerido.** Nombre del titular. Debe coincidir exactamente con el registrado ante CFE. Máximo 255 caracteres. | | importe | `String` | **Requerido.** Importe del recibo, sin signo de moneda ni comas. Ej. `1042`. Máximo 30 caracteres. | | webhook | `String` | *Opcional.* URL a la que se enviará una petición `POST` con el resultado de la validación cuando termine. | > **Los datos deben coincidir exactamente** > > CFE compara el nombre del titular y el importe carácter por carácter contra el recibo emitido. > Una diferencia de acentos, un espacio de más o un importe con decimales cuando el recibo no los tiene > devolverá el estado `DATOS_NO_COINCIDEN`. ### **Ejemplo de Solicitud** **JSON** ```json { "numero_servicio": "123456789012", "nombre_titular": "JUAN PEREZ LOPEZ", "importe": "1042", "webhook": "https://tu-api.com/webhooks/cfe" } ``` **cURL** ```bash curl -X POST https://api.verificamex.com/identity/v1/miscellaneous/cfe/recibo \ -H "Authorization: Bearer {TU_TOKEN}" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "numero_servicio": "123456789012", "nombre_titular": "JUAN PEREZ LOPEZ", "importe": "1042", "webhook": "https://tu-api.com/webhooks/cfe" }' ``` ### Respuesta del Endpoint **status 202** ```json { "uuid": "870c7eee-3604-4995-aa98-bc8fa6aa1112", "status": "pendiente", "created_at": "2026-07-27T10:55:00+00:00" } ``` **status 422** ```json { "message": "The given data was invalid.", "errors": { "numero_servicio": ["The numero servicio field is required."], "webhook": ["El webhook debe ser una URL válida."] } } ``` **status 503** ```json { "uuid": "870c7eee-3604-4995-aa98-bc8fa6aa1112", "status": "ERROR", "message": "Error del proveedor al encolar la validación del recibo CFE 123456789012" } ``` **status 401** ```json { "message": "Unauthorized" } ``` > **Consejo** > > Guarda el `uuid` que devuelve esta respuesta: es la única forma de consultar después el detalle de la validación. *** ### **Estados posibles** El campo `status` refleja en qué punto está la validación: | Estado | Significado | | - | - | | `pendiente` | La consulta fue encolada y aún se está procesando contra el portal de CFE. | | `OK` | CFE completó la consulta y los datos proporcionados coinciden con el recibo emitido. | | `DATOS_NO_COINCIDEN` | CFE completó la consulta, pero alguno de los datos no coincide con el recibo. Revisa `codigo_rechazo`. | | `ERROR` | No fue posible completar la consulta contra CFE. | *** ### **Notificación por Webhook** Si incluiste el parámetro `webhook`, al terminar la validación enviaremos una petición `POST` con cuerpo JSON a esa URL: ```json { "uuid": "870c7eee-3604-4995-aa98-bc8fa6aa1112", "status": "OK", "numero_servicio": "123456789012", "nombre_titular": "JUAN PEREZ LOPEZ", "importe": "1042", "created_at": "2026-07-27T10:55:00+00:00", "updated_at": "2026-07-27T10:56:12+00:00", "result": { "estado": "OK", "verificado": true, "mensaje": "Los datos coinciden con el recibo emitido por CFE", "codigo_rechazo": null, "datos_oficiales": { "titular": "JUAN PEREZ LOPEZ", "domicilio": "CALLE FALSA 123, COL. CENTRO, 06000", "numero_servicio": "123456789012", "periodo": "MAY - JUN 2026", "importe": "1042", "estado_recibo": "PAGADO", "fecha_limite": "2026-07-15" }, "pdf_url": "https://storage.googleapis.com/..." } } ``` > **Tu endpoint debe responder 200** > > Consideramos entregada la notificación únicamente si tu servidor responde con el código HTTP `200`. > Cualquier otro código (incluidos `201` o `204`) se toma como fallo y la notificación se reintenta > hasta 3 veces, una por minuto. Diseña tu lógica de forma idempotente para tolerar reintentos. > **Nota** > > El campo `pdf_url` es una **URL firmada con vigencia de 1 hora**. Descarga el archivo al recibir la > notificación en lugar de almacenar la URL: después de ese plazo deja de ser válida y tendrás que > obtener una nueva desde el endpoint de detalle. Puedes consultar las recomendaciones generales sobre webhooks en la sección [Uso de Webhooks en Verificamex](/webhooks/using-webhooks-in-verificamex/).