Skip to content

Public and webhooks

16 operations, each with its parameters, curl and TypeScript examples ready to copy, and its errors.

Operations marked /v1 authenticate with an agent token; the rest, with a panel session. How both work is in Authentication

linkedDownloadInfo

GET/_x/query/linked-download-info

No sessionPermission: public

linkedDownloadInfo

Parameters of linkedDownloadInfo
NameInTypeRequired
linkTokenQuerystringYes
recipientTokenQuerystringYes
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publicStatus

GET/_x/query/public-status

No sessionPermission: publicMCP tool: 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.

Parameters of publicStatus
NameInTypeRequired
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publishedBlogPost

GET/_x/query/published-blog-post

No sessionPermission: public

publishedBlogPost

Parameters of publishedBlogPost
NameInTypeRequired
localeQuery"es-co" | "en"Yes
slugQuerystring 1–70Yes
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

publishedBlogPosts

GET/_x/query/published-blog-posts

No sessionPermission: public

publishedBlogPosts

Parameters of publishedBlogPosts
NameInTypeRequired
beforeQuerystring 1–64No
limitQueryinteger 1–101No
localeQuery"es-co" | "en"Yes
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

recipientPage

GET/_x/query/recipient-page

No sessionPermission: public

recipientPage

Parameters of recipientPage
NameInTypeRequired
recipientTokenQuerystring 1–64Yes
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

verifyConstancia

GET/v1/verify-constancia

No sessionPermission: public/v1 · bearer tokenMCP tool: verifyConstancia

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

Parameters of verifyConstancia
NameInTypeRequired
captchaTokenQuerystring 0–4096No
cf-turnstile-responseQuerystring 0–4096No
codeQuerystring 1–32No
h-captcha-responseQuerystring 0–4096No
pdfSha256QuerystringNo
_firstQueryinteger 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500)No
_afterQuerystringthe 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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

acknowledgeReceipt

POST/api/acknowledge-receipt

No sessionPermission: public

acknowledgeReceipt

Parameters of acknowledgeReceipt
NameInTypeRequired
recipientTokenBodystring 1–64Yes
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();
Example response
200
{
  "acknowledgedAt": "<acknowledgedAt>",
  "created": true,
  "eventId": "<eventId>",
  "ok": true
}

Errors

  • 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

No sessionPermission: public

confirmDataSubjectRequest

Parameters of confirmDataSubjectRequest
NameInTypeRequired
referenceBodystring 12–12Yes
tokenBodystring 16–128Yes
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();
Example response
200
{
  "reference": "<reference>",
  "verified": true
}

Errors

  • 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

No sessionPermission: public

fileDataSubjectRequest

Parameters of fileDataSubjectRequest
NameInTypeRequired
captchaTokenBodystring 0–4096No
cf-turnstile-responseBodystring 0–4096No
documentNumberBodystring 3–40Yes
documentTypeBody"cc" | "ce" | "pasaporte" | "nit" | "otro"Yes
emailBodystring (email)Yes
fullNameBodystring 2–200Yes
h-captcha-responseBodystring 0–4096No
kindBody"consulta" | "reclamo" | "actualizacion" | "supresion"Yes
localeBodystring 0–16No
messageBodystring 10–5000Yes
phoneBodystring 0–40No
relatedToBodystring 0–300No
subjectBody"recipient" | "account"Yes
websiteBodystring 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();
Example response
200
{
  "dueAt": "2026-09-25T15:00:00Z",
  "mailDelayed": true,
  "reference": "<reference>"
}

Errors

  • 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

No sessionPermission: public

epaycoPayoutsWebhook

Parameters of epaycoPayoutsWebhook
NameInTypeRequired
dataBodyobjectYes
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();
Example response
200
{
  "eventKey": "<eventKey>",
  "outcome": "queued"
}

Errors

  • 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

No sessionPermission: public

ingestPostmarkEvent

Parameters of ingestPostmarkEvent
NameInTypeRequired
MessageIDBodystring 1–200No
RecordTypeBodystring 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();
Example response
200
{
  "key": "<key>",
  "outcome": "queued",
  "rawKey": "<rawKey>",
  "receiptKey": "<receiptKey>"
}

Errors

  • 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

No sessionPermission: public

recordDownload

Parameters of recordDownload
NameInTypeRequired
linkTokenBodystringYes
recipientTokenBodystringYes
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();
Example response
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "eventId": "<eventId>",
  "filename": "<filename>",
  "sha256": "<sha256>"
}

Errors

  • 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

Firm memberPermission: mailtrack:public-link

recordMailClick

Parameters of recordMailClick
NameInTypeRequired
idBodystring 1–64Yes
nBodyinteger 1–1000Yes
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();
Example response
200
{
  "location": "<location>",
  "recorded": true
}

Errors

  • 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

No sessionPermission: public

reportAbuse

Parameters of reportAbuse
NameInTypeRequired
detailsBodystring 0–2000No
reasonBody"phishing" | "not_expected" | "wrong_recipient" | "harassment" | "other"Yes
recipientTokenBodystring 1–64Yes
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();
Example response
200
{
  "created": true,
  "ok": true
}

Errors

  • 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

No sessionPermission: 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.

Parameters of trackReferralClick
NameInTypeRequired
codeBodystring 1–40Yes
landingPathBodystring 1–300Yes
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();
Example response
200
{
  "outcome": "recorded"
}

Errors

  • 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

No sessionPermission: public

epaycoWebhook

Parameters of epaycoWebhook
NameInTypeRequired
x_ref_paycoBodystring 1–40 | numberYes
x_signatureBodystring 1–128Yes
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();
Example response
200
{
  "eventKey": "<eventKey>",
  "outcome": "queued"
}

Errors

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