Referencia · API v1

Documentación de la API

Todo lo necesario para integrar el envío de notificaciones certificadas desde tu propio sistema.

Basehttps://notificert.online/v1 AuthBearer token FormatoJSON
01 · Prueba la API

Prueba la API ahora mismo

Genera una API key de prueba al instante, con tu correo. Sirve para 2 llamadas a POST /v1/notifications y expira sola a los 30 minutos — un mismo correo solo puede generar una.

02 · Autenticación

Dos mecanismos, según el endpoint.

Hay dos mecanismos distintos según el endpoint — no todos piden API key. El criterio es quién puede conocer el identificador de la notificación.

Crear y listar

Requiere API key
POST /v1/notifications GET /v1/notifications

Identifica a tu organización — un listado nunca devuelve notificaciones de otra organización.

Consultar por id

Sin API key
GET /v1/notifications/{id}

Y sus sub-recursos (certificado, adjuntos, token TSA). El id de la notificación es un UUID no adivinable que solo conocen quien la creó y quien recibió el certificado/QR — actúa como el token de acceso en sí mismo, igual que la página pública de verificación /verify/{id}.

Para los endpoints que sí la requieren, la API key va así:

Header
# Header (recomendado)
Authorization: Bearer <tu_api_key>

# o como query param
POST https://notificert.online/v1/notifications?api_key=<tu_api_key>

Una key ausente responde 401; una key que no exista en el sistema también responde 401 (no hay fallback silencioso). ¿No tienes una key todavía? Genera una API key de prueba arriba.

03 · Crear notificación

Crear una notificación certificada

POST /v1/notifications Requiere API key

Envía el correo (o lo simula, en modo demo) y arranca la cadena de eventos certificados. Devuelve de inmediato el estado y la URL del certificado.

Curl
curl -X POST https://notificert.online/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <tu_api_key>" \
  -d '{
    "to": "destinatario@ejemplo.cl",
    "subject": "Aviso importante",
    "body_text": "Estimado cliente, le comunicamos que...",
    "body_html": null,
    "sender_name": "Mi Empresa S.A.",
    "sender_email": "notificaciones@miempresa.cl"
  }'
to
string (email), requerido — destinatario.
subject
string, requerido.
body_text
string, requerido — cuerpo en texto plano.
body_html
opcional — cuerpo alternativo en HTML.
sender_name
opcional (default "NotifiCert").
sender_email
opcional — usado como Reply-To.
channel
opcional (default "email").
customer_ref
opcional — tu propio identificador del cliente (ej. RUT), para poder buscar el envío después sin depender del correo.
attachments
opcional — array, ver sección Adjuntos.
variables
opcional — objeto con valores para reemplazar {{variable}} en subject, body_text y en cualquier adjunto que use template_url. Ver Adjuntos.
Header opcional · Idempotency-Key

Cualquier string único que elijas (ej. el id de tu propia orden). Si reintentás la misma llamada — por timeout, sin haber visto la respuesta original — con la misma key, te devuelve la notificación ya creada en vez de generar una segunda certificada duplicada. Las keys son por organización: dos organizaciones distintas pueden repetir la misma key sin chocar entre sí.

Curl
curl -X POST https://notificert.online/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <tu_api_key>" \
  -H "Idempotency-Key: mi-orden-00123" \
  -d '{ "to": "destinatario@ejemplo.cl", "subject": "Aviso importante", "body_text": "..." }'
Respuesta 200
{
  "id": "f3210ad1-59fa-4ead-8a9b-2838df5553d1",
  "status": "sent",
  "content_hash": "f8019b77...",
  "created_at": "2026-07-14T02:18:50.858634",
  "certificate_url": "https://notificert.online/v1/notifications/{id}/certificate",
  "attachments": [
    {
      "id": "9f980ac0-...",
      "filename": "informe.pdf",
      "content_type": "application/pdf",
      "size_bytes": 7136,
      "sha256": "bbf3c642..."
    }
  ]
}
04 · Adjuntos

Base64 o plantilla PDF por URL.

Se guardan con su hash SHA-256 (queda registrado en la cadena de eventos certificada) y se anexan al final del certificado PDF cuando es posible previsualizarlos. Cada adjunto se manda de una de estas dos formas — nunca ambas a la vez:

01

Contenido directo en base64

Curl
curl -X POST https://notificert.online/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <tu_api_key>" \
  -d "{
    \"to\": \"destinatario@ejemplo.cl\",
    \"subject\": \"Informe adjunto\",
    \"body_text\": \"Adjuntamos el informe solicitado.\",
    \"attachments\": [{
      \"filename\": \"informe.pdf\",
      \"content_type\": \"application/pdf\",
      \"content_base64\": \"$(base64 -i informe.pdf)\"
    }]
  }"
02

Plantilla PDF por URL, con variables

En vez de mandar el archivo codificado, le pasas la URL de un PDF que ya tiene {{variable}} escritas en el texto — el mismo motor que usa el envío masivo del portal descarga ese PDF y reemplaza cada variable con los valores de variables (que también se aplican a subject y body_text).

Curl
curl -X POST https://notificert.online/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <tu_api_key>" \
  -d '{
    "to": "destinatario@ejemplo.cl",
    "subject": "Aviso para {{nombre}}",
    "body_text": "Estimado {{nombre}}, su póliza {{poliza}} vence el {{fecha}}.",
    "attachments": [{
      "template_url": "https://tu-servidor.cl/plantilla-poliza.pdf",
      "filename": "aviso-poliza.pdf"
    }],
    "variables": {
      "nombre": "Juan Pérez",
      "poliza": "POL-12345",
      "fecha": "01/08/2026"
    }
  }'
Seguridad

template_url debe ser una URL http/https pública — por seguridad, se rechaza cualquier URL que resuelva a una IP privada, loopback o interna (protección contra SSRF). Límite de tamaño: 10 MB por plantilla descargada.

¿De dónde sale ese PDF con {{variable}}?

No es algo que NotifiCert genere por ti — lo armas tú mismo, en 3 pasos:

01

Escribe el documento en tu editor de siempre (Word, Google Docs, etc.) y donde quieras que vaya un valor dinámico, escribe literalmente el texto {{nombre}}, {{poliza}}, etc. — son marcadores de texto plano, no un campo especial del editor.

02

Exporta ese documento a PDF (el propio "Guardar como PDF" del editor alcanza).

03

Sube ese PDF a donde tú hospedes archivos públicos (tu propio servidor, un bucket de S3/GCS, etc. — NotifiCert no ofrece almacenamiento para esto) y pasa esa URL en template_url.

Antes de integrarlo

Conviene probar la plantilla una vez y revisar el PDF resultante: el reemplazo conserva posición, tamaño y color del texto original, pero no reflowea el párrafo — si un valor es mucho más largo que el token que reemplaza, el texto se ve más chico para que quepa en el mismo ancho, en vez de pasar a la línea siguiente. Funciona mejor con plantillas de fondo blanco y texto plano (sin fuentes personalizadas embebidas). Ver el detalle técnico en template_pdf.py.

filename
opcional (default "adjunto" o "documento.pdf" según el modo).
content_type
opcional (default "application/octet-stream").
content_base64
string — contenido del archivo en base64. Requerido si no usas template_url.
template_url
string (URL) — PDF de plantilla a descargar y personalizar. Requerido si no usas content_base64.
05 · Consultar y listar

Consultar y listar

GET /v1/notifications/{id} Sin API key

Estado actual, metadata, adjuntos y la cadena completa de eventos certificados. No requiere API key — ver Autenticación.

Curl
curl https://notificert.online/v1/notifications/{id}
Respuesta 200
{
  "id": "f3210ad1-59fa-4ead-8a9b-2838df5553d1",
  "status": "delivered",
  "channel": "email",
  "sender_name": "Mi Empresa S.A.",
  "sender_email": "notificaciones@miempresa.cl",
  "recipient_email": "destinatario@ejemplo.cl",
  "customer_ref": "76.123.456-7",
  "subject": "Aviso importante",
  "content_hash": "f8019b77...",
  "created_at": "2026-07-14T02:18:50.858634",
  "certificate_url": "https://notificert.online/v1/notifications/{id}/certificate",
  "tsa": {
    "timestamped_at": "2026-07-14T02:19:03.102000",
    "hash": "a17c0e2b...",
    "token_url": "https://notificert.online/v1/notifications/{id}/tsa-token"
  },
  "attachments": [
    {
      "id": "9f980ac0-...",
      "filename": "informe.pdf",
      "content_type": "application/pdf",
      "size_bytes": 7136,
      "sha256": "bbf3c642...",
      "download_url": "https://notificert.online/v1/notifications/{id}/attachments/9f980ac0-..."
    }
  ],
  "events": [
    { "event_type": "created", "event_data": {"...": "..."}, "event_hash": "0a1b2c...", "created_at": "2026-07-14T02:18:50.900000" },
    { "event_type": "sent", "event_data": {"...": "..."}, "event_hash": "3d4e5f...", "created_at": "2026-07-14T02:18:51.200000" },
    { "event_type": "delivered", "event_data": {"...": "..."}, "event_hash": "6a7b8c...", "created_at": "2026-07-14T02:18:58.400000" }
  ]
}

tsa es null hasta que la cadena llega a un estado terminal (delivered, failed o complained) y se sella. Cada elemento de events es un eslabón de la cadena de hashes — la misma evidencia que muestra el certificado PDF y que recomputa /verify/{id}.

GET /v1/notifications Requiere API key

Lista paginada por cursor (keyset, no por offset numérico), con búsqueda por destinatario y filtro de estado opcionales (el mismo mecanismo que usa el buscador del portal). Requiere API key — solo lista notificaciones de tu organización.

Curl
curl "https://notificert.online/v1/notifications?limit=20&q=destinatario%40ejemplo.cl&status=delivered" \
  -H "Authorization: Bearer <tu_api_key>"
limit
int, opcional (default 20, máximo 100).
cursor
string, opcional — cursor opaco de paginación. Omitilo para la primera página; para pedir la siguiente, pasá el next_cursor que trajo la respuesta anterior. No es un número de página ni un offset — no le asumas ningún formato.
q
string, opcional — coincidencia parcial contra el destinatario o el customer_ref.
status
string, opcional — uno de los valores de la sección Estados.

La respuesta es {"items": [...], "next_cursor": "..."}next_cursor viene en null cuando ya no hay más páginas.

06 · Certificado y adjuntos

Certificado y adjuntos originales

Ningún endpoint de esta sección requiere API key — ver Autenticación.

GET /v1/notifications/{id}/certificate Sin API key

Descarga el certificado PDF (se regenera automáticamente si algún evento cambió desde la última descarga).

Curl
curl https://notificert.online/v1/notifications/{id}/certificate -o certificado.pdf
GET /v1/notifications/{id}/attachments/{attachment_id} Sin API key

Descarga un adjunto original tal como se guardó, para verificar su hash SHA-256 de forma independiente del certificado.

Curl
curl https://notificert.online/v1/notifications/{id}/attachments/{attachment_id} -o adjunto.pdf
shasum -a 256 adjunto.pdf   # debe coincidir con el sha256 devuelto por la API
GET /v1/notifications/{id}/tsa-token Sin API key

Descarga el token de sello de tiempo (RFC 3161) crudo, en formato DER, para verificarlo de forma independiente con herramientas estándar. Es el mismo sello que viaja embebido en el PDF del certificado como firma PAdES, extraído para poder inspeccionarlo por separado. 404 si la notificación todavía no fue sellada (ver tsa en la respuesta de GET /v1/notifications/{id}).

Curl
curl https://notificert.online/v1/notifications/{id}/tsa-token -o token.tsr
openssl ts -reply -in token.tsr -token_in -text   # inspeccionar el sello de tiempo

-token_in es necesario: esto es un TimeStampToken "pelado", no la respuesta completa del protocolo RFC 3161.

GET /verify/{id} HTML público

Página HTML pública (sin autenticación) que recomputa y verifica la cadena de hashes y muestra el registro en formato legible. Es el destino del código QR del certificado — pensada para que la abra cualquier persona, no un desarrollador.

07 · Estados y eventos

Estados y eventos

El estado de una notificación avanza a medida que Postmark confirma cada etapa. No existe un estado "leído/abierto": esa señal proviene de la precarga automática de imágenes de los proveedores de correo, no de una lectura real, así que no se certifica.

queued
Creada, aún no procesada.
sent
Aceptada por el servidor de envío (Postmark).
delivered
Confirmada la entrega al servidor de correo del destinatario.
deferred
Entrega retrasada temporalmente; se reintentará.
failed
Rebote o rechazo permanente.
complained
El destinatario marcó el mensaje como spam.
08 · Errores

Un solo campo: detail.

Todo error se devuelve como JSON con un único campo detail describiendo qué pasó:

Respuesta
{ "detail": "API key inválida" }
400

Datos de entrada inválidos: adjunto malformado, límites de tamaño/cantidad excedidos, template_url inválida o apuntando a un host privado.

401

API key ausente, inválida, o key de prueba vencida/sin usos — solo aplica a POST /v1/notifications y GET /v1/notifications.

404

El id de la notificación, el adjunto, o el certificado/token no existen (o el token TSA aún no se generó).

429

Demasiadas solicitudes desde tu IP a GET /v1/notifications/{id}, /certificate o /attachments/{attachment_id} — ver Límites.

09 · Límites

Límites

Adjuntos por notificación
máx. 10 archivos
Tamaño total de adjuntos
máx. 7 MBDeja margen bajo el tope de 10 MB de Postmark, que se mide después de codificar en base64.
Usos por API key de prueba
2 llamadas · 30 min2 llamadas a POST /v1/notifications, expira a los 30 min.
Generación de keys de prueba
máx. 5 por horaPor IP.
Endpoints públicos por {id}
máx. 60 cada 5 minPor IP — aplica a GET /v1/notifications/{id}, /certificate, /attachments/{attachment_id} y /verify/{id}. No aplica a /tsa-token ni a POST/GET de /v1/notifications (esos solo están limitados por lo que permita tu API key).

Documentación interactiva (Swagger/OpenAPI) disponible en /docs.

Empecemos

Tu primera notificación certificada, en una llamada.

Genera una API key de prueba, haz el POST y descarga el certificado. Sin hablar con ventas.