# Generar constancia NOM-151 Fuente: /timestamping/create-nom151-constancy/ Este endpoint emite una **constancia de conservación NOM-151** sobre la huella SHA-256 de un documento. La constancia la firma un Prestador de Servicios de Certificación (PSC) autorizado y prueba que el documento existía, íntegro, en la fecha en que se emitió. #### **Descripción** - Solo envías la huella SHA-256 del documento, nunca el archivo. Ver [cómo calcularla](/timestamping/introduction/#1-calcula-la-huella-sha-256). - La respuesta es **síncrona**: la constancia llega en Base64 en el campo `constancia`. - Consume **5 tokens**, solo si la constancia se emite y corresponde a la huella enviada. **Método:** POST #### **Endpoint** ``` https://api.verificamex.com/identity/v1/miscellaneous/nom151/constancia ``` > **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** | 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** | Parámetro | Tipo | Descripción | | - | - | - | | hash | `String` | **Requerido.** Huella SHA-256 del documento: 64 caracteres en hexadecimal o 44 en Base64. | | referencia | `String` | *Opcional.* Referencia propia para identificar el documento, por ejemplo un número de contrato. Máximo 255 caracteres. | ### **Ejemplo de Solicitud** **JSON** ```json { "hash": "de57da9462866cfe28619e9eb9567e6e825c71deacfd84fa0ef33929607db7ef", "referencia": "Contrato 2026-118" } ``` **cURL** ```bash HASH=$(shasum -a 256 contrato.pdf | cut -d' ' -f1) curl -X POST https://api.verificamex.com/identity/v1/miscellaneous/nom151/constancia \ -H "Authorization: Bearer {TU_TOKEN}" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d "{\"hash\": \"$HASH\", \"referencia\": \"Contrato 2026-118\"}" ``` **PowerShell** ```powershell $hash = (Get-FileHash .\contrato.pdf -Algorithm SHA256).Hash $body = @{ hash = $hash; referencia = "Contrato 2026-118" } | ConvertTo-Json $r = Invoke-RestMethod -Method Post ` -Uri "https://api.verificamex.com/identity/v1/miscellaneous/nom151/constancia" ` -Headers @{ Authorization = "Bearer {TU_TOKEN}"; Accept = "application/json" } ` -ContentType "application/json" -Body $body # Guarda la constancia tal como llega [IO.File]::WriteAllBytes("$PWD\constancia.asn1", [Convert]::FromBase64String($r.constancia)) ``` ### Respuesta del Endpoint **status 201** ```json { "uuid": "5b0f8a2e-9d43-4a7e-9c1b-3f2d6e8a1c55", "status": "OK", "referencia": "Contrato 2026-118", "hash": "de57da9462866cfe28619e9eb9567e6e825c71deacfd84fa0ef33929607db7ef", "fecha_constancia": "2026-10-22T18:04:11+00:00", "psc": { "nombre": "Autoridad de Constancias de Conservacion de mensajes de datos de PSC WORLD", "serie": "11c" }, "politica": "2.16.484.101.10.316.100.2.1.2.1.1", "constancia": "MIIJ...", "created_at": "2026-10-22T12:04:10-06:00" } ``` **status 422** ```json { "message": "El hash debe ser un SHA-256: 64 caracteres en hexadecimal o 44 en Base64.", "errors": { "hash": ["El hash debe ser un SHA-256: 64 caracteres en hexadecimal o 44 en Base64."] } } ``` **status 503** ```json { "uuid": "5b0f8a2e-9d43-4a7e-9c1b-3f2d6e8a1c55", "status": "ERROR", "message": "PSC World respondió HTTP 500 al pedir la constancia NOM-151." } ``` **status 417** ```json { "message": "No tokens available", "errors": [] } ``` **status 403** ```json { "message": "Las transacciones del usuario se han terminado" } ``` **status 401** ```json { "message": "Unauthorized" } ``` El cuerpo de la respuesta exitosa contiene los siguientes campos: | Campo | Tipo | Descripción | | - | - | - | | uuid | `String` | Identificador de la constancia. Guárdalo para [consultarla después](/timestamping/show-nom151-constancy/). | | status | `String` | `OK` cuando la constancia se emitió. | | referencia | `String` | La referencia que enviaste, o `null`. | | hash | `String` | La huella sellada, siempre en hexadecimal en minúsculas (aunque la hayas enviado en Base64). | | `fecha_constancia` | `String` | Fecha oficial de la constancia asignada por el PSC, en UTC (ISO-8601). | | `psc.nombre` | `String` | Nombre del PSC que emitió la constancia, tomado de su certificado. | | `psc.serie` | `String` | Número de serie del certificado del PSC, en hexadecimal. Puede variar entre solicitudes, porque el PSC opera con más de un certificado vigente. | | politica | `String` | Identificador (OID) de la política del PSC con la que se emitió. | | constancia | `String` | La constancia en Base64. Decodificada es un archivo `.asn1` (respuesta RFC 3161 completa). | | `created_at` | `String` | Fecha en que se registró la solicitud (ISO-8601). | | Código | Cuándo ocurre | ¿Se cobra? | | - | - | - | | `201` | La constancia se emitió. | Sí, 5 tokens. | | `422` | La huella no es un SHA-256 válido. | No. | | `503` | El PSC no respondió o no emitió una constancia válida. Puedes reintentar. | No. | | `417` | Tienes saldo, pero menos de los 5 tokens que cuesta. | No. | | `403` | Ya no tienes tokens disponibles. | No. | | `401` | Falta el token de autenticación o no es válido. | No. | > **Guarda la constancia sin modificarla** > > Decodifica el campo `constancia` y guarda los bytes tal como llegan: ese archivo es la constancia. > Para comprobar que corresponde a tu documento, sigue los pasos de > [Guarda y verifica el archivo](/timestamping/introduction/#3-guarda-y-verifica-el-archivo).