Saltar al contenido
Notificado

Públicas y webhooks

16 operaciones, cada una con sus parámetros, ejemplos en curl y TypeScript listos para copiar y sus errores.

Las operaciones marcadas /v1 se autentican con un token de agente; las demás, con una sesión del panel. Cómo funcionan ambas está en Autenticación

linkedDownloadInfo

GET/_x/query/linked-download-info

Sin sesiónPermiso: public

linkedDownloadInfo

Parámetros de linkedDownloadInfo
NombreDóndeTipoObligatorio
linkTokenConsultastringSí
recipientTokenConsultastringSí
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/linked-download-info?linkToken=<linkToken>&recipientToken=<recipientToken>'
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/linked-download-info?linkToken=<linkToken>&recipientToken=<recipientToken>');
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publicStatus

GET/_x/query/public-status

Sin sesiónPermiso: publicHerramienta MCP: publicStatus

Public status of notificado.co: status (operational | maintenance | degraded | partial_outage | major_outage), the incidents still open, one entry per America/Bogota day for the last 90 days with the worst impact that day, and every incident in that window with its public updates (Spanish, optional English). Instants are UTC.

Parámetros de publicStatus
NombreDóndeTipoObligatorio
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/public-status'
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/public-status');
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publishedBlogPost

GET/_x/query/published-blog-post

Sin sesiónPermiso: public

publishedBlogPost

Parámetros de publishedBlogPost
NombreDóndeTipoObligatorio
localeConsulta"es-co" | "en"Sí
slugConsultastring 1–70Sí
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/published-blog-post?locale=es-co&slug=<slug>'
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/published-blog-post?locale=es-co&slug=<slug>');
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publishedBlogPosts

GET/_x/query/published-blog-posts

Sin sesiónPermiso: public

publishedBlogPosts

Parámetros de publishedBlogPosts
NombreDóndeTipoObligatorio
beforeConsultastring 1–64No
limitConsultainteger 1–101No
localeConsulta"es-co" | "en"Sí
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/published-blog-posts?locale=es-co'
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/published-blog-posts?locale=es-co');
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

recipientPage

GET/_x/query/recipient-page

Sin sesiónPermiso: public

recipientPage

Parámetros de recipientPage
NombreDóndeTipoObligatorio
recipientTokenConsultastring 1–64Sí
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/recipient-page?recipientToken=<recipientToken>'
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/recipient-page?recipientToken=<recipientToken>');
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

verifyConstancia

GET/v1/verify-constancia

Sin sesiónPermiso: public/v1 · token BearerHerramienta MCP: verifyConstancia

Check a constancia by code or PDF SHA-256: authentic, issuedAt, version, superseded.

Parámetros de verifyConstancia
NombreDóndeTipoObligatorio
captchaTokenConsultastring 0–4096No
cf-turnstile-responseConsultastring 0–4096No
codeConsultastring 1–32No
h-captcha-responseConsultastring 0–4096No
pdfSha256ConsultastringNo
_firstConsultainteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterConsultastringthe nextCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/v1/verify-constancia' \
  -H "authorization: Bearer $NOTIFICADO_TOKEN"
TypeScript
const response = await fetch('https://www.notificado.co/v1/verify-constancia', {
  headers: { authorization: `Bearer ${token}` },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

acknowledgeReceipt

POST/api/acknowledge-receipt

Sin sesiónPermiso: public

acknowledgeReceipt

Parámetros de acknowledgeReceipt
NombreDóndeTipoObligatorio
recipientTokenCuerpostring 1–64Sí
curl
curl -X POST 'https://www.notificado.co/api/acknowledge-receipt' \
  -H 'content-type: application/json' \
  -d '{"recipientToken":"<recipientToken>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/acknowledge-receipt', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "recipientToken": "<recipientToken>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "acknowledgedAt": "<acknowledgedAt>",
  "created": true,
  "eventId": "<eventId>",
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

confirmDataSubjectRequest

POST/api/confirm-data-subject-request

Sin sesiónPermiso: public

confirmDataSubjectRequest

Parámetros de confirmDataSubjectRequest
NombreDóndeTipoObligatorio
referenceCuerpostring 12–12Sí
tokenCuerpostring 16–128Sí
curl
curl -X POST 'https://www.notificado.co/api/confirm-data-subject-request' \
  -H 'content-type: application/json' \
  -d '{"reference":"<reference>","token":"<token>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/confirm-data-subject-request', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "reference": "<reference>",
    "token": "<token>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "reference": "<reference>",
  "verified": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

fileDataSubjectRequest

POST/api/file-data-subject-request

Sin sesiónPermiso: public

fileDataSubjectRequest

Parámetros de fileDataSubjectRequest
NombreDóndeTipoObligatorio
captchaTokenCuerpostring 0–4096No
cf-turnstile-responseCuerpostring 0–4096No
documentNumberCuerpostring 3–40Sí
documentTypeCuerpo"cc" | "ce" | "pasaporte" | "nit" | "otro"Sí
emailCuerpostring (email)Sí
fullNameCuerpostring 2–200Sí
h-captcha-responseCuerpostring 0–4096No
kindCuerpo"consulta" | "reclamo" | "actualizacion" | "supresion"Sí
localeCuerpostring 0–16No
messageCuerpostring 10–5000Sí
phoneCuerpostring 0–40No
relatedToCuerpostring 0–300No
subjectCuerpo"recipient" | "account"Sí
websiteCuerpostring 0–500No
curl
curl -X POST 'https://www.notificado.co/api/file-data-subject-request' \
  -H 'content-type: application/json' \
  -d '{
  "documentNumber": "<documentNumber>",
  "documentType": "cc",
  "email": "<email>",
  "fullName": "<fullName>",
  "kind": "consulta",
  "message": "<message>",
  "subject": "recipient"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/file-data-subject-request', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "documentNumber": "<documentNumber>",
    "documentType": "cc",
    "email": "<email>",
    "fullName": "<fullName>",
    "kind": "consulta",
    "message": "<message>",
    "subject": "recipient"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "dueAt": "2026-09-25T15:00:00Z",
  "mailDelayed": true,
  "reference": "<reference>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

epaycoPayoutsWebhook

POST/api/payouts-webhooks/epayco

Sin sesiónPermiso: public

epaycoPayoutsWebhook

Parámetros de epaycoPayoutsWebhook
NombreDóndeTipoObligatorio
dataCuerpoobjectSí
curl
curl -X POST 'https://www.notificado.co/api/payouts-webhooks/epayco' \
  -H 'content-type: application/json' \
  -d '{"data":{}}'
TypeScript
const response = await fetch('https://www.notificado.co/api/payouts-webhooks/epayco', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "data": {}
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "eventKey": "<eventKey>",
  "outcome": "queued"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

ingestPostmarkEvent

POST/api/postmark-events/ingest

Sin sesiónPermiso: public

ingestPostmarkEvent

Parámetros de ingestPostmarkEvent
NombreDóndeTipoObligatorio
MessageIDCuerpostring 1–200No
RecordTypeCuerpostring 1–60No
curl
curl -X POST 'https://www.notificado.co/api/postmark-events/ingest' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/postmark-events/ingest', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "key": "<key>",
  "outcome": "queued",
  "rawKey": "<rawKey>",
  "receiptKey": "<receiptKey>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

recordDownload

POST/api/record-download

Sin sesiónPermiso: public

recordDownload

Parámetros de recordDownload
NombreDóndeTipoObligatorio
linkTokenCuerpostringSí
recipientTokenCuerpostringSí
curl
curl -X POST 'https://www.notificado.co/api/record-download' \
  -H 'content-type: application/json' \
  -d '{"linkToken":"<linkToken>","recipientToken":"<recipientToken>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/record-download', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "linkToken": "<linkToken>",
    "recipientToken": "<recipientToken>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "eventId": "<eventId>",
  "filename": "<filename>",
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

recordMailClick

POST/api/record-mail-click

Miembro de la firmaPermiso: mailtrack:public-link

recordMailClick

Parámetros de recordMailClick
NombreDóndeTipoObligatorio
idCuerpostring 1–64Sí
nCuerpointeger 1–1000Sí
curl
curl -X POST 'https://www.notificado.co/api/record-mail-click' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"id":"<id>","n":1}'
TypeScript
const response = await fetch('https://www.notificado.co/api/record-mail-click', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "id": "<id>",
    "n": 1
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "location": "<location>",
  "recorded": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

reportAbuse

POST/api/report-abuse

Sin sesiónPermiso: public

reportAbuse

Parámetros de reportAbuse
NombreDóndeTipoObligatorio
detailsCuerpostring 0–2000No
reasonCuerpo"phishing" | "not_expected" | "wrong_recipient" | "harassment" | "other"Sí
recipientTokenCuerpostring 1–64Sí
curl
curl -X POST 'https://www.notificado.co/api/report-abuse' \
  -H 'content-type: application/json' \
  -d '{"reason":"phishing","recipientToken":"<recipientToken>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/report-abuse', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "reason": "phishing",
    "recipientToken": "<recipientToken>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "created": true,
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

trackReferralClick

POST/api/track-referral-click

Sin sesiónPermiso: affiliate:track-click

Record a click on a referral link (the /registro?ref= landing). Anyone may call it; rate-limited, and only hashes are stored.

Parámetros de trackReferralClick
NombreDóndeTipoObligatorio
codeCuerpostring 1–40Sí
landingPathCuerpostring 1–300Sí
curl
curl -X POST 'https://www.notificado.co/api/track-referral-click' \
  -H 'content-type: application/json' \
  -d '{"code":"<code>","landingPath":"<landingPath>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/track-referral-click', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "code": "<code>",
    "landingPath": "<landingPath>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "outcome": "recorded"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds

epaycoWebhook

POST/api/webhooks/epayco

Sin sesiónPermiso: public

epaycoWebhook

Parámetros de epaycoWebhook
NombreDóndeTipoObligatorio
x_ref_paycoCuerpostring 1–40 | numberSí
x_signatureCuerpostring 1–128Sí
curl
curl -X POST 'https://www.notificado.co/api/webhooks/epayco' \
  -H 'content-type: application/json' \
  -d '{"x_ref_payco":"<x_ref_payco>","x_signature":"<x_signature>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/webhooks/epayco', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "x_ref_payco": "<x_ref_payco>",
    "x_signature": "<x_signature>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "eventKey": "<eventKey>",
  "outcome": "queued"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID
  • 429 X_RATE_LIMITED — retry after Retry-After seconds