Saltar al contenido
Notificado

Referencia técnica

Referencia de la API

154 operaciones, generadas desde el documento OpenAPI de Notificado. Cada una tiene su enlace, sus parámetros y ejemplos listos para copiar.

Autenticación

Las rutas HTTP responden con la sesión de un usuario: inicie sesión con el ejemplo de abajo y envíe la cookie guardada en cada llamada (-b cookies.txt).

Las escrituras (POST) hechas fuera del navegador deben indicar el origen con -H 'origin: https://www.notificado.co'; sin él se rechazan con X_CSRF_BLOCKED.

En los ejemplos de TypeScript, sessionCookie es el par nombre=valor de la cookie que devolvió el inicio de sesión.

Los tokens de agente funcionan solo en el servidor MCP, no en estas rutas. Servidor MCP · Guía de autenticación

Las descripciones de cada operación están en inglés: son las que declara el propio sistema, las mismas que leen los asistentes de IA.

curl
curl -c cookies.txt -X POST 'https://www.notificado.co/api/ins/sign' \
  -H 'content-type: application/json' \
  -d '{"email":"<email>","password":"<password>"}'

Inicio de sesión y cuenta

signIn

POST/api/ins/sign

Sin sesiónPermiso: auth:anonymous

signIn

Parámetros de signIn
NombreDóndeTipoObligatorio
codeCuerpostring 0–64No
emailCuerpostring 1–320Sí
nextCuerpostring 0–2048No
passwordCuerpostring 1–1024Sí
curl
curl -X POST 'https://www.notificado.co/api/ins/sign' \
  -H 'content-type: application/json' \
  -d '{"email":"<email>","password":"<password>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/ins/sign', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "email": "<email>",
    "password": "<password>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true,
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

signOut

POST/api/outs/sign

Miembro de la firmaPermiso: auth:sign-out

signOut

curl
curl -X POST 'https://www.notificado.co/api/outs/sign' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/outs/sign', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

requestPasswordReset

POST/api/password-resets/request

Sin sesiónPermiso: auth:anonymous

requestPasswordReset

Parámetros de requestPasswordReset
NombreDóndeTipoObligatorio
captchaTokenCuerpostring 0–4096No
cf-turnstile-responseCuerpostring 0–4096No
emailCuerpostring 0–320Sí
h-captcha-responseCuerpostring 0–4096No
localeCuerpostring 0–16No
curl
curl -X POST 'https://www.notificado.co/api/password-resets/request' \
  -H 'content-type: application/json' \
  -d '{"email":"<email>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/password-resets/request', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "email": "<email>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

resetPassword

POST/api/passwords/reset

Sin sesiónPermiso: auth:anonymous

resetPassword

Parámetros de resetPassword
NombreDóndeTipoObligatorio
passwordCuerpostring 0–1024Sí
passwordConfirmCuerpostring 0–1024No
tokenCuerpostring 0–2048Sí
curl
curl -X POST 'https://www.notificado.co/api/passwords/reset' \
  -H 'content-type: application/json' \
  -d '{"password":"<password>","token":"<token>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/passwords/reset', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "password": "<password>",
    "token": "<token>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

signUp

POST/api/ups/sign

Sin sesiónPermiso: auth:anonymous

signUp

Parámetros de signUp
NombreDóndeTipoObligatorio
captchaTokenCuerpostring 0–4096No
cf-turnstile-responseCuerpostring 0–4096No
emailCuerpostring 1–320Sí
h-captcha-responseCuerpostring 0–4096No
nameCuerpostring 1–200Sí
nextCuerpostring 0–2048No
orgNameCuerpostring 1–200Sí
passwordCuerpostring 1–1024Sí
referralCodeCuerpostring 0–40No
termsVersionCuerpostring 1–64No
curl
curl -X POST 'https://www.notificado.co/api/ups/sign' \
  -H 'content-type: application/json' \
  -d '{
  "email": "<email>",
  "name": "<name>",
  "orgName": "<orgName>",
  "password": "<password>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/ups/sign', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "email": "<email>",
    "name": "<name>",
    "orgName": "<orgName>",
    "password": "<password>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true,
  "orgId": "<orgId>",
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Firma y miembros

memberList

GET/_x/query/member-list

Miembro de la firmaPermiso: org:read

memberList

Parámetros de memberList
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/member-list?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/member-list?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

myMfa

GET/_x/query/my-mfa

Miembro de la firmaPermiso: org:read

myMfa

Parámetros de myMfa
NombreDóndeTipoObligatorio
userIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-mfa?userId=<userId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-mfa?userId=<userId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

myOrgs

GET/_x/query/my-orgs

Miembro de la firmaPermiso: org:read

myOrgs

Parámetros de myOrgs
NombreDóndeTipoObligatorio
userIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-orgs?userId=<userId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-orgs?userId=<userId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

myPreferences

GET/_x/query/my-preferences

Miembro de la firmaPermiso: org:read

myPreferences

Parámetros de myPreferences
NombreDóndeTipoObligatorio
userIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-preferences?userId=<userId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-preferences?userId=<userId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

mySessions

GET/_x/query/my-sessions

Miembro de la firmaPermiso: org:read

mySessions

Parámetros de mySessions
NombreDóndeTipoObligatorio
userIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-sessions?userId=<userId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-sessions?userId=<userId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

pendingInvites

GET/_x/query/pending-invites

Miembro de la firmaPermiso: org:manage

pendingInvites

Parámetros de pendingInvites
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/pending-invites?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/pending-invites?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

seatUsage

GET/_x/query/seat-usage

Miembro de la firmaPermiso: org:read

seatUsage

Parámetros de seatUsage
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/seat-usage?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/seat-usage?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

acceptInvite

POST/api/invites/accept

Miembro de la firmaPermiso: org:accept-invite

acceptInvite

Parámetros de acceptInvite
NombreDóndeTipoObligatorio
tokenCuerpostring 1–2048Sí
curl
curl -X POST 'https://www.notificado.co/api/invites/accept' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"token":"<token>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/invites/accept', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "token": "<token>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "orgId": "<orgId>",
  "redirectTo": "<redirectTo>",
  "role": "<role>",
  "status": "joined"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

revokeInvite

POST/api/invites/revoke

Miembro de la firmaPermiso: org:manage

revokeInvite

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

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

setMemberRole

POST/api/member-roles/set

Miembro de la firmaPermiso: org:manage

setMemberRole

Parámetros de setMemberRole
NombreDóndeTipoObligatorio
roleCuerpo"owner" | "lawyer" | "paralegal" | "billing" | "viewer"Sí
userIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/member-roles/set' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"role":"owner","userId":"<userId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/member-roles/set', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "role": "owner",
    "userId": "<userId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "role": "owner",
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

inviteMember

POST/api/members/invite

Miembro de la firmaPermiso: org:manage

inviteMember

Parámetros de inviteMember
NombreDóndeTipoObligatorio
emailCuerpostring (email) ≤ 320Sí
roleCuerpo"owner" | "lawyer" | "paralegal" | "billing" | "viewer"Sí
curl
curl -X POST 'https://www.notificado.co/api/members/invite' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"email":"<email>","role":"owner"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/members/invite', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "email": "<email>",
    "role": "owner"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "email": "<email>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "role": "<role>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

removeMember

POST/api/members/remove

Miembro de la firmaPermiso: org:manage

removeMember

Parámetros de removeMember
NombreDóndeTipoObligatorio
userIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/members/remove' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"userId":"<userId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/members/remove', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "userId": "<userId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "role": "owner",
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmMfa

POST/api/mfas/confirm

Miembro de la firmaPermiso: org:read

confirmMfa

Parámetros de confirmMfa
NombreDóndeTipoObligatorio
codeCuerpostring 6–8Sí
secretCuerpostring 16–128Sí
curl
curl -X POST 'https://www.notificado.co/api/mfas/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"code":"<code>","secret":"<secret>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/mfas/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "code": "<code>",
    "secret": "<secret>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "recoveryCodes": [
    "<recoveryCodes>"
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

disableMfa

POST/api/mfas/disable

Miembro de la firmaPermiso: org:read

disableMfa

Parámetros de disableMfa
NombreDóndeTipoObligatorio
codeCuerpostring 6–64Sí
passwordCuerpostring 1–1024Sí
curl
curl -X POST 'https://www.notificado.co/api/mfas/disable' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"code":"<code>","password":"<password>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/mfas/disable', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "code": "<code>",
    "password": "<password>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

enrolMfa

POST/api/mfas/enrol

Miembro de la firmaPermiso: org:read

enrolMfa

curl
curl -X POST 'https://www.notificado.co/api/mfas/enrol' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/mfas/enrol', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "secret": "<secret>",
  "uri": "<uri>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

switchOrg

POST/api/orgs/switch

Miembro de la firmaPermiso: org:read

switchOrg

Parámetros de switchOrg
NombreDóndeTipoObligatorio
nextCuerpostring 1–2048No
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/orgs/switch' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/orgs/switch', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "orgId": "<orgId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

revokeOtherSessions

POST/api/other-sessions/revoke

Miembro de la firmaPermiso: org:read

revokeOtherSessions

curl
curl -X POST 'https://www.notificado.co/api/other-sessions/revoke' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/other-sessions/revoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "revoked": 1
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

setPreferences

POST/api/preferences/set

Miembro de la firmaPermiso: org:read

setPreferences

Parámetros de setPreferences
NombreDóndeTipoObligatorio
localeCuerpo"es-co" | "en" | "auto" | nullNo
returnToCuerpostring 1–2048No
themeCuerpo"system" | "light" | "dark"No
curl
curl -X POST 'https://www.notificado.co/api/preferences/set' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/preferences/set', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "locale": "es-co",
  "theme": "system"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

setRequireMfa

POST/api/require-mfas/set

Miembro de la firmaPermiso: org:manage

setRequireMfa

Parámetros de setRequireMfa
NombreDóndeTipoObligatorio
requireMfaCuerpo"on" | "off"Sí
curl
curl -X POST 'https://www.notificado.co/api/require-mfas/set' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"requireMfa":"on"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/require-mfas/set', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "requireMfa": "on"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "requireMfa": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

revokeSession

POST/api/sessions/revoke

Miembro de la firmaPermiso: org:read

revokeSession

Parámetros de revokeSession
NombreDóndeTipoObligatorio
sessionIdCuerpostring 1–64Sí
curl
curl -X POST 'https://www.notificado.co/api/sessions/revoke' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"sessionId":"<sessionId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/sessions/revoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "sessionId": "<sessionId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Verificación del abogado

myKyc

GET/_x/query/my-kyc

Miembro de la firmaPermiso: kyc:submit

myKyc

Parámetros de myKyc
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
userIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-kyc?orgId=<orgId>&userId=<userId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-kyc?orgId=<orgId>&userId=<userId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

submitKyc

POST/api/kycs/submit

Miembro de la firmaPermiso: kyc:submit

submitKyc

Parámetros de submitKyc
NombreDóndeTipoObligatorio
cedulaCuerpostring 5–12Sí
fullNameCuerpostring 1–200Sí
sirnaEmailCuerpostring (email) ≤ 320Sí
tarjetaProfesionalCuerpostring 1–12Sí
vigenciaDocumentIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/kycs/submit' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "cedula": "<cedula>",
  "fullName": "<fullName>",
  "sirnaEmail": "<sirnaEmail>",
  "tarjetaProfesional": "<tarjetaProfesional>",
  "vigenciaDocumentId": "<vigenciaDocumentId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/kycs/submit', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "cedula": "<cedula>",
    "fullName": "<fullName>",
    "sirnaEmail": "<sirnaEmail>",
    "tarjetaProfesional": "<tarjetaProfesional>",
    "vigenciaDocumentId": "<vigenciaDocumentId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "profileId": "<profileId>",
  "resubmitted": true,
  "status": "<status>",
  "warnings": [
    "<warnings>"
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmUpload

POST/api/uploads/confirm

Miembro de la firmaPermiso: or(kyc:submit, case:write)Herramienta MCP: confirmUpload

Step 2 of 2 of an upload, after the PUT to requestUpload's url succeeded: pass the same key, kind, filename and contentType. The server reads back the STORED bytes, checks their real type (PDF, PNG or JPEG) and size, computes the SHA-256 and returns the document (id, sha256, bytes). Use the id with attachDocument. Refused when the PUT never landed or the bytes are not what was granted — re-run requestUpload rather than retrying.

Parámetros de confirmUpload
NombreDóndeTipoObligatorio
contentTypeCuerpostring 1–127Sí
filenameCuerpostring 1–255Sí
keyCuerpostring 1–512Sí
kindCuerpo"certificado_vigencia" | "cedula" | "tarjeta_profesional" | "provenance_proof" | "otro"Sí
curl
curl -X POST 'https://www.notificado.co/api/uploads/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "contentType": "<contentType>",
  "filename": "<filename>",
  "key": "<key>",
  "kind": "certificado_vigencia"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/uploads/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "contentType": "<contentType>",
    "filename": "<filename>",
    "key": "<key>",
    "kind": "certificado_vigencia"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": -9007199254740991,
  "createdAt": "2026-09-25T15:00:00Z",
  "filename": "<filename>",
  "id": "<id>",
  "kind": "certificado_vigencia",
  "mime": "<mime>",
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

requestUpload

POST/api/uploads/request

Miembro de la firmaPermiso: or(kyc:submit, case:write)Herramienta MCP: requestUpload

Step 1 of 2 of an upload: get a signed, single-use PUT grant for ONE file. Pass kind (use "otro" for a notification attachment; certificado_vigencia | cedula | tarjeta_profesional are KYC files; provenance_proof proves where a recipient address came from), filename, contentType (application/pdf | image/png | image/jpeg) and size in bytes (at most 20 MB). Then HTTP PUT the raw bytes to `url` (prefix a path with the server origin) with header Content-Type exactly `contentType`, before `expiresAt` (epoch ms), and call confirmUpload with the returned `key`. Never send file bytes through this tool.

Parámetros de requestUpload
NombreDóndeTipoObligatorio
contentTypeCuerpostring 1–127Sí
filenameCuerpostring 1–255Sí
kindCuerpo"certificado_vigencia" | "cedula" | "tarjeta_profesional" | "provenance_proof" | "otro"Sí
sizeCuerpointeger 0–9007199254740991No
curl
curl -X POST 'https://www.notificado.co/api/uploads/request' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "contentType": "<contentType>",
  "filename": "<filename>",
  "kind": "certificado_vigencia"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/uploads/request', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "contentType": "<contentType>",
    "filename": "<filename>",
    "kind": "certificado_vigencia"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "contentType": "<contentType>",
  "expiresAt": -9007199254740991,
  "key": "<key>",
  "maxBytes": -9007199254740991,
  "method": "PUT",
  "url": "<url>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Procesos y documentos

caseDetail

GET/_x/query/case-detail

Miembro de la firmaPermiso: case:readHerramienta MCP: caseDetail

One case of the caller's firm by caseId (from caseList): 23-digit radicado, juzgado and its email, ciudad, especialidad, clase de proceso, cliente, its parties (role demandante | demandado | apoderado | otro, name, idNumber) and `locked` — true once a notification of it left draft, after which the case can no longer be edited. Returns no row for an id this firm does not have. Read-only.

Parámetros de caseDetail
NombreDóndeTipoObligatorio
caseIdConsultastring (uuid)Sí
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/case-detail?caseId=<caseId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/case-detail?caseId=<caseId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

caseList

GET/_x/query/case-list

Miembro de la firmaPermiso: case:readHerramienta MCP: caseList

The caller's firm's cases (procesos), newest first: id, 23-digit radicado, juzgado, ciudad, especialidad, clase de proceso and cliente. Use the id with caseDetail, or to start a notification on that case.

Parámetros de caseList
NombreDóndeTipoObligatorio
limitConsultainteger 1–200No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/case-list?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/case-list?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

checkAddress

POST/api/address/check

Miembro de la firmaPermiso: case:writeHerramienta MCP: checkAddress

Check an email address BEFORE adding it as a recipient: syntax, disposable (throwaway) domain, role account (info@, notificaciones@), a likely typo of a common provider (gmial.com → gmail.com, returned as `suggestion`), and whether the domain has a mail server (MX lookup, 3 s). Returns verdict ok | warn | block with `reasons`. A `block` address cannot be added or sent to; on `warn`, show the reasons to the lawyer. Each call is recorded as diligence evidence. Read-only for the address itself — it sends nothing.

Parámetros de checkAddress
NombreDóndeTipoObligatorio
emailCuerpostring 1–320Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/address/check' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"email":"<email>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/address/check', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "email": "<email>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checkedAt": "2026-09-25T15:00:00Z",
  "disposable": true,
  "email": "<email>",
  "id": "<id>",
  "mx": "<mx>",
  "reasons": [
    "<reasons>"
  ],
  "roleAccount": true,
  "suggestion": "<suggestion>",
  "syntaxOk": true,
  "verdict": "ok"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

detachAttachment

POST/api/attachments/detach

Miembro de la firmaPermiso: case:write

detachAttachment

Parámetros de detachAttachment
NombreDóndeTipoObligatorio
attachmentIdCuerpostring (uuid)Sí
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/attachments/detach' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "attachmentId": "<attachmentId>",
  "notificationId": "<notificationId>",
  "orgId": "<orgId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/attachments/detach', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "attachmentId": "<attachmentId>",
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": -9007199254740991,
  "filename": "<filename>",
  "id": "<id>",
  "kind": "auto_admisorio",
  "mime": "<mime>",
  "position": -9007199254740991,
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

createCase

POST/api/cases/create

Miembro de la firmaPermiso: case:writeHerramienta MCP: createCase

Create a case (proceso) in the caller's firm. `radicado` is the 23-digit Código Único de Radicación exactly as printed on the auto (dashes/spaces allowed) and is validated for structure; `juzgado` and `juzgadoEmail` are the court's name and buzón as listed in the CSJ directory; `cliente` is the firm's client. Refuses X_CASE_RADICADO_TAKEN when the firm already has that radicado — use the returned case id instead.

Parámetros de createCase
NombreDóndeTipoObligatorio
ciudadCuerpostring 1–120Sí
claseProcesoCuerpostring 1–200Sí
clienteCuerpostring 1–300Sí
especialidadCuerpostring 1–120Sí
juzgadoCuerpostring 1–300Sí
juzgadoEmailCuerpostring (email) ≤ 320Sí
radicadoCuerpostring 23–40Sí
curl
curl -X POST 'https://www.notificado.co/api/cases/create' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "ciudad": "<ciudad>",
  "claseProceso": "<claseProceso>",
  "cliente": "<cliente>",
  "especialidad": "<especialidad>",
  "juzgado": "<juzgado>",
  "juzgadoEmail": "<juzgadoEmail>",
  "radicado": "<radicado>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/cases/create', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "ciudad": "<ciudad>",
    "claseProceso": "<claseProceso>",
    "cliente": "<cliente>",
    "especialidad": "<especialidad>",
    "juzgado": "<juzgado>",
    "juzgadoEmail": "<juzgadoEmail>",
    "radicado": "<radicado>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ciudad": "<ciudad>",
  "claseProceso": "<claseProceso>",
  "cliente": "<cliente>",
  "createdAt": "2026-09-25T15:00:00Z",
  "especialidad": "<especialidad>",
  "id": "<id>",
  "juzgado": "<juzgado>",
  "juzgadoEmail": "<juzgadoEmail>",
  "radicado": "<radicado>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

updateCase

POST/api/cases/update

Miembro de la firmaPermiso: case:writeHerramienta MCP: updateCase

Correct a case of the caller's firm: pass caseId and only the fields to change (radicado — 23 digits, dashes/spaces allowed —, juzgado, juzgadoEmail, ciudad, especialidad, claseProceso, cliente). Refused X_CASE_LOCKED once a notification of the case left draft: what was sent is evidence. Do not use it to register a different proceso — use createCase.

Parámetros de updateCase
NombreDóndeTipoObligatorio
caseIdCuerpostring (uuid)Sí
ciudadCuerpostring 1–120No
claseProcesoCuerpostring 1–200No
clienteCuerpostring 1–300No
especialidadCuerpostring 1–120No
juzgadoCuerpostring 1–300No
juzgadoEmailCuerpostring (email) ≤ 320No
radicadoCuerpostring 23–40No
curl
curl -X POST 'https://www.notificado.co/api/cases/update' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"caseId":"<caseId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/cases/update', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "caseId": "<caseId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ciudad": "<ciudad>",
  "claseProceso": "<claseProceso>",
  "cliente": "<cliente>",
  "createdAt": "2026-09-25T15:00:00Z",
  "especialidad": "<especialidad>",
  "id": "<id>",
  "juzgado": "<juzgado>",
  "juzgadoEmail": "<juzgadoEmail>",
  "radicado": "<radicado>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

attachDocument

POST/api/documents/attach

Miembro de la firmaPermiso: case:writeHerramienta MCP: attachDocument

Attach an already-uploaded document (documentId) to a DRAFT notification, as kind auto_admisorio | demanda | anexo | subsanacion | providencia | otro. The file is copied to immutable evidence storage and its SHA-256 recorded; total attachments must stay under 20 MB. Nothing is sent.

Parámetros de attachDocument
NombreDóndeTipoObligatorio
documentIdCuerpostring (uuid)Sí
kindCuerpo"auto_admisorio" | "demanda" | "anexo" | "subsanacion" | "providencia" | "otro"Sí
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/documents/attach' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "documentId": "<documentId>",
  "kind": "auto_admisorio",
  "notificationId": "<notificationId>",
  "orgId": "<orgId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/documents/attach', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "documentId": "<documentId>",
    "kind": "auto_admisorio",
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": -9007199254740991,
  "filename": "<filename>",
  "id": "<id>",
  "kind": "auto_admisorio",
  "mime": "<mime>",
  "position": -9007199254740991,
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

updateDraft

POST/api/drafts/update

Miembro de la firmaPermiso: case:writeHerramienta MCP: updateDraft

Rewrite a DRAFT art. 8 (Ley 2213) notification: pass orgId, notificationId, template "art8-personal", the providencia name and its date (YYYY-MM-DD), and optionally terminoDias and mensaje — omitting them removes them. The subject and body are recomposed from the template; the deemed-done and term-start sentences always stay. Refused once the notification was sent.

Parámetros de updateDraft
NombreDóndeTipoObligatorio
mensajeCuerpostring 1–5000No
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
providenciaCuerpostring 1–200Sí
providenciaFechaCuerpostringSí
templateCuerpo"art8-personal"Sí
terminoDiasCuerpointeger 1–365No
curl
curl -X POST 'https://www.notificado.co/api/drafts/update' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "notificationId": "<notificationId>",
  "orgId": "<orgId>",
  "providencia": "<providencia>",
  "providenciaFecha": "<providenciaFecha>",
  "template": "art8-personal"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/drafts/update', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "orgId": "<orgId>",
    "providencia": "<providencia>",
    "providenciaFecha": "<providenciaFecha>",
    "template": "art8-personal"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "createdAt": "2026-09-25T15:00:00Z",
  "emlSha256": "<emlSha256>",
  "frozenAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "sentAt": "2026-09-25T15:00:00Z",
  "status": "draft",
  "subject": "<subject>",
  "tier": "standard"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

createNotification

POST/api/notifications/create

Miembro de la firmaPermiso: case:writeHerramienta MCP: createNotification

Create a DRAFT art. 8 (Ley 2213) personal notification on a case: pass orgId, caseId, template "art8-personal", the providencia name and its date (YYYY-MM-DD). The body already states when the notification is deemed done and when terms start. Nothing is sent and no credit is used; add recipients (a lawyer swears each address in the panel) and attach documents next.

Parámetros de createNotification
NombreDóndeTipoObligatorio
caseIdCuerpostring (uuid)Sí
mensajeCuerpostring 1–5000No
orgIdCuerpostring (uuid)Sí
providenciaCuerpostring 1–200Sí
providenciaFechaCuerpostringSí
templateCuerpo"art8-personal"Sí
terminoDiasCuerpointeger 1–365No
curl
curl -X POST 'https://www.notificado.co/api/notifications/create' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "caseId": "<caseId>",
  "orgId": "<orgId>",
  "providencia": "<providencia>",
  "providenciaFecha": "<providenciaFecha>",
  "template": "art8-personal"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/notifications/create', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "caseId": "<caseId>",
    "orgId": "<orgId>",
    "providencia": "<providencia>",
    "providenciaFecha": "<providenciaFecha>",
    "template": "art8-personal"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "createdAt": "2026-09-25T15:00:00Z",
  "emlSha256": "<emlSha256>",
  "frozenAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "sentAt": "2026-09-25T15:00:00Z",
  "status": "draft",
  "subject": "<subject>",
  "tier": "standard"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

addParty

POST/api/parties/add

Miembro de la firmaPermiso: case:writeHerramienta MCP: addParty

Add a party to a case of the caller's firm: caseId, role demandante | demandado | apoderado | otro, the name as written in the demanda, and idNumber (cédula or NIT with its check digit) when known. A party is NOT a recipient: who gets notified, at which address, is sworn by the lawyer in the panel. Refused X_CASE_LOCKED once a notification of the case left draft.

Parámetros de addParty
NombreDóndeTipoObligatorio
caseIdCuerpostring (uuid)Sí
idNumberCuerpostring 1–40No
nameCuerpostring 1–300Sí
roleCuerpo"demandante" | "demandado" | "apoderado" | "otro"Sí
curl
curl -X POST 'https://www.notificado.co/api/parties/add' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"caseId":"<caseId>","name":"<name>","role":"demandante"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/parties/add', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "caseId": "<caseId>",
    "name": "<name>",
    "role": "demandante"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "id": "<id>",
  "idNumber": "<idNumber>",
  "name": "<name>",
  "role": "demandante"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

removeRecipient

POST/api/recipients/remove

Miembro de la firmaPermiso: case:write

removeRecipient

Parámetros de removeRecipient
NombreDóndeTipoObligatorio
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
recipientIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/recipients/remove' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "notificationId": "<notificationId>",
  "orgId": "<orgId>",
  "recipientId": "<recipientId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/recipients/remove', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "orgId": "<orgId>",
    "recipientId": "<recipientId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "email": "<email>",
  "id": "<id>",
  "name": "<name>",
  "notificationId": "<notificationId>",
  "status": "queued"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Notificaciones

bounceAlerts

GET/_x/query/bounce-alerts

Miembro de la firmaPermiso: notification:readHerramienta MCP: bounceAlerts

Recipients whose notification could NOT be delivered (status bounced: the mail server refused it for good) or who marked it as unwanted (complained), newest first, with the case radicado. Without notificationId: only those not yet re-issued to another address. With notificationId: that notification's failed recipients, `switched: true` when already re-issued. Next steps for a bounce: verify the address, re-issue to another sworn address in the panel (switchChannel), or notify by physical means. Read-only.

Parámetros de bounceAlerts
NombreDóndeTipoObligatorio
notificationIdConsultastring (uuid)No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/bounce-alerts?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/bounce-alerts?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

listPendingSends

GET/_x/query/list-pending-sends

Miembro de la firmaPermiso: and(notification:send, notification:send)

listPendingSends

Parámetros de listPendingSends
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/list-pending-sends?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-pending-sends?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

memorialReadiness

GET/_x/query/memorial-readiness

Miembro de la firmaPermiso: memorial:readHerramienta MCP: memorialReadiness

Whether a memorial can be generated now for one notification in your organization. One row: ready, and when not ready the reason — "bounce" (a recipient bounced: NOT notified; re-issue to another address first), "not-delivered" (a recipient server has not accepted the message yet), "constancia-pending" or "term-pending" (still being produced, retry in a minute) — with the X_ code createMemorial would refuse with. Read-only.

Parámetros de memorialReadiness
NombreDóndeTipoObligatorio
notificationIdConsultastring (uuid)Sí
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/memorial-readiness?notificationId=<notificationId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/memorial-readiness?notificationId=<notificationId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationDetail

GET/_x/query/notification-detail

Miembro de la firmaPermiso: notification:readHerramienta MCP: notificationDetail

One notification by id: status, recipients with delivery status and how each address was obtained, attachments with SHA-256, and the evidence timeline (message.frozen, transport.sent, mail.delivery, bounces, downloads, acknowledgements) in chain order with UTC times. Opens are marked indicio (never proof of reading). Read-only.

Parámetros de notificationDetail
NombreDóndeTipoObligatorio
idConsultastring (uuid)Sí
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/notification-detail?id=<id>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/notification-detail?id=<id>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationList

GET/_x/query/notification-list

Miembro de la firmaPermiso: notification:readHerramienta MCP: notificationList

List the org’s notifications, newest first: id, case, status (draft | freezing | frozen | sending | sent | failed), subject, the frozen .eml SHA-256 and UTC timestamps. Read-only.

Parámetros de notificationList
NombreDóndeTipoObligatorio
limitConsultainteger 1–200No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/notification-list?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/notification-list?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationMemorials

GET/_x/query/notification-memorials

Miembro de la firmaPermiso: memorial:readHerramienta MCP: notificationMemorials

The memorials generated for one notification in your organization, newest first: id, createdAt, and the SHA-256 and size of the DOCX and the PDF, plus factsSha256 (the hash of the facts the memorial cites). Poll it after createMemorial until the new memorialId appears (seconds), then fetch the files with downloadMemorial. Read-only.

Parámetros de notificationMemorials
NombreDóndeTipoObligatorio
limitConsultainteger 1–200No
notificationIdConsultastring (uuid)Sí
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/notification-memorials?notificationId=<notificationId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/notification-memorials?notificationId=<notificationId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

sendConfirmationDetail

GET/_x/query/send-confirmation-detail

Miembro de la firmaPermiso: notification:read

sendConfirmationDetail

Parámetros de sendConfirmationDetail
NombreDóndeTipoObligatorio
confirmationIdConsultastring (uuid)Sí
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/send-confirmation-detail?confirmationId=<confirmationId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/send-confirmation-detail?confirmationId=<confirmationId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

switchChannel

POST/api/channels/switch

Miembro de la firmaPermiso: notification:send

switchChannel

Parámetros de switchChannel
NombreDóndeTipoObligatorio
emailCuerpostring 1–320Sí
evidenceDocumentIdsCuerpoarray of string 1–64No
juramentoCuerpoboolean | string 0–8No
nameCuerpostring 0–300No
notificationIdCuerpostring 1–64No
orgIdCuerpostring 1–64Sí
overrideReasonCuerpostring 0–2000 | nullNo
recipientIdCuerpostring 1–64Sí
sourceCuerpostring 1–64Sí
sourceTextCuerpostring 1–2000Sí
curl
curl -X POST 'https://www.notificado.co/api/channels/switch' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "email": "<email>",
  "orgId": "<orgId>",
  "recipientId": "<recipientId>",
  "source": "<source>",
  "sourceText": "<sourceText>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/channels/switch', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "email": "<email>",
    "orgId": "<orgId>",
    "recipientId": "<recipientId>",
    "source": "<source>",
    "sourceText": "<sourceText>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "createdAt": "2026-09-25T15:00:00Z",
  "emlSha256": "<emlSha256>",
  "frozenAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "sentAt": "2026-09-25T15:00:00Z",
  "status": "draft",
  "subject": "<subject>",
  "tier": "standard"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

createMemorial

POST/api/memorials/create

Miembro de la firmaPermiso: memorial:writeHerramienta MCP: createMemorial

Generates the memorial (DOCX + PDF draft, in Spanish) that informs the juzgado that personal notification under art. 8 Ley 2213 de 2022 was practised for one notification in your organization: radicado, juzgado, parties, each recipient with sent/delivered/acknowledged times in America/Bogota, the sworn forma de obtención, the constancia verify code and URL, the computed term dates with their disclaimer and inputsSha256, and the annexes with SHA-256. Returns the memorialId and the render job handle; download the files with downloadMemorial once notificationMemorials lists it (seconds). It is a DRAFT marked [LAWYER REVIEW]: a lawyer must review, sign and file it — nothing is sent to the court. Refused with X_MEMORIAL_BLOCKED_BOUNCE while any recipient bounced, X_MEMORIAL_NOT_DELIVERED before delivery, X_MEMORIAL_CONSTANCIA_PENDING / X_MEMORIAL_TERM_PENDING while those are still being produced.

Parámetros de createMemorial
NombreDóndeTipoObligatorio
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/memorials/create' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"notificationId":"<notificationId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/memorials/create', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "charge": "free",
  "jobId": "<jobId>",
  "memorialId": "<memorialId>",
  "templateId": "<templateId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

downloadMemorial

POST/api/memorials/download

Miembro de la firmaPermiso: memorial:readHerramienta MCP: downloadMemorial

Returns the bytes (base64, with filename, content type and SHA-256) of one generated memorial in your organization, as "docx" (editable, for the lawyer to review and sign) or "pdf" (with the constancia verification QR). The SHA-256 is re-checked against the memorial record before the bytes are served, and every download is recorded in the audit log. Fails X_MEMORIAL_NOT_FOUND for an unknown id or one whose render job has not finished.

Parámetros de downloadMemorial
NombreDóndeTipoObligatorio
formatCuerpo"docx" | "pdf"Sí
memorialIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/memorials/download' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"format":"docx","memorialId":"<memorialId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/memorials/download', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "format": "docx",
    "memorialId": "<memorialId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "format": "docx",
  "memorialId": "<memorialId>",
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

sendNotification

POST/api/notifications/send

Miembro de la firmaPermiso: notification:sendHerramienta MCP: sendNotification

REQUEST the send of a draft notification — REQUIRES HUMAN CONFIRMATION. Over MCP this never sends: it checks the draft is ready (recipients sworn by the lawyer in the panel, at least one attachment, under 20 MB) and returns { status: "awaiting_confirmation", confirmUrl, expiresAt }; hand confirmUrl to the lawyer, who confirms in the panel within 24 hours — only then is one credit per recipient consumed and the exact message frozen, timestamped and emailed. Call it once, with confirm: true, only after showing the lawyer the recipients and attachments. Do NOT call it to test, and do not retry after awaiting_confirmation. Requires an approved lawyer KYC (X_KYC_REQUIRED otherwise).

Parámetros de sendNotification
NombreDóndeTipoObligatorio
confirmCuerpotrueSí
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/notifications/send' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"confirm":true,"notificationId":"<notificationId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/notifications/send', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "confirm": true,
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "createdAt": "2026-09-25T15:00:00Z",
  "emlSha256": "<emlSha256>",
  "frozenAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "sentAt": "2026-09-25T15:00:00Z",
  "status": "draft",
  "subject": "<subject>",
  "tier": "standard"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

addRecipient

POST/api/recipients/add

Miembro de la firmaPermiso: notification:send

addRecipient

Parámetros de addRecipient
NombreDóndeTipoObligatorio
emailCuerpostring (email)Sí
evidenceDocumentIdsCuerpoarray of string (uuid)Sí
juramentoCuerpobooleanSí
nameCuerpostring 1–300Sí
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
overrideReasonCuerpostring 1–2000 | nullNo
sourceCuerpo"comunicaciones_previas" | "camara_de_comercio" | "rut" | "contrato" | "web_oficial" | "otro"Sí
sourceTextCuerpostring 1–2000Sí
curl
curl -X POST 'https://www.notificado.co/api/recipients/add' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "email": "<email>",
  "evidenceDocumentIds": [],
  "juramento": true,
  "name": "<name>",
  "notificationId": "<notificationId>",
  "orgId": "<orgId>",
  "source": "comunicaciones_previas",
  "sourceText": "<sourceText>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/recipients/add', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "email": "<email>",
    "evidenceDocumentIds": [],
    "juramento": true,
    "name": "<name>",
    "notificationId": "<notificationId>",
    "orgId": "<orgId>",
    "source": "comunicaciones_previas",
    "sourceText": "<sourceText>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "email": "<email>",
  "id": "<id>",
  "name": "<name>",
  "notificationId": "<notificationId>",
  "status": "queued"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmSend

POST/api/sends/confirm

Miembro de la firmaPermiso: and(notification:send, notification:send)

confirmSend

Parámetros de confirmSend
NombreDóndeTipoObligatorio
confirmationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
returnToCuerpostring 1–2048No
curl
curl -X POST 'https://www.notificado.co/api/sends/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"confirmationId":"<confirmationId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/sends/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "confirmationId": "<confirmationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "caseId": "<caseId>",
  "createdAt": "2026-09-25T15:00:00Z",
  "emlSha256": "<emlSha256>",
  "frozenAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "sentAt": "2026-09-25T15:00:00Z",
  "status": "draft",
  "subject": "<subject>",
  "tier": "standard"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Evidencia

verifyChain

GET/_x/query/verify-chain

Miembro de la firmaPermiso: evidence:verifyHerramienta MCP: verifyChain

Verify the hash-chained evidence log between two sequence numbers (at most 100000 events) and name the first broken event. Staff only.

Parámetros de verifyChain
NombreDóndeTipoObligatorio
deepConsultabooleanNo
fromSeqConsultainteger 1–9007199254740991Sí
toSeqConsultainteger 1–9007199254740991No
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/verify-chain?fromSeq=1' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/verify-chain?fromSeq=1', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

runChainVerification

POST/api/chain-verifications/run

Miembro de la firmaPermiso: evidence:verifyHerramienta MCP: runChainVerification

Staff only. Verify the hash-chained evidence log between two sequence numbers. Up to 50000 events are verified in the call and answer { ok, checked, firstBroken? }; a longer range (up to 10000000) is queued and answers { enqueued: true, jobId }. deep also re-hashes the raw provider objects. Read-only; every call is audited.

Parámetros de runChainVerification
NombreDóndeTipoObligatorio
confirmTokenCuerpostring 1–200No
deepCuerpobooleanNo
fromSeqCuerpointeger 1–9007199254740991Sí
toSeqCuerpointeger 1–9007199254740991Sí
curl
curl -X POST 'https://www.notificado.co/api/chain-verifications/run' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"fromSeq":1,"toSeq":1}'
TypeScript
const response = await fetch('https://www.notificado.co/api/chain-verifications/run', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "fromSeq": 1,
    "toSeq": 1
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checked": -9007199254740991,
  "deep": true,
  "firstBroken": {
    "id": "<id>",
    "reason": "<reason>",
    "seq": -9007199254740991
  },
  "fromSeq": -9007199254740991,
  "ok": true,
  "toSeq": -9007199254740991
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

reissueConstancia

POST/api/constancias/reissue

Miembro de la firmaPermiso: evidence:read

reissueConstancia

Parámetros de reissueConstancia
NombreDóndeTipoObligatorio
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/constancias/reissue' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"notificationId":"<notificationId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/constancias/reissue', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "queued": true,
  "version": 2
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

downloadEvidence

POST/api/evidences/download

Miembro de la firmaPermiso: evidence:readHerramienta MCP: downloadEvidence

Returns the bytes (base64, with filename, content type and SHA-256) of the signed constancia PDF (kind "constancia") or the offline-verifiable evidence zip (kind "zip") of one notification in your organization; newest version unless "version" is given. Every call is recorded in the audit log and as an evidence.viewed event. Fails X_CONSTANCIA_NOT_FOUND before the first constancia is issued and X_EVIDENCE_ZIP_NOT_READY while the zip is still being built.

Parámetros de downloadEvidence
NombreDóndeTipoObligatorio
kindCuerpo"constancia" | "zip"Sí
notificationIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
versionCuerpointeger 1–9007199254740991No
curl
curl -X POST 'https://www.notificado.co/api/evidences/download' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "kind": "constancia",
  "notificationId": "<notificationId>",
  "orgId": "<orgId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/evidences/download', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "kind": "constancia",
    "notificationId": "<notificationId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "constanciaId": "<constanciaId>",
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "kind": "constancia",
  "sha256": "<sha256>",
  "version": 1
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Plazos

listDeadlines

GET/_x/query/list-deadlines

Miembro de la firmaPermiso: deadline:readHerramienta MCP: listDeadlines

The caller's firm's deadlines (términos) under Ley 2213 art. 8, one row per notification × recipient: surtidaOn (envío + 2 días hábiles), termStartsOn (next día hábil) and termEndsOn (vencimiento, after termDays días hábiles), all YYYY-MM-DD in America/Bogota, skipping weekends, festivos, vacancia judicial and court closures. status 'blocked_bounce' means the recipient bounced: NOT notified, no dates. Filter by caseId, and by vencimiento day with from/to (YYYY-MM-DD, inclusive). Soonest vencimiento first. The dates are an ESTIMATE — always tell the user the judge decides (disclaimerKey), and cite calendarVersion + inputsSha256 when quoting one. Read-only.

Parámetros de listDeadlines
NombreDóndeTipoObligatorio
caseIdConsultastring (uuid)No
fromConsultastringNo
limitConsultainteger 1–500No
orgIdConsultastring (uuid)Sí
toConsultastringNo
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/list-deadlines?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-deadlines?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

setCourtClosure

POST/api/court-closures/set

Miembro de la firmaPermiso: deadline:write

setCourtClosure

Parámetros de setCourtClosure
NombreDóndeTipoObligatorio
courtIdCuerpostringNo
endsOnCuerpostringSí
globalCuerpobooleanNo
kindCuerpo"cierre_extraordinario" | "vacancia_colectiva" | "semana_santa"No
sourceUrlCuerpostring (uri) ≤ 2048No
startsOnCuerpostringSí
curl
curl -X POST 'https://www.notificado.co/api/court-closures/set' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"endsOn":"<endsOn>","startsOn":"<startsOn>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/court-closures/set', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "endsOn": "<endsOn>",
    "startsOn": "<startsOn>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "courtId": "<courtId>",
  "endsOn": "<endsOn>",
  "global": true,
  "id": "<id>",
  "kind": "<kind>",
  "recomputing": -9007199254740991,
  "startsOn": "<startsOn>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Créditos, pagos y facturación

checkoutTerms

GET/_x/query/checkout-terms

Miembro de la firmaPermiso: billing:purchase

checkoutTerms

Parámetros de checkoutTerms
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/checkout-terms?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/checkout-terms?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

creditsBalance

GET/_x/query/credits-balance

Miembro de la firmaPermiso: billing:readHerramienta MCP: creditsBalance

Credits balance of the caller's org: `balance` is how many recipients can still be notified (one credit per recipient, consumed on send), and `nextExpiryAt`/`nextExpiryCredits` say when the soonest batch of credits expires (UTC). Read before sending to more recipients than the balance covers.

Parámetros de creditsBalance
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/credits-balance?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/credits-balance?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

ledgerList

GET/_x/query/ledger-list

Miembro de la firmaPermiso: billing:read

ledgerList

Parámetros de ledgerList
NombreDóndeTipoObligatorio
limitConsultainteger 1–500No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/ledger-list?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/ledger-list?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

listMyInvoices

GET/_x/query/list-my-invoices

Miembro de la firmaPermiso: invoicing:readHerramienta MCP: listMyInvoices

Lists your organization's DIAN electronic invoices, newest first: status (queued, issued, rejected), DIAN number, CUFE, net, discount, IVA and gross amounts in COP minor units (centavos), due date for credit invoices, and whether the PDF / XML is ready for downloadInvoice.

Parámetros de listMyInvoices
NombreDóndeTipoObligatorio
limitConsultainteger 1–200No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/list-my-invoices?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-my-invoices?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

listMyPayments

GET/_x/query/list-my-payments

Miembro de la firmaPermiso: payment:read

listMyPayments

Parámetros de listMyPayments
NombreDóndeTipoObligatorio
limitConsultainteger 1–200No
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/list-my-payments?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-my-payments?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

myBillingProfile

GET/_x/query/my-billing-profile

Miembro de la firmaPermiso: payment:read

myBillingProfile

Parámetros de myBillingProfile
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-billing-profile?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-billing-profile?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

mySubscription

GET/_x/query/my-subscription

Miembro de la firmaPermiso: payment:read

mySubscription

Parámetros de mySubscription
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/my-subscription?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/my-subscription?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

nequiSourceStatus

GET/_x/query/nequi-source-status

Miembro de la firmaPermiso: payment:read

nequiSourceStatus

Parámetros de nequiSourceStatus
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
sourceIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/nequi-source-status?orgId=<orgId>&sourceId=<sourceId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/nequi-source-status?orgId=<orgId>&sourceId=<sourceId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

packOffers

GET/_x/query/pack-offers

Miembro de la firmaPermiso: payment:read

packOffers

Parámetros de packOffers
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/pack-offers?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/pack-offers?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

paymentStatus

GET/_x/query/payment-status

Miembro de la firmaPermiso: payment:read

paymentStatus

Parámetros de paymentStatus
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
paymentIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/payment-status?orgId=<orgId>&paymentId=<paymentId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/payment-status?orgId=<orgId>&paymentId=<paymentId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

planOffers

GET/_x/query/plan-offers

Miembro de la firmaPermiso: payment:read

planOffers

Parámetros de planOffers
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/plan-offers?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/plan-offers?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

requestApproval

POST/api/approvals/request

Miembro de la firmaPermiso: billing:grantHerramienta MCP: requestApproval

Staff only (billing:grant). Files a four-eyes request to grant (credits.grant, needs invoiceRef) or adjust (credits.adjust) more than 100 credits for a customer org. A different staff member must approve it in the console; it then executes by itself. Returns the request.

Parámetros de requestApproval
NombreDóndeTipoObligatorio
creditsCuerpointeger -100000–100000Sí
invoiceRefCuerpostring 1–120No
kindCuerpo"credits.grant" | "credits.adjust"Sí
orgIdCuerpostring (uuid)Sí
packageCodeCuerpostring 1–40No
reasonCuerpostring 1–1000Sí
validDaysCuerpointeger 1–3650No
curl
curl -X POST 'https://www.notificado.co/api/approvals/request' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "credits": -100000,
  "kind": "credits.grant",
  "orgId": "<orgId>",
  "reason": "<reason>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/approvals/request', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "credits": -100000,
    "kind": "credits.grant",
    "orgId": "<orgId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "amount": {
    "currency": "<currency>",
    "minor": -9007199254740991
  },
  "credits": -9007199254740991,
  "decidedAt": "2026-09-25T15:00:00Z",
  "decidedBy": "<decidedBy>",
  "decisionReason": "<decisionReason>",
  "executedRef": "<executedRef>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "failureReason": "<failureReason>",
  "id": "<id>",
  "kind": "<kind>",
  "payload": {},
  "payloadSha256": "<payloadSha256>",
  "reason": "<reason>",
  "requestedAt": "2026-09-25T15:00:00Z",
  "requestedBy": "<requestedBy>",
  "status": "<status>",
  "subjectOrgId": "<subjectOrgId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

saveBillingProfile

POST/api/billing-profiles/save

Miembro de la firmaPermiso: billing:purchase

saveBillingProfile

Parámetros de saveBillingProfile
NombreDóndeTipoObligatorio
addressCuerpostring 1–200Sí
cityCodeCuerpostring 5–5Sí
docNumberCuerpostring 3–20Sí
docTypeCuerpo"CC" | "NIT" | "CE" | "PP"Sí
dvCuerpo"" | string 1–1 | nullSí
emailCuerpostring (email) ≤ 254Sí
fiscalResponsibilitiesCuerpoarray of string 1–12 | "" | string 1–200Sí
legalNameCuerpostring 1–200Sí
orgIdCuerpostring (uuid)Sí
returnToCuerpostring 1–240No
taxRegimeCuerpo"responsable_iva" | "no_responsable_iva" | "simple"Sí
curl
curl -X POST 'https://www.notificado.co/api/billing-profiles/save' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "address": "<address>",
  "cityCode": "<cityCode>",
  "docNumber": "<docNumber>",
  "docType": "CC",
  "dv": "",
  "email": "<email>",
  "fiscalResponsibilities": [],
  "legalName": "<legalName>",
  "orgId": "<orgId>",
  "taxRegime": "responsable_iva"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/billing-profiles/save', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "address": "<address>",
    "cityCode": "<cityCode>",
    "docNumber": "<docNumber>",
    "docType": "CC",
    "dv": "",
    "email": "<email>",
    "fiscalResponsibilities": [],
    "legalName": "<legalName>",
    "orgId": "<orgId>",
    "taxRegime": "responsable_iva"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "address": "<address>",
  "cityCode": "<cityCode>",
  "docNumber": "<docNumber>",
  "docType": "CC",
  "dv": "<dv>",
  "email": "<email>",
  "fiscalResponsibilities": [
    "<fiscalResponsibilities>"
  ],
  "legalName": "<legalName>",
  "taxRegime": "responsable_iva",
  "updatedAt": "2026-09-25T15:00:00Z"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

previewCoupon

POST/api/coupons/preview

Miembro de la firmaPermiso: billing:read

previewCoupon

Parámetros de previewCoupon
NombreDóndeTipoObligatorio
codeCuerpostring 1–40Sí
intervalCuerpo"month" | "year"No
kindCuerpo"pack" | "plan"Sí
orgIdCuerpostring (uuid)Sí
subjectCodeCuerpostring 1–40Sí
curl
curl -X POST 'https://www.notificado.co/api/coupons/preview' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "code": "<code>",
  "kind": "pack",
  "orgId": "<orgId>",
  "subjectCode": "<subjectCode>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/coupons/preview', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "code": "<code>",
    "kind": "pack",
    "orgId": "<orgId>",
    "subjectCode": "<subjectCode>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "coupon": {
    "amountOff": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "appliesTo": "pack",
    "code": "<code>",
    "cycles": -9007199254740991,
    "duration": "once",
    "kind": "percent",
    "percentBps": -9007199254740991,
    "validTo": "2026-09-25T15:00:00Z"
  },
  "discount": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  },
  "gross": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  },
  "iva": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  },
  "net": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adjustCredits

POST/api/credits/adjust

Miembro de la firmaPermiso: billing:grant

adjustCredits

Parámetros de adjustCredits
NombreDóndeTipoObligatorio
deltaCuerpointeger -100000–100000Sí
orgIdCuerpostring (uuid)Sí
reasonCuerpostring 1–120Sí
curl
curl -X POST 'https://www.notificado.co/api/credits/adjust' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"delta":-100000,"orgId":"<orgId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/credits/adjust', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "delta": -100000,
    "orgId": "<orgId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "delta": -9007199254740991,
  "expiresAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "kind": "<kind>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

grantCredits

POST/api/credits/grant

Miembro de la firmaPermiso: billing:grant

grantCredits

Parámetros de grantCredits
NombreDóndeTipoObligatorio
creditsCuerpointeger -9007199254740991–9007199254740991 | string 0–12Sí
invoiceRefCuerpostring 1–120Sí
orgIdCuerpostring 1–64Sí
packageCodeCuerpostring 0–40No
validDaysCuerpointeger -9007199254740991–9007199254740991 | string 0–12No
curl
curl -X POST 'https://www.notificado.co/api/credits/grant' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "credits": -9007199254740991,
  "invoiceRef": "<invoiceRef>",
  "orgId": "<orgId>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/credits/grant', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "credits": -9007199254740991,
    "invoiceRef": "<invoiceRef>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "delta": -9007199254740991,
  "expiresAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "kind": "<kind>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

payCycle

POST/api/cycles/pay

Miembro de la firmaPermiso: billing:purchase

payCycle

Parámetros de payCycle
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
cycleIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
overageCuerpobooleanNo
curl
curl -X POST 'https://www.notificado.co/api/cycles/pay' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"cycleId":"<cycleId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/cycles/pay', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "cycleId": "<cycleId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checkout": {
    "action": "<action>",
    "fields": {},
    "method": "GET"
  },
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

downloadInvoice

POST/api/invoices/download

Miembro de la firmaPermiso: invoicing:readHerramienta MCP: downloadInvoice

Returns the bytes (base64, with filename, content type and SHA-256) of the PDF or XML of one DIAN electronic invoice of your organization (format "pdf" or "xml"), or of one of its credit notes when creditNoteId is given. Every call is recorded in the audit log. Fails X_INVOICE_FILE_NOT_READY while the document is not issued yet (listMyInvoices shows its status).

Parámetros de downloadInvoice
NombreDóndeTipoObligatorio
creditNoteIdCuerpostring (uuid)No
formatCuerpo"pdf" | "xml"Sí
invoiceIdCuerpostring (uuid)Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/invoices/download' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"format":"pdf","invoiceId":"<invoiceId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/invoices/download', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "format": "pdf",
    "invoiceId": "<invoiceId>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "format": "pdf",
  "number": "<number>",
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

startPackCheckout

POST/api/pack-checkouts/start

Miembro de la firmaPermiso: billing:purchase

startPackCheckout

Parámetros de startPackCheckout
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
billingProfileCuerpoobjectNo
captchaTokenCuerpostring 0–4096No
cf-turnstile-responseCuerpostring 0–4096No
couponCodeCuerpostring 1–40No
h-captcha-responseCuerpostring 0–4096No
methodCuerpoobject | object | object | objectNo
orgIdCuerpostring (uuid)Sí
packCodeCuerpostring 1–40Sí
payerNameCuerpostring 1–200No
payerPhoneCuerpostring 10–15No
termsCuerpoobjectNo
curl
curl -X POST 'https://www.notificado.co/api/pack-checkouts/start' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","packCode":"<packCode>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/pack-checkouts/start', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "packCode": "<packCode>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "asyncPaymentUrl": "<asyncPaymentUrl>",
  "checkout": {
    "action": "<action>",
    "fields": {},
    "method": "GET"
  },
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  },
  "transactionId": "<transactionId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

confirmPaymentReturn

POST/api/payment-returns/confirm

Miembro de la firmaPermiso: billing:purchase

confirmPaymentReturn

Parámetros de confirmPaymentReturn
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
transactionIdCuerpostring 1–64Sí
curl
curl -X POST 'https://www.notificado.co/api/payment-returns/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","transactionId":"<transactionId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/payment-returns/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "transactionId": "<transactionId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "asyncPaymentUrl": "<asyncPaymentUrl>",
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

registerPaymentSource

POST/api/payment-sources/register

Miembro de la firmaPermiso: billing:purchase

registerPaymentSource

Parámetros de registerPaymentSource
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
orgIdCuerpostring (uuid)Sí
sourceCuerpoobject | objectSí
termsCuerpoobjectSí
useForSubscriptionCuerpobooleanNo
curl
curl -X POST 'https://www.notificado.co/api/payment-sources/register' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "orgId": "<orgId>",
  "source": {
    "token": "<token>",
    "type": "CARD"
  },
  "terms": {
    "acceptanceToken": "<acceptanceToken>",
    "personalDataToken": "<personalDataToken>"
  }
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/payment-sources/register', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "source": {
      "token": "<token>",
      "type": "CARD"
    },
    "terms": {
      "acceptanceToken": "<acceptanceToken>",
      "personalDataToken": "<personalDataToken>"
    }
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "id": "<id>",
  "label": "<label>",
  "status": "<status>",
  "type": "<type>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

refreshPayment

POST/api/payments/refresh

Miembro de la firmaPermiso: billing:purchase

refreshPayment

Parámetros de refreshPayment
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
paymentIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/payments/refresh' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","paymentId":"<paymentId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/payments/refresh', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "paymentId": "<paymentId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "asyncPaymentUrl": "<asyncPaymentUrl>",
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

changePlan

POST/api/plans/change

Miembro de la firmaPermiso: billing:purchase

changePlan

Parámetros de changePlan
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
intervalCuerpo"month" | "year"No
orgIdCuerpostring (uuid)Sí
planCodeCuerpostring 1–40Sí
curl
curl -X POST 'https://www.notificado.co/api/plans/change' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","planCode":"<planCode>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/plans/change', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "planCode": "<planCode>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "change": "upgraded",
  "checkout": {
    "action": "<action>",
    "fields": {},
    "method": "GET"
  },
  "effectiveAt": "2026-09-25T15:00:00Z",
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

subscribe

POST/api/subscribes/invoke

Miembro de la firmaPermiso: billing:purchase

subscribe

Parámetros de subscribe
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
billingProfileCuerpoobjectNo
collectionCuerpo"auto" | "link"Sí
couponCodeCuerpostring 1–40No
intervalCuerpo"month" | "year"Sí
orgIdCuerpostring (uuid)Sí
paymentSourceIdCuerpostring (uuid)No
planCodeCuerpostring 1–40Sí
curl
curl -X POST 'https://www.notificado.co/api/subscribes/invoke' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "collection": "auto",
  "interval": "month",
  "orgId": "<orgId>",
  "planCode": "<planCode>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/subscribes/invoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "collection": "auto",
    "interval": "month",
    "orgId": "<orgId>",
    "planCode": "<planCode>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checkout": {
    "action": "<action>",
    "fields": {},
    "method": "GET"
  },
  "cycle": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "attempts": -9007199254740991,
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "nextAttemptAt": "2026-09-25T15:00:00Z",
    "periodEnd": "2026-09-25T15:00:00Z",
    "periodStart": "2026-09-25T15:00:00Z",
    "status": "due",
    "subscriptionId": "<subscriptionId>"
  },
  "payment": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "createdAt": "2026-09-25T15:00:00Z",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991,
      "scale": 0
    },
    "id": "<id>",
    "method": "CARD",
    "purpose": "pack",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  },
  "subscription": {
    "cancelAtPeriodEnd": true,
    "collection": "auto",
    "currentPeriodEnd": "2026-09-25T15:00:00Z",
    "currentPeriodStart": "2026-09-25T15:00:00Z",
    "endedAt": "2026-09-25T15:00:00Z",
    "freeCyclesPending": -9007199254740991,
    "id": "<id>",
    "interval": "month",
    "planId": "<planId>",
    "status": "trialing"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

cancelSubscription

POST/api/subscriptions/cancel

Miembro de la firmaPermiso: billing:purchase

cancelSubscription

Parámetros de cancelSubscription
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/subscriptions/cancel' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/subscriptions/cancel', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "cancelAtPeriodEnd": true,
  "collection": "auto",
  "currentPeriodEnd": "2026-09-25T15:00:00Z",
  "currentPeriodStart": "2026-09-25T15:00:00Z",
  "endedAt": "2026-09-25T15:00:00Z",
  "freeCyclesPending": -9007199254740991,
  "id": "<id>",
  "interval": "month",
  "planId": "<planId>",
  "status": "trialing"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

resumeSubscription

POST/api/subscriptions/resume

Miembro de la firmaPermiso: billing:purchase

resumeSubscription

Parámetros de resumeSubscription
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/subscriptions/resume' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/subscriptions/resume', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "cancelAtPeriodEnd": true,
  "collection": "auto",
  "currentPeriodEnd": "2026-09-25T15:00:00Z",
  "currentPeriodStart": "2026-09-25T15:00:00Z",
  "endedAt": "2026-09-25T15:00:00Z",
  "freeCyclesPending": -9007199254740991,
  "id": "<id>",
  "interval": "month",
  "planId": "<planId>",
  "status": "trialing"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Tokens de agente

issueAgentToken

POST/api/agent-tokens/issue

Miembro de la firmaPermiso: api-access:write

issueAgentToken

Parámetros de issueAgentToken
NombreDóndeTipoObligatorio
nameCuerpostring 1–100Sí
orgIdCuerpostring (uuid)Sí
scopesCuerpoarray of string 1–40give between 1 and 10 scopesSí
ttlDaysCuerpo30 | 90 | 365 | nullSí
curl
curl -X POST 'https://www.notificado.co/api/agent-tokens/issue' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"name":"<name>","orgId":"<orgId>","scopes":[],"ttlDays":30}'
TypeScript
const response = await fetch('https://www.notificado.co/api/agent-tokens/issue', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "name": "<name>",
    "orgId": "<orgId>",
    "scopes": [],
    "ttlDays": 30
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "summary": {
    "createdAt": "2026-09-25T15:00:00Z",
    "createdAtBogota": "<createdAtBogota>",
    "expiresAt": "2026-09-25T15:00:00Z",
    "expiresAtBogota": "<expiresAtBogota>",
    "id": "<id>",
    "lastUsedAt": "2026-09-25T15:00:00Z",
    "lastUsedAtBogota": "<lastUsedAtBogota>",
    "name": "<name>",
    "prefix": "<prefix>",
    "revokedAt": "2026-09-25T15:00:00Z",
    "revokedAtBogota": "<revokedAtBogota>",
    "scopes": [
      "cases:read"
    ],
    "status": "active",
    "userId": "<userId>"
  },
  "token": "<token>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listAgentTokens

POST/api/agent-tokens/list

Miembro de la firmaPermiso: api-access:read

listAgentTokens

Parámetros de listAgentTokens
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/agent-tokens/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/agent-tokens/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "tokens": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdAtBogota": "<createdAtBogota>",
      "expiresAt": "2026-09-25T15:00:00Z",
      "expiresAtBogota": "<expiresAtBogota>",
      "id": "<id>",
      "lastUsedAt": "2026-09-25T15:00:00Z",
      "lastUsedAtBogota": "<lastUsedAtBogota>",
      "name": "<name>",
      "prefix": "<prefix>",
      "revokedAt": "2026-09-25T15:00:00Z",
      "revokedAtBogota": "<revokedAtBogota>",
      "scopes": [
        "cases:read"
      ],
      "status": "active",
      "userId": "<userId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

revokeAgentToken

POST/api/agent-tokens/revoke

Miembro de la firmaPermiso: api-access:write

revokeAgentToken

Parámetros de revokeAgentToken
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
tokenIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/agent-tokens/revoke' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","tokenId":"<tokenId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/agent-tokens/revoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "tokenId": "<tokenId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "createdAtBogota": "<createdAtBogota>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "expiresAtBogota": "<expiresAtBogota>",
  "id": "<id>",
  "lastUsedAt": "2026-09-25T15:00:00Z",
  "lastUsedAtBogota": "<lastUsedAtBogota>",
  "name": "<name>",
  "prefix": "<prefix>",
  "revokedAt": "2026-09-25T15:00:00Z",
  "revokedAtBogota": "<revokedAtBogota>",
  "scopes": [
    "cases:read"
  ],
  "status": "active",
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

Públicas y webhooks

recipientPage

GET/_x/query/recipient-page

Sin sesiónPermiso: public

recipientPage

Parámetros de recipientPage
NombreDóndeTipoObligatorio
recipientTokenConsultastring 1–64Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor 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/_x/query/verify-constancia

Sin sesiónPermiso: publicHerramienta MCP: verifyConstancia

Public check of a Notificado constancia: pass the verification code printed under its QR ("code") or the SHA-256 of the PDF file ("pdfSha256"). Returns one row: authentic, issuedAt (UTC and Bogotá), delivery status, the signed PDF's SHA-256, version, latestVersion and superseded. Never returns message content or recipient data; an unknown code or hash returns authentic=false with every other field null.

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

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

recordDownload

POST/api/downloads/record

Sin sesiónPermiso: public

recordDownload

Parámetros de recordDownload
NombreDóndeTipoObligatorio
linkTokenCuerpostringSí
recipientTokenCuerpostringSí
curl
curl -X POST 'https://www.notificado.co/api/downloads/record' \
  -H 'content-type: application/json' \
  -d '{"linkToken":"<linkToken>","recipientToken":"<recipientToken>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/downloads/record', {
  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

health

POST/api/healths/invoke

Sin sesiónPermiso: publicHerramienta MCP: health

Readiness of this process

curl
curl -X POST 'https://www.notificado.co/api/healths/invoke' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/healths/invoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "ok": true,
  "role": "<role>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

ingestInboundReply

POST/api/inbound-replies/ingest

Sin sesiónPermiso: public

ingestInboundReply

curl
curl -X POST 'https://www.notificado.co/api/inbound-replies/ingest' \
  -H 'content-type: application/json' \
  -d '"<body>"'
TypeScript
const response = await fetch('https://www.notificado.co/api/inbound-replies/ingest', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify("<body>"),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "messageId": "<messageId>",
  "outcome": "<outcome>",
  "type": "<type>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

recordPixel

POST/api/pixels/record

Sin sesiónPermiso: public

recordPixel

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

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

acknowledgeReceipt

POST/api/receipts/acknowledge

Sin sesiónPermiso: public

acknowledgeReceipt

Parámetros de acknowledgeReceipt
NombreDóndeTipoObligatorio
recipientTokenCuerpostring 1–64Sí
curl
curl -X POST 'https://www.notificado.co/api/receipts/acknowledge' \
  -H 'content-type: application/json' \
  -d '{"recipientToken":"<recipientToken>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/receipts/acknowledge', {
  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

ingestSesEvent

POST/api/ses-events/ingest

Sin sesiónPermiso: public

ingestSesEvent

curl
curl -X POST 'https://www.notificado.co/api/ses-events/ingest' \
  -H 'content-type: application/json' \
  -d '"<body>"'
TypeScript
const response = await fetch('https://www.notificado.co/api/ses-events/ingest', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify("<body>"),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "messageId": "<messageId>",
  "outcome": "<outcome>",
  "type": "<type>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

wompiWebhook

POST/api/webhooks/wompi

Sin sesiónPermiso: public

wompiWebhook

Parámetros de wompiWebhook
NombreDóndeTipoObligatorio
environmentCuerpostring 1–20No
eventCuerpostring 1–80Sí
sent_atCuerpostring 1–40No
curl
curl -X POST 'https://www.notificado.co/api/webhooks/wompi' \
  -H 'content-type: application/json' \
  -d '{"event":"<event>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/webhooks/wompi', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    "event": "<event>"
  }),
});
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

Consola interna

Estas operaciones son de la consola interna de Notificado: responden solo al personal autorizado y rechazan a cualquier cliente.

abuseOverview

GET/_x/query/abuse-overview

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: abuseOverview

Staff only. Sending-abuse controls: every org's suspensions (active first; automatic = paused by complaint-watch pending review), org-specific sender limits (recipients per rolling hour/day), the per-plan defaults, and — with orgId — that org's active suspension, history, effective limit and usage in the last hour and 24 h. Org names and counts only.

Parámetros de abuseOverview
NombreDóndeTipoObligatorio
orgIdConsultastring (uuid)No
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/abuse-overview' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/abuse-overview', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

billingKpis

GET/_x/query/billing-kpis

Solo personal de NotificadoPermiso: admin:kpi:readHerramienta MCP: billingKpis

Staff only. Billing figures, no personal data, for payments created in [from, to): per payment method and status the count and the gross, net (after discount), discount and IVA sums in COP minor units (centavos); totals of payments ever approved; refunds recorded in the window; and the DIAN invoices and credit notes queued (pending manual issue) or rejected right now.

Parámetros de billingKpis
NombreDóndeTipoObligatorio
fromConsultastring (date-time)Sí
toConsultastring (date-time)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/billing-kpis?from=2026-09-25T15:00:00Z&to=2026-09-25T15:00:00Z' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/billing-kpis?from=2026-09-25T15:00:00Z&to=2026-09-25T15:00:00Z', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

catalogSnapshot

GET/_x/query/catalog-snapshot

Solo personal de NotificadoPermiso: admin:config:readHerramienta MCP: catalogSnapshot

Staff only. The sales catalog and provider configuration, read-only, no personal data: active credit packs (sends, price in COP minor units, validity days), plans with the prices in force per interval, coupons that still validate (with redeemed and reserved counts), and env flags — name, set, the non-secret value of each provider selector and what the app built from it (effective, or the X_* error code refusing it). Secrets are never listed; ADMIN_ALLOWED_IPS only says whether it is set.

Parámetros de catalogSnapshot
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/catalog-snapshot' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/catalog-snapshot', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

deliverability

GET/_x/query/deliverability

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: deliverability

Staff only. Email deliverability for events recorded in [from, to), no personal data: per America/Bogota day and per recipient domain (domains with fewer than 3 distinct addresses are grouped as "(other)") the sends, deliveries, hard and soft bounces, complaints and deferrals with rates in percent; the customer orgs with the most bounces (org id, name and counts only); and the SES account standing (production access, sending enabled, 24 h quota and usage). Window at most 92 days.

Parámetros de deliverability
NombreDóndeTipoObligatorio
fromConsultastring (date-time)Sí
toConsultastring (date-time)Sí
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/deliverability?from=2026-09-25T15:00:00Z&to=2026-09-25T15:00:00Z' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/deliverability?from=2026-09-25T15:00:00Z&to=2026-09-25T15:00:00Z', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

evidenceHealth

GET/_x/query/evidence-health

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: evidenceHealth

Staff only. Evidence system health, no personal data: the last 14 daily anchors (Bogotá days; missing days listed; which timestamp authorities stamped each Merkle root), per-authority stamped/missed anchors plus tokens issued and stamp failures over the window, the last nightly evidence-chain verification verdict (ok, events checked, first broken seq), the latest NTP clock sample per host against the 100 ms threshold, and the mail transport account status (productionAccess false = SES sandbox: only verified recipients receive mail; 24 h quota and sent; errorCode when the provider could not be asked).

Parámetros de evidenceHealth
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/evidence-health' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/evidence-health', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

jobQueues

GET/_x/query/job-queues

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: jobQueues

Staff only. The background job queues, no personal data: per queue ready, delayed, running, suspended and dead counts plus oldestReadyMs; the last 50 dead letters (jobId, name, attempts, errorCode — never the input); every scheduled task with cron, time zone and nextRunAt (UTC); missing lists what this process cannot report (no driver, no introspection). Requeue a dead letter with requeueJob({ jobId }).

Parámetros de jobQueues
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/job-queues' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/job-queues', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

opsAlerts

GET/_x/query/ops-alerts

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: opsAlerts

Staff only. The conditions operations must act on, most severe first: tsa_failures (timestamp authority failures in 24 h), anchor_missed (no daily Merkle anchor for the last due Bogotá day), clock_offset (NTP offset past 100 ms), chain_verify_failed and staff_audit_chain_broken (a nightly hash-chain verification failed), ses_sending_paused, ses_sandbox, ses_quota_high, bounce_rate_high (> 5 %) and complaint_rate_high (> 0.1 %) over 24 h. Each row: code, severity (info | warn | critical), since (UTC), href (console page), value (the figure). No personal data.

Parámetros de opsAlerts
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/ops-alerts' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/ops-alerts', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

opsOverview

GET/_x/query/ops-overview

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: opsOverview

Staff only. Operations counts, no personal data: lawyers pending KYC, four-eyes approvals pending, notifications and recipients created in the last 24 h by outcome (sent, failed, delivered, bounced, complained), and the job backlog.

Parámetros de opsOverview
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/ops-overview' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/ops-overview', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

pendingStaffConfirmations

GET/_x/query/pending-staff-confirmations

Solo personal de NotificadoPermiso: admin:tokens:self

pendingStaffConfirmations

Parámetros de pendingStaffConfirmations
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/pending-staff-confirmations' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/pending-staff-confirmations', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

providerHealth

GET/_x/query/provider-health

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: providerHealth

Staff only. Liveness of every configured provider, no personal data: each timestamp authority, the PDF signer, the mail transport, the evidence and uploads storage disks, the payment gateway, the e-invoice provider and captcha — each { kind, id, ok, latencyMs, checkedAt, detail } where detail.code names why a provider is down. Probes are read-only (nothing is stamped, signed, sent or charged) and the answer is cached for 60 s.

Parámetros de providerHealth
NombreDóndeTipoObligatorio
_firstConsultainteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterConsultastringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/provider-health' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/provider-health', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Ejemplo de respuesta
200
[
  null
]

Errores

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

decideApproval

POST/api/approvals/decide

Solo personal de NotificadoPermiso: admin:approvals:decide

decideApproval

Parámetros de decideApproval
NombreDóndeTipoObligatorio
codeCuerpostring 1–64No
decisionCuerpo"approve" | "reject"Sí
idCuerpostring (uuid)Sí
reasonCuerpostring 1–1000No
curl
curl -X POST 'https://www.notificado.co/api/approvals/decide' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"decision":"approve","id":"<id>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/approvals/decide', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "decision": "approve",
    "id": "<id>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "amount": {
    "currency": "<currency>",
    "minor": -9007199254740991
  },
  "credits": -9007199254740991,
  "decidedAt": "2026-09-25T15:00:00Z",
  "decidedBy": "<decidedBy>",
  "decisionReason": "<decisionReason>",
  "executedRef": "<executedRef>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "failureReason": "<failureReason>",
  "id": "<id>",
  "kind": "<kind>",
  "payload": {},
  "payloadSha256": "<payloadSha256>",
  "reason": "<reason>",
  "requestedAt": "2026-09-25T15:00:00Z",
  "requestedBy": "<requestedBy>",
  "status": "<status>",
  "subjectOrgId": "<subjectOrgId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listApprovals

POST/api/approvals/list

Solo personal de NotificadoPermiso: admin:approvals:readHerramienta MCP: listApprovals

Staff only. Four-eyes approval requests (credit grants/adjustments above 100 credits). Default: pending, oldest first; pass status for history (newest first). Every call is audited. A second staff member decides each with decideApproval in the console.

Parámetros de listApprovals
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
limitCuerpointeger 1–200No
statusCuerpo"pending" | "approved" | "rejected" | "executed" | "failed" | "expired"No
subjectOrgIdCuerpostring (uuid)No
curl
curl -X POST 'https://www.notificado.co/api/approvals/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/approvals/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "amount": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "credits": -9007199254740991,
      "decidedAt": "2026-09-25T15:00:00Z",
      "decidedBy": "<decidedBy>",
      "decisionReason": "<decisionReason>",
      "executedRef": "<executedRef>",
      "expiresAt": "2026-09-25T15:00:00Z",
      "failureReason": "<failureReason>",
      "id": "<id>",
      "kind": "<kind>",
      "payload": {},
      "payloadSha256": "<payloadSha256>",
      "reason": "<reason>",
      "requestedAt": "2026-09-25T15:00:00Z",
      "requestedBy": "<requestedBy>",
      "status": "<status>",
      "subjectOrgId": "<subjectOrgId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminArchiveCoupon

POST/api/archive-coupons/admin

Solo personal de NotificadoPermiso: admin:coupons:writeHerramienta MCP: adminArchiveCoupon

Staff only (admin:coupons:write). Archives a coupon by id (from adminListCoupons): new previews and checkouts refuse it; redemptions already made keep it. Idempotent. Recorded in the audit trail.

Parámetros de adminArchiveCoupon
NombreDóndeTipoObligatorio
couponIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/archive-coupons/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"couponId":"<couponId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/archive-coupons/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "couponId": "<couponId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "affiliateId": "<affiliateId>",
  "amountOff": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  },
  "appliesTo": "pack",
  "archivedAt": "2026-09-25T15:00:00Z",
  "campaign": "<campaign>",
  "code": "<code>",
  "createdAt": "2026-09-25T15:00:00Z",
  "createdBy": "<createdBy>",
  "cycles": -9007199254740991,
  "duration": "once",
  "firstPurchaseOnly": true,
  "id": "<id>",
  "kind": "percent",
  "maxRedemptions": -9007199254740991,
  "percentBps": -9007199254740991,
  "validFrom": "2026-09-25T15:00:00Z",
  "validTo": "2026-09-25T15:00:00Z"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

viewAsOrg

POST/api/as-orgs/view

Solo personal de NotificadoPermiso: admin:customer-data:readHerramienta MCP: viewAsOrg

Staff only. A read-only snapshot of what one customer org's panel shows: the org, spendable credit balance and next expiry, KYC banner state, the 5 most recent notifications and cases. Read as a viewer of that org (no session, no writes possible). Needs a purpose (5+ characters). Every call is audited.

Parámetros de viewAsOrg
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500Sí
curl
curl -X POST 'https://www.notificado.co/api/as-orgs/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","purpose":"<purpose>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/as-orgs/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "purpose": "<purpose>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "balance": -9007199254740991,
  "cases": [
    {
      "cliente": "<cliente>",
      "createdAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "juzgado": "<juzgado>",
      "radicado": "<radicado>"
    }
  ],
  "kycBanner": "<kycBanner>",
  "nextExpiry": {
    "at": "2026-09-25T15:00:00Z",
    "credits": -9007199254740991
  },
  "org": {
    "createdAt": "2026-09-25T15:00:00Z",
    "id": "<id>",
    "kind": "<kind>",
    "name": "<name>"
  },
  "recentNotifications": [
    {
      "caseId": "<caseId>",
      "createdAt": "<createdAt>",
      "id": "<id>",
      "sentAt": "<sentAt>",
      "status": "<status>",
      "subject": "<subject>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

exportAudit

POST/api/audits/export

Solo personal de NotificadoPermiso: admin:audit:exportHerramienta MCP: exportAudit

Staff only (superadmin, compliance). The staff-access audit trail for Bogotá days from..to (YYYY-MM-DD, both inclusive) as a CSV file: base64 bytes, filename and SHA-256. Oldest first; columns seq, at_utc, at_bogota, actor, action, outcome, subject, purpose, diff, prev_hash, hash. Optional filters actorId, subjectOrgId, subjectType/subjectId, outcome. At most 10000 rows — past that X_ADMIN_AUDIT_EXPORT_TOO_LARGE: split the range. This export is itself audited.

Parámetros de exportAudit
NombreDóndeTipoObligatorio
actorIdCuerpostring 1–120No
fromCuerpostring 1–10Sí
outcomeCuerpo"allowed" | "denied" | "failed"No
subjectIdCuerpostring 1–120No
subjectOrgIdCuerpostring (uuid)No
subjectTypeCuerpostring 1–64No
toCuerpostring 1–10Sí
curl
curl -X POST 'https://www.notificado.co/api/audits/export' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"from":"<from>","to":"<to>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/audits/export', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "from": "<from>",
    "to": "<to>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "rows": 0,
  "sha256": "<sha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listAudit

POST/api/audits/list

Solo personal de NotificadoPermiso: admin:audit:readHerramienta MCP: listAudit

Staff only (superadmin, compliance). The staff-access audit trail: every staff read of customer data and every refusal on a staff surface, newest first. Filter by actorId, subjectOrgId, subjectType/subjectId, outcome (allowed|denied|failed), from/to (UTC). Page with cursor. This read is itself audited.

Parámetros de listAudit
NombreDóndeTipoObligatorio
actorIdCuerpostring 1–120No
cursorCuerpostring 1–24No
fromCuerpostring (date-time)No
limitCuerpointeger 1–500No
outcomeCuerpo"allowed" | "denied" | "failed"No
subjectIdCuerpostring 1–120No
subjectOrgIdCuerpostring (uuid)No
subjectTypeCuerpostring 1–64No
toCuerpostring (date-time)No
curl
curl -X POST 'https://www.notificado.co/api/audits/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/audits/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "action": "<action>",
      "actorId": "<actorId>",
      "actorRole": "<actorRole>",
      "at": "2026-09-25T15:00:00Z",
      "hash": "<hash>",
      "id": "<id>",
      "ip": "<ip>",
      "orgId": "<orgId>",
      "outcome": "<outcome>",
      "permission": "<permission>",
      "purpose": "<purpose>",
      "reason": "<reason>",
      "requestId": "<requestId>",
      "seq": "<seq>",
      "subjectId": "<subjectId>",
      "subjectOrgId": "<subjectOrgId>",
      "subjectType": "<subjectType>",
      "surface": "<surface>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminCreateCoupon

POST/api/create-coupons/admin

Solo personal de NotificadoPermiso: admin:coupons:writeHerramienta MCP: adminCreateCoupon

Staff only (admin:coupons:write). Creates a coupon: code (3–40 of A-Z 0-9 _ -, stored upper-case, never reused — X_PROMO_COUPON_CODE_TAKEN otherwise), kind percent (percentBps 1..10000) or fixed (amountOff in COP minor units, whole pesos), appliesTo pack | subscription | any, duration once | cycles (with cycles) | forever, optional firstPurchaseOnly, maxRedemptions across orgs, UTC validFrom/validTo and a campaign tag. The discount comes off the net before IVA. Recorded in the audit trail.

Parámetros de adminCreateCoupon
NombreDóndeTipoObligatorio
Idempotency-KeyConsultastring ≤ 255Replays the first response for a repeated key.No
amountOffCuerpoobjectinteger minor units plus an ISO 4217 currency codeNo
appliesToCuerpo"pack" | "subscription" | "any"Sí
campaignCuerpostring 1–80No
codeCuerpostring 3–40Sí
cyclesCuerpointeger 1–120No
durationCuerpo"once" | "cycles" | "forever"Sí
firstPurchaseOnlyCuerpobooleanNo
kindCuerpo"percent" | "fixed"Sí
maxRedemptionsCuerpointeger 1–9007199254740991No
percentBpsCuerpointeger 1–10000No
validFromCuerpostring (date-time)No
validToCuerpostring (date-time)No
curl
curl -X POST 'https://www.notificado.co/api/create-coupons/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"appliesTo":"pack","code":"<code>","duration":"once","kind":"percent"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/create-coupons/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "appliesTo": "pack",
    "code": "<code>",
    "duration": "once",
    "kind": "percent"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "affiliateId": "<affiliateId>",
  "amountOff": {
    "currency": "<currency>",
    "minor": -9007199254740991,
    "scale": 0
  },
  "appliesTo": "pack",
  "archivedAt": "2026-09-25T15:00:00Z",
  "campaign": "<campaign>",
  "code": "<code>",
  "createdAt": "2026-09-25T15:00:00Z",
  "createdBy": "<createdBy>",
  "cycles": -9007199254740991,
  "duration": "once",
  "firstPurchaseOnly": true,
  "id": "<id>",
  "kind": "percent",
  "maxRedemptions": -9007199254740991,
  "percentBps": -9007199254740991,
  "validFrom": "2026-09-25T15:00:00Z",
  "validTo": "2026-09-25T15:00:00Z"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 409 X_IDEMPOTENCY_CONFLICT
  • 422 X_BODY_INVALID

viewCustomer360

POST/api/customer360s/view

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: viewCustomer360

Staff only. The customer 360 of one org: members (email, role, second factor), lawyer KYC (cédula masked), credit balance and the last 20 ledger rows, notifications by status, subscription and plan, payments and DIAN invoices in summary, recipients sent in the last 30 days with bounce and complaint rates, active suspension and sender limit with usage, deadline (term) counts, affiliate attribution, and the newest staff support notes. Needs a purpose (5+ characters). Every call is audited.

Parámetros de viewCustomer360
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500Sí
curl
curl -X POST 'https://www.notificado.co/api/customer360s/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","purpose":"<purpose>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/customer360s/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "purpose": "<purpose>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "attribution": {
    "boundAt": "2026-09-25T15:00:00Z",
    "kind": "<kind>",
    "via": "<via>",
    "voided": true,
    "windowEndsAt": "2026-09-25T15:00:00Z"
  },
  "balance": -9007199254740991,
  "deadlines": {
    "blockedByBounce": -9007199254740991,
    "endingThisWeek": -9007199254740991,
    "total": -9007199254740991
  },
  "delivery": {
    "bounceRate": 1,
    "bounced": -9007199254740991,
    "complained": -9007199254740991,
    "complaintRate": 1,
    "deferred": -9007199254740991,
    "delivered": -9007199254740991,
    "sent": -9007199254740991,
    "since": "2026-09-25T15:00:00Z"
  },
  "invoices": {
    "byStatus": {},
    "recent": [
      {
        "createdAt": "2026-09-25T15:00:00Z",
        "gross": {
          "currency": null,
          "minor": null
        },
        "invoiceId": "<invoiceId>",
        "issuedAt": "2026-09-25T15:00:00Z",
        "kind": "<kind>",
        "number": "<number>",
        "status": "<status>"
      }
    ]
  },
  "kycState": "<kycState>",
  "lawyers": [
    {
      "cedulaMasked": "<cedulaMasked>",
      "fullName": "<fullName>",
      "profileId": "<profileId>",
      "status": "<status>",
      "submittedAt": "2026-09-25T15:00:00Z",
      "userId": "<userId>",
      "vigenciaDocumentId": "<vigenciaDocumentId>"
    }
  ],
  "members": [
    {
      "email": "<email>",
      "joinedAt": "2026-09-25T15:00:00Z",
      "mfaEnrolled": true,
      "role": "<role>",
      "userId": "<userId>"
    }
  ],
  "notificationsByStatus": {},
  "org": {
    "createdAt": "2026-09-25T15:00:00Z",
    "id": "<id>",
    "kind": "<kind>",
    "name": "<name>"
  },
  "paymentSources": -9007199254740991,
  "payments": {
    "approvedGross": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "byStatus": {},
    "lastApprovedAt": "2026-09-25T15:00:00Z",
    "recent": [
      {
        "createdAt": "2026-09-25T15:00:00Z",
        "gross": {
          "currency": null,
          "minor": null
        },
        "method": "<method>",
        "paymentId": "<paymentId>",
        "purpose": "<purpose>",
        "reference": "<reference>",
        "status": "<status>"
      }
    ]
  },
  "pendingApprovals": -9007199254740991,
  "recentLedger": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdBy": "<createdBy>",
      "delta": -9007199254740991,
      "expiresAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "invoiceRef": "<invoiceRef>",
      "kind": "<kind>",
      "packageId": "<packageId>",
      "recipientId": "<recipientId>"
    }
  ],
  "senderLimit": {
    "perDay": -9007199254740991,
    "perHour": -9007199254740991,
    "planCode": "<planCode>",
    "reason": "<reason>",
    "source": "<source>"
  },
  "subscription": {
    "cancelAtPeriodEnd": true,
    "collection": "<collection>",
    "currentPeriodEnd": "2026-09-25T15:00:00Z",
    "cycleGross": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "cycleStatus": "<cycleStatus>",
    "interval": "<interval>",
    "overageCount": -9007199254740991,
    "planCode": "<planCode>",
    "sends": -9007199254740991,
    "status": "<status>"
  },
  "supportNotes": {
    "recent": [
      {
        "authorId": "<authorId>",
        "authorRole": "<authorRole>",
        "body": "<body>",
        "createdAt": "2026-09-25T15:00:00Z",
        "id": "<id>",
        "orgId": "<orgId>"
      }
    ],
    "total": -9007199254740991
  },
  "suspension": {
    "automatic": true,
    "reason": "<reason>",
    "suspendedAt": "2026-09-25T15:00:00Z",
    "suspendedBy": "<suspendedBy>"
  },
  "usage": {
    "lastDay": -9007199254740991,
    "lastHour": -9007199254740991
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminDownloadGatewayEvent

POST/api/download-gateway-events/admin

Solo personal de NotificadoPermiso: admin:payments:readHerramienta MCP: adminDownloadGatewayEvent

Staff only (admin:payments:read). Returns the stored body of one payment gateway delivery (eventId from adminPaymentDetail) as base64 bytes with its SHA-256, size, verified flag and received-at. Read-only. Every call is recorded in the staff audit trail.

Parámetros de adminDownloadGatewayEvent
NombreDóndeTipoObligatorio
eventIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500No
curl
curl -X POST 'https://www.notificado.co/api/download-gateway-events/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"eventId":"<eventId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/download-gateway-events/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "eventId": "<eventId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "eventId": "<eventId>",
  "filename": "<filename>",
  "rawIsReserialized": true,
  "receivedAt": "2026-09-25T15:00:00Z",
  "sha256": "<sha256>",
  "verified": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminExportEvidenceZip

POST/api/export-evidence-zips/admin

Solo personal de NotificadoPermiso: admin:evidence:exportHerramienta MCP: adminExportEvidenceZip

Staff only. The offline-verifiable evidence zip of any org's notification, as base64 bytes with filename and SHA-256 (verified against the stored digest in this call); newest version unless version is given. Needs a purpose (5+ characters). Recorded on the staff trail, in the firm's audit log and as an evidence.viewed event. X_EVIDENCE_ZIP_NOT_READY while the zip is being built (it is queued) — ask again shortly.

Parámetros de adminExportEvidenceZip
NombreDóndeTipoObligatorio
confirmTokenCuerpostring 1–200No
notificationIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500Sí
versionCuerpointeger 1–9007199254740991No
curl
curl -X POST 'https://www.notificado.co/api/export-evidence-zips/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"notificationId":"<notificationId>","purpose":"<purpose>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/export-evidence-zips/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "purpose": "<purpose>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": 0,
  "constanciaId": "<constanciaId>",
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "kind": "zip",
  "orgId": "<orgId>",
  "sha256": "<sha256>",
  "version": 1
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

cancelJob

POST/api/jobs/cancel

Solo personal de NotificadoPermiso: admin:jobs:write

cancelJob

Parámetros de cancelJob
NombreDóndeTipoObligatorio
confirmCuerpostring 1–220Sí
jobIdCuerpostring 1–200Sí
reasonCuerpostring 1–500No
curl
curl -X POST 'https://www.notificado.co/api/jobs/cancel' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"confirm":"<confirm>","jobId":"<jobId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/jobs/cancel', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "confirm": "<confirm>",
    "jobId": "<jobId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "attempt": -9007199254740991,
  "id": "<id>",
  "maxAttempts": -9007199254740991,
  "name": "<name>",
  "queue": "<queue>",
  "runAt": "2026-09-25T15:00:00Z",
  "state": "<state>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

requeueJob

POST/api/jobs/requeue

Solo personal de NotificadoPermiso: admin:jobs:writeHerramienta MCP: requeueJob

Staff only (ops, superadmin). Requeue one finished job — dead, cancelled or done — by jobId (from jobQueues), optionally fromStep. A running or waiting job is refused. Through MCP the call waits for your human to confirm it in /admin/mcp. Audited.

Parámetros de requeueJob
NombreDóndeTipoObligatorio
fromStepCuerpostring 1–200No
jobIdCuerpostring 1–200Sí
curl
curl -X POST 'https://www.notificado.co/api/jobs/requeue' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"jobId":"<jobId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/jobs/requeue', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "jobId": "<jobId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "attempt": -9007199254740991,
  "id": "<id>",
  "maxAttempts": -9007199254740991,
  "name": "<name>",
  "queue": "<queue>",
  "runAt": "2026-09-25T15:00:00Z",
  "state": "<state>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

viewKycDocument

POST/api/kyc-documents/view

Solo personal de NotificadoPermiso: kyc:review

viewKycDocument

Parámetros de viewKycDocument
NombreDóndeTipoObligatorio
profileIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500Sí
curl
curl -X POST 'https://www.notificado.co/api/kyc-documents/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"profileId":"<profileId>","purpose":"<purpose>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/kyc-documents/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "profileId": "<profileId>",
    "purpose": "<purpose>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "documentId": "<documentId>",
  "filename": "<filename>",
  "intact": true,
  "orgId": "<orgId>",
  "profileId": "<profileId>",
  "sha256": "<sha256>",
  "sha256Now": "<sha256Now>",
  "size": -9007199254740991
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listKycQueue

POST/api/kyc-queues/list

Solo personal de NotificadoPermiso: kyc:reviewHerramienta MCP: listKycQueue

Staff only. The lawyers waiting for KYC review across every firm, oldest first: name, cédula, tarjeta profesional, SIRNA email, the firm name, and the uploaded certificado de vigencia (id, SHA-256, type). Every call is audited. Decide each with approveKyc or rejectKyc.

Parámetros de listKycQueue
NombreDóndeTipoObligatorio
limitCuerpointeger 1–200No
curl
curl -X POST 'https://www.notificado.co/api/kyc-queues/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/kyc-queues/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
[
  {
    "cedula": "<cedula>",
    "fullName": "<fullName>",
    "orgId": "<orgId>",
    "orgName": "<orgName>",
    "profileId": "<profileId>",
    "sirnaEmail": "<sirnaEmail>",
    "submittedAt": "2026-09-25T15:00:00Z",
    "tarjetaProfesional": "<tarjetaProfesional>",
    "userId": "<userId>",
    "vigenciaDocumentId": "<vigenciaDocumentId>",
    "vigenciaDocumentSha256": "<vigenciaDocumentSha256>",
    "vigenciaDocumentType": "<vigenciaDocumentType>",
    "warnings": [
      "<warnings>"
    ]
  }
]

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

approveKyc

POST/api/kycs/approve

Solo personal de NotificadoPermiso: kyc:reviewHerramienta MCP: approveKyc

Staff only. Approve a pending lawyer KYC after checking the certificado de vigencia against the CSJ: records the decision with its reason, grants the firm its one-time trial credits and mails the lawyer. Pass orgId and profileId exactly as listKycQueue returned them.

Parámetros de approveKyc
NombreDóndeTipoObligatorio
documentIdCuerpostring (uuid)No
orgIdCuerpostring (uuid)Sí
profileIdCuerpostring (uuid)Sí
reasonCuerpostring 1–2000Sí
curl
curl -X POST 'https://www.notificado.co/api/kycs/approve' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","profileId":"<profileId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/kycs/approve', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "profileId": "<profileId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checkId": "<checkId>",
  "profileId": "<profileId>",
  "status": "<status>",
  "trial": {
    "credits": -9007199254740991,
    "expiresAt": "2026-09-25T15:00:00Z"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

rejectKyc

POST/api/kycs/reject

Solo personal de NotificadoPermiso: kyc:reviewHerramienta MCP: rejectKyc

Staff only. Reject a pending lawyer KYC (for example an expired or unreadable certificado de vigencia). The reason is mailed to the lawyer verbatim, so write it for them. Pass orgId and profileId exactly as listKycQueue returned them.

Parámetros de rejectKyc
NombreDóndeTipoObligatorio
documentIdCuerpostring (uuid)No
orgIdCuerpostring (uuid)Sí
profileIdCuerpostring (uuid)Sí
reasonCuerpostring 1–2000Sí
curl
curl -X POST 'https://www.notificado.co/api/kycs/reject' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","profileId":"<profileId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/kycs/reject', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "profileId": "<profileId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "checkId": "<checkId>",
  "profileId": "<profileId>",
  "status": "<status>",
  "trial": {
    "credits": -9007199254740991,
    "expiresAt": "2026-09-25T15:00:00Z"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

staffLedgerList

POST/api/ledger-lists/staff

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: staffLedgerList

Staff only. One customer org's credit ledger (grants, trial, consumption, refunds, adjustments, expiries), newest first; page with cursor. Every call is audited.

Parámetros de staffLedgerList
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
limitCuerpointeger 1–200No
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/ledger-lists/staff' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/ledger-lists/staff', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdBy": "<createdBy>",
      "delta": -9007199254740991,
      "expiresAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "invoiceRef": "<invoiceRef>",
      "kind": "<kind>",
      "packageId": "<packageId>",
      "recipientId": "<recipientId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminListCoupons

POST/api/list-coupons/admin

Solo personal de NotificadoPermiso: admin:coupons:readHerramienta MCP: adminListCoupons

Staff only (admin:coupons:read). Lists coupons newest first: code, percent (basis points) or fixed amount (COP minor units), what it applies to (pack | subscription | any), duration (once | cycles | forever), first-purchase-only, max redemptions, UTC validity window, campaign tag, archived instant, and live redemption counts (reserved by open checkouts, committed by approved payments). Archived coupons only with includeArchived: true; filter by campaign.

Parámetros de adminListCoupons
NombreDóndeTipoObligatorio
campaignCuerpostring 1–80No
includeArchivedCuerpobooleanNo
limitCuerpointeger 1–500No
curl
curl -X POST 'https://www.notificado.co/api/list-coupons/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/list-coupons/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "rows": [
    {
      "committed": -9007199254740991,
      "coupon": {
        "affiliateId": "<affiliateId>",
        "amountOff": {
          "currency": null,
          "minor": null,
          "scale": null
        },
        "appliesTo": "pack",
        "archivedAt": "2026-09-25T15:00:00Z",
        "campaign": "<campaign>",
        "code": "<code>",
        "createdAt": "2026-09-25T15:00:00Z",
        "createdBy": "<createdBy>",
        "cycles": -9007199254740991,
        "duration": "once",
        "firstPurchaseOnly": true,
        "id": "<id>",
        "kind": "percent",
        "maxRedemptions": -9007199254740991,
        "percentBps": -9007199254740991,
        "validFrom": "2026-09-25T15:00:00Z",
        "validTo": "2026-09-25T15:00:00Z"
      },
      "reserved": -9007199254740991
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminListPayments

POST/api/list-payments/admin

Solo personal de NotificadoPermiso: admin:payments:readHerramienta MCP: adminListPayments

Staff only (admin:payments:read). Lists payments across every customer org, newest first: org, gateway reference, status, method, gross in COP minor units (centavos), created/approved instants and the DIAN invoice status. Filter by status, orgId, a createdAt window (from inclusive, to exclusive) and q (reference prefix, Wompi transaction id, payment id prefix or part of the org name); page with cursor. Every call is recorded in the staff audit trail.

Parámetros de adminListPayments
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
fromCuerpostring (date-time)No
limitCuerpointeger 1–200Sí
orgIdCuerpostring (uuid)No
qCuerpostring 1–120No
statusCuerpo"created" | "pending" | "approved" | "declined" | "voided" | "error" | "refunded" | "partially_refunded"No
toCuerpostring (date-time)No
curl
curl -X POST 'https://www.notificado.co/api/list-payments/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"limit":1}'
TypeScript
const response = await fetch('https://www.notificado.co/api/list-payments/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "limit": 1
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "approvedAt": "2026-09-25T15:00:00Z",
      "createdAt": "2026-09-25T15:00:00Z",
      "gross": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "invoiceStatus": "<invoiceStatus>",
      "method": "<method>",
      "orgId": "<orgId>",
      "orgName": "<orgName>",
      "paymentId": "<paymentId>",
      "reference": "<reference>",
      "status": "created"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

requestManualInvoiceUpload

POST/api/manual-invoice-uploads/request

Solo personal de NotificadoPermiso: admin:invoicing:issueHerramienta MCP: requestManualInvoiceUpload

Staff only (admin:invoicing:issue). Step 1 of recording an invoice issued by hand in DIAN software: returns a signed PUT url for its PDF (application/pdf, at most 5 MB). PUT the bytes there, then call recordManualInvoice with the returned key as pdfKey.

Parámetros de requestManualInvoiceUpload
NombreDóndeTipoObligatorio
filenameCuerpostring 1–255Sí
sizeCuerpointeger 0–9007199254740991No
curl
curl -X POST 'https://www.notificado.co/api/manual-invoice-uploads/request' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"filename":"<filename>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/manual-invoice-uploads/request', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "filename": "<filename>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "contentType": "<contentType>",
  "expiresAt": -9007199254740991,
  "key": "<key>",
  "maxBytes": -9007199254740991,
  "method": "PUT",
  "url": "<url>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

pendingManualInvoices

POST/api/manual-invoices/pending

Solo personal de NotificadoPermiso: admin:invoicing:issueHerramienta MCP: pendingManualInvoices

Staff only (admin:invoicing:issue). The queued DIAN invoices and credit notes (document: invoice | credit_note; a credit note names the invoice it corrects) waiting to be issued by hand (EINVOICE_PROVIDER=manual), oldest first, each with buyer, lines, amounts in COP minor units (centavos), form of payment and our reference. Issue each in the DIAN software, then record it with recordManualInvoice. Every call is recorded in the staff audit trail.

Parámetros de pendingManualInvoices
NombreDóndeTipoObligatorio
limitCuerpointeger 1–500No
curl
curl -X POST 'https://www.notificado.co/api/manual-invoices/pending' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/manual-invoices/pending', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "rows": [
    {
      "amountGross": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "amountIva": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "amountNet": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "buyer": {
        "address": "<address>",
        "checkDigit": "<checkDigit>",
        "email": "<email>",
        "legalId": "<legalId>",
        "legalIdType": "<legalIdType>",
        "municipalityCode": "<municipalityCode>",
        "name": "<name>",
        "personType": "<personType>"
      },
      "corrects": {
        "cufe": "<cufe>",
        "id": "<id>",
        "number": "<number>"
      },
      "createdAt": "2026-09-25T15:00:00Z",
      "discount": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "document": "invoice",
      "dueAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "kind": "<kind>",
      "lines": [
        {
          "description": null,
          "discount": null,
          "ivaRate": null,
          "quantity": null,
          "unitNet": null
        }
      ],
      "orgId": "<orgId>",
      "paymentForm": "<paymentForm>",
      "paymentId": "<paymentId>",
      "reference": "<reference>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

recordManualInvoice

POST/api/manual-invoices/record

Solo personal de NotificadoPermiso: admin:invoicing:issueHerramienta MCP: recordManualInvoice

Staff only (admin:invoicing:issue). Records a DIAN invoice or credit note issued by hand in external DIAN software for a queued document (see pendingManualInvoices): its DIAN number, CUFE/CUDE (96 hex chars), issue time, and the PDF uploaded via requestManualInvoiceUpload (pdfKey). Marks it issued exactly once; the customer can then download it.

Parámetros de recordManualInvoice
NombreDóndeTipoObligatorio
codeCuerpostringSí
documentCuerpo"invoice" | "credit_note"Sí
idCuerpostring (uuid)Sí
issuedAtCuerpostring (date-time)Sí
numberCuerpostringSí
orgIdCuerpostring (uuid)Sí
pdfKeyCuerpostring 1–512Sí
curl
curl -X POST 'https://www.notificado.co/api/manual-invoices/record' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "code": "<code>",
  "document": "invoice",
  "id": "<id>",
  "issuedAt": "2026-09-25T15:00:00Z",
  "number": "<number>",
  "orgId": "<orgId>",
  "pdfKey": "<pdfKey>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/manual-invoices/record', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "code": "<code>",
    "document": "invoice",
    "id": "<id>",
    "issuedAt": "2026-09-25T15:00:00Z",
    "number": "<number>",
    "orgId": "<orgId>",
    "pdfKey": "<pdfKey>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "code": "<code>",
  "document": "invoice",
  "id": "<id>",
  "issuedAt": "2026-09-25T15:00:00Z",
  "number": "<number>",
  "pdfSha256": "<pdfSha256>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

searchNotifications

POST/api/notifications/search

Solo personal de NotificadoPermiso: admin:customer-data:readHerramienta MCP: searchNotifications

Staff only. Finds notifications of any customer org by 23-digit radicado, recipient email (or part of it), SES MessageId, notification or recipient id, or constancia verify code; newest first, with org, case radicado, status, sentAt, recipient count and each live recipient (recipientId, email, status; the matched one first). At least 3 characters. Every call is audited with its term.

Parámetros de searchNotifications
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
limitCuerpointeger 1–100No
termCuerpostring 1–320Sí
curl
curl -X POST 'https://www.notificado.co/api/notifications/search' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"term":"<term>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/notifications/search', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "term": "<term>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "caseRadicado": "<caseRadicado>",
      "createdAt": "2026-09-25T15:00:00Z",
      "notificationId": "<notificationId>",
      "orgId": "<orgId>",
      "orgName": "<orgName>",
      "recipientCount": -9007199254740991,
      "recipients": [
        {
          "email": null,
          "recipientId": null,
          "status": null
        }
      ],
      "sentAt": "2026-09-25T15:00:00Z",
      "status": "<status>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

searchOrgs

POST/api/orgs/search

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: searchOrgs

Staff only. Finds customer orgs by part of the name, a member email, an org id prefix (4+ hex chars) or a 23-digit radicado; newest first, with member count, KYC state and credit balance. At least 3 characters. Every call is audited with its term.

Parámetros de searchOrgs
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
limitCuerpointeger 1–100No
termCuerpostring 1–200Sí
curl
curl -X POST 'https://www.notificado.co/api/orgs/search' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"term":"<term>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/orgs/search', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "term": "<term>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "balance": -9007199254740991,
      "createdAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "kind": "<kind>",
      "kycState": "<kycState>",
      "memberCount": -9007199254740991,
      "name": "<name>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

suspendOrg

POST/api/orgs/suspend

Solo personal de NotificadoPermiso: abuse:write

suspendOrg

Parámetros de suspendOrg
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
reasonCuerpostring 3–1000Sí
curl
curl -X POST 'https://www.notificado.co/api/orgs/suspend' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/orgs/suspend', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "id": "<id>",
  "liftedAt": "2026-09-25T15:00:00Z",
  "liftedBy": "<liftedBy>",
  "orgId": "<orgId>",
  "reason": "<reason>",
  "suspendedAt": "2026-09-25T15:00:00Z",
  "suspendedBy": "<suspendedBy>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

viewOrg

POST/api/orgs/view

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: viewOrg

Staff only. One customer org: members (email, role, MFA), lawyer KYC status (cédula masked), credit balance with the last 20 ledger rows, notification counts by status, pending approvals. Every call is audited.

Parámetros de viewOrg
NombreDóndeTipoObligatorio
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/orgs/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/orgs/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "balance": -9007199254740991,
  "kycState": "<kycState>",
  "lawyers": [
    {
      "cedulaMasked": "<cedulaMasked>",
      "fullName": "<fullName>",
      "profileId": "<profileId>",
      "status": "<status>",
      "submittedAt": "2026-09-25T15:00:00Z",
      "userId": "<userId>",
      "vigenciaDocumentId": "<vigenciaDocumentId>"
    }
  ],
  "members": [
    {
      "email": "<email>",
      "joinedAt": "2026-09-25T15:00:00Z",
      "mfaEnrolled": true,
      "role": "<role>",
      "userId": "<userId>"
    }
  ],
  "notificationsByStatus": {},
  "org": {
    "createdAt": "2026-09-25T15:00:00Z",
    "id": "<id>",
    "kind": "<kind>",
    "name": "<name>"
  },
  "pendingApprovals": -9007199254740991,
  "recentLedger": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdBy": "<createdBy>",
      "delta": -9007199254740991,
      "expiresAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "invoiceRef": "<invoiceRef>",
      "kind": "<kind>",
      "packageId": "<packageId>",
      "recipientId": "<recipientId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminPaymentDetail

POST/api/payment-details/admin

Solo personal de NotificadoPermiso: admin:payments:readHerramienta MCP: adminPaymentDetail

Staff only (admin:payments:read). One payment by paymentId, in any org: amounts (COP minor units), status history markers, the gateway events about it (verified or not, applied or with the apply error, SHA-256 and size of the stored raw body), the credit ledger rows it produced, its DIAN invoice and credit notes, refunds and refund approval requests, and the amount still refundable. Every call is recorded in the staff audit trail.

Parámetros de adminPaymentDetail
NombreDóndeTipoObligatorio
paymentIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/payment-details/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"paymentId":"<paymentId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/payment-details/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "paymentId": "<paymentId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "creditNotes": [
    {
      "amountGross": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "cude": "<cude>",
      "id": "<id>",
      "issuedAt": "2026-09-25T15:00:00Z",
      "number": "<number>",
      "refundId": "<refundId>",
      "status": "<status>",
      "statusAt": "2026-09-25T15:00:00Z"
    }
  ],
  "events": [
    {
      "appliedAt": "2026-09-25T15:00:00Z",
      "applyError": "<applyError>",
      "eventId": "<eventId>",
      "eventKey": "<eventKey>",
      "eventType": "<eventType>",
      "provider": "<provider>",
      "rawBytes": -9007199254740991,
      "rawIsReserialized": true,
      "rawSha256": "<rawSha256>",
      "receivedAt": "2026-09-25T15:00:00Z",
      "verified": true
    }
  ],
  "invoice": {
    "amountGross": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "cufe": "<cufe>",
    "id": "<id>",
    "issuedAt": "2026-09-25T15:00:00Z",
    "kind": "<kind>",
    "number": "<number>",
    "status": "<status>",
    "statusAt": "2026-09-25T15:00:00Z"
  },
  "ledger": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdBy": "<createdBy>",
      "delta": -9007199254740991,
      "expiresAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "kind": "<kind>",
      "source": "<source>",
      "sourceId": "<sourceId>"
    }
  ],
  "payment": {
    "amountIva": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "amountNet": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "approvedAt": "2026-09-25T15:00:00Z",
    "attempt": -9007199254740991,
    "couponId": "<couponId>",
    "createdAt": "2026-09-25T15:00:00Z",
    "createdBy": "<createdBy>",
    "discount": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "gatewayTxId": "<gatewayTxId>",
    "gross": {
      "currency": "<currency>",
      "minor": -9007199254740991
    },
    "method": "<method>",
    "orgId": "<orgId>",
    "orgName": "<orgName>",
    "packCode": "<packCode>",
    "packSends": -9007199254740991,
    "paymentId": "<paymentId>",
    "purpose": "<purpose>",
    "reference": "<reference>",
    "status": "created",
    "statusAt": "2026-09-25T15:00:00Z",
    "subjectId": "<subjectId>"
  },
  "refundRequests": [
    {
      "amount": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "approvalRequestId": "<approvalRequestId>",
      "decidedBy": "<decidedBy>",
      "failureReason": "<failureReason>",
      "reason": "<reason>",
      "requestedAt": "2026-09-25T15:00:00Z",
      "requestedBy": "<requestedBy>",
      "status": "<status>"
    }
  ],
  "refundable": {
    "currency": "<currency>",
    "minor": -9007199254740991
  },
  "refunded": {
    "currency": "<currency>",
    "minor": -9007199254740991
  },
  "refunds": [
    {
      "amountGross": {
        "currency": "<currency>",
        "minor": -9007199254740991
      },
      "approvalRequestId": "<approvalRequestId>",
      "createdAt": "2026-09-25T15:00:00Z",
      "createdBy": "<createdBy>",
      "creditsReversed": -9007199254740991,
      "id": "<id>",
      "reason": "<reason>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

viewRawEvent

POST/api/raw-events/view

Solo personal de NotificadoPermiso: admin:customer-data:readHerramienta MCP: viewRawEvent

Staff only. The raw provider payload behind one evidence event (SES/SNS JSON, inbound reply notification, transport receipt), base64, exactly as stored, with its SHA-256 recomputed now and compared with the digest the hash-chained event committed to (match). Needs a purpose (5+ characters). Read-only; every call is audited.

Parámetros de viewRawEvent
NombreDóndeTipoObligatorio
eventIdCuerpostring (uuid)Sí
purposeCuerpostring 1–500Sí
curl
curl -X POST 'https://www.notificado.co/api/raw-events/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"eventId":"<eventId>","purpose":"<purpose>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/raw-events/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "eventId": "<eventId>",
    "purpose": "<purpose>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "bytes": -9007199254740991,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "eventId": "<eventId>",
  "filename": "<filename>",
  "match": true,
  "orgId": "<orgId>",
  "recomputedSha256": "<recomputedSha256>",
  "storedSha256": "<storedSha256>",
  "type": "<type>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

viewRecipientTimeline

POST/api/recipient-timelines/view

Solo personal de NotificadoPermiso: admin:customer-data:readHerramienta MCP: viewRecipientTimeline

Staff only. One recipient of a notification as the evidence shows it: recipient and notification (org, case radicado, frozen .eml SHA-256), address provenance and sworn statement, attachment SHA-256s, every evidence event in chain order (UTC and Bogotá time, seq, hash, prevHash, indicio flag for opens, hasRaw) and the constancia versions. Read-only. Every call is audited.

Parámetros de viewRecipientTimeline
NombreDóndeTipoObligatorio
purposeCuerpostring 1–500No
recipientIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/recipient-timelines/view' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"recipientId":"<recipientId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/recipient-timelines/view', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "recipientId": "<recipientId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "attachments": [
    {
      "bytes": -9007199254740991,
      "kind": "<kind>",
      "name": "<name>",
      "sha256": "<sha256>"
    }
  ],
  "constancias": [
    {
      "issuedAt": "2026-09-25T15:00:00Z",
      "sha256": "<sha256>",
      "verifyCode": "<verifyCode>",
      "version": -9007199254740991
    }
  ],
  "events": [
    {
      "eventId": "<eventId>",
      "hasRaw": true,
      "hash": "<hash>",
      "indicio": true,
      "occurredAt": "2026-09-25T15:00:00Z",
      "occurredAtBogota": "<occurredAtBogota>",
      "payloadJson": "<payloadJson>",
      "prevHash": "<prevHash>",
      "recipientId": "<recipientId>",
      "recordedAt": "2026-09-25T15:00:00Z",
      "seq": -9007199254740991,
      "type": "<type>"
    }
  ],
  "notification": {
    "caseId": "<caseId>",
    "caseRadicado": "<caseRadicado>",
    "createdAt": "2026-09-25T15:00:00Z",
    "emlSha256": "<emlSha256>",
    "frozenAt": "2026-09-25T15:00:00Z",
    "id": "<id>",
    "orgId": "<orgId>",
    "orgName": "<orgName>",
    "sentAt": "2026-09-25T15:00:00Z",
    "status": "<status>",
    "subject": "<subject>"
  },
  "provenance": {
    "evidenceDocumentIds": [
      "<evidenceDocumentIds>"
    ],
    "juramentoVersion": "<juramentoVersion>",
    "overrideReason": "<overrideReason>",
    "source": "<source>",
    "sourceText": "<sourceText>",
    "swornAt": "2026-09-25T15:00:00Z",
    "swornBy": "<swornBy>"
  },
  "recipient": {
    "createdAt": "2026-09-25T15:00:00Z",
    "email": "<email>",
    "headerMessageId": "<headerMessageId>",
    "id": "<id>",
    "messageId": "<messageId>",
    "name": "<name>",
    "status": "<status>"
  }
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminReconcilePayment

POST/api/reconcile-payments/admin

Solo personal de NotificadoPermiso: admin:payments:readHerramienta MCP: adminReconcilePayment

Staff only (admin:payments:read). Enqueues a reconciliation of one payment now: the server asks the payment gateway for its transaction and applies the answer (idempotent — an approved payment stays approved; missing credits or invoice are repaired). Returns the status before it runs; read adminPaymentDetail again after a few seconds. Recorded in the staff audit trail.

Parámetros de adminReconcilePayment
NombreDóndeTipoObligatorio
paymentIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/reconcile-payments/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"paymentId":"<paymentId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/reconcile-payments/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "paymentId": "<paymentId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "enqueued": true,
  "orgId": "<orgId>",
  "paymentId": "<paymentId>",
  "status": "created"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminReissueConstancia

POST/api/reissue-constancias/admin

Solo personal de NotificadoPermiso: admin:evidence:reissueHerramienta MCP: adminReissueConstancia

Staff only. Queue the next version of a notification's constancia (signed PDF built from every evidence event so far); earlier versions are never overwritten and keep verifying as superseded. Needs a reason (5+ characters). Fails X_CONSTANCIA_NOT_FOUND before the first constancia exists. Audited, and recorded in the firm's own audit log.

Parámetros de adminReissueConstancia
NombreDóndeTipoObligatorio
confirmTokenCuerpostring 1–200No
notificationIdCuerpostring (uuid)Sí
reasonCuerpostring 1–1000Sí
curl
curl -X POST 'https://www.notificado.co/api/reissue-constancias/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"notificationId":"<notificationId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/reissue-constancias/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "notificationId": "<notificationId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "notificationId": "<notificationId>",
  "orgId": "<orgId>",
  "queued": true,
  "version": 2
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

adminRequestRefund

POST/api/request-refunds/admin

Solo personal de NotificadoPermiso: admin:payments:refundHerramienta MCP: adminRequestRefund

Staff only (admin:payments:refund). Files a four-eyes refund request for one approved payment: gross in COP minor units (at most the refundable amount adminPaymentDetail reports), a reason, and refundReason customer|chargeback|error. A DIFFERENT staff member must approve it (decideApproval); approval then records the refund, takes back unused credits and queues the DIAN credit note. It does NOT move money: staff return it in the Wompi dashboard. Returns the approval request.

Parámetros de adminRequestRefund
NombreDóndeTipoObligatorio
grossCuerpoobjectSí
paymentIdCuerpostring (uuid)Sí
reasonCuerpostring 3–1000Sí
refundReasonCuerpo"customer" | "chargeback" | "error"No
curl
curl -X POST 'https://www.notificado.co/api/request-refunds/admin' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "gross": {
    "currency": "COP",
    "minor": 1
  },
  "paymentId": "<paymentId>",
  "reason": "<reason>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/request-refunds/admin', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "gross": {
      "currency": "COP",
      "minor": 1
    },
    "paymentId": "<paymentId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "amount": {
    "currency": "<currency>",
    "minor": -9007199254740991
  },
  "credits": -9007199254740991,
  "decidedAt": "2026-09-25T15:00:00Z",
  "decidedBy": "<decidedBy>",
  "decisionReason": "<decisionReason>",
  "executedRef": "<executedRef>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "failureReason": "<failureReason>",
  "id": "<id>",
  "kind": "<kind>",
  "payload": {},
  "payloadSha256": "<payloadSha256>",
  "reason": "<reason>",
  "requestedAt": "2026-09-25T15:00:00Z",
  "requestedBy": "<requestedBy>",
  "status": "<status>",
  "subjectOrgId": "<subjectOrgId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

setSenderLimit

POST/api/sender-limits/set

Solo personal de NotificadoPermiso: abuse:write

setSenderLimit

Parámetros de setSenderLimit
NombreDóndeTipoObligatorio
orgIdCuerpostring 1–64Sí
perDayCuerpointeger -9007199254740991–9007199254740991 | string 1–9Sí
perHourCuerpointeger -9007199254740991–9007199254740991 | string 1–9Sí
reasonCuerpostring 1–500Sí
curl
curl -X POST 'https://www.notificado.co/api/sender-limits/set' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{
  "orgId": "<orgId>",
  "perDay": -9007199254740991,
  "perHour": -9007199254740991,
  "reason": "<reason>"
}'
TypeScript
const response = await fetch('https://www.notificado.co/api/sender-limits/set', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>",
    "perDay": -9007199254740991,
    "perHour": -9007199254740991,
    "reason": "<reason>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "orgId": "<orgId>",
  "perDay": -9007199254740991,
  "perHour": -9007199254740991,
  "reason": "<reason>",
  "setAt": "2026-09-25T15:00:00Z",
  "setBy": "<setBy>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmStaffAction

POST/api/staff-actions/confirm

Solo personal de NotificadoPermiso: admin:tokens:self

confirmStaffAction

Parámetros de confirmStaffAction
NombreDóndeTipoObligatorio
confirmationIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/staff-actions/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"confirmationId":"<confirmationId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-actions/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "confirmationId": "<confirmationId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "confirmationId": "<confirmationId>",
  "resultJson": "<resultJson>",
  "status": "confirmed",
  "tool": "<tool>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmStaffMfa

POST/api/staff-mfas/confirm

Solo personal de NotificadoPermiso: admin:read

confirmStaffMfa

Parámetros de confirmStaffMfa
NombreDóndeTipoObligatorio
codeCuerpostring 6–8Sí
secretCuerpostring 16–128Sí
curl
curl -X POST 'https://www.notificado.co/api/staff-mfas/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"code":"<code>","secret":"<secret>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-mfas/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "code": "<code>",
    "secret": "<secret>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "recoveryCodes": [
    "<recoveryCodes>"
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

enrolStaffMfa

POST/api/staff-mfas/enrol

Solo personal de NotificadoPermiso: admin:read

enrolStaffMfa

curl
curl -X POST 'https://www.notificado.co/api/staff-mfas/enrol' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-mfas/enrol', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "secret": "<secret>",
  "uri": "<uri>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

issueStaffToken

POST/api/staff-tokens/issue

Solo personal de NotificadoPermiso: admin:tokens:self

issueStaffToken

Parámetros de issueStaffToken
NombreDóndeTipoObligatorio
codeCuerpostring 1–64No
nameCuerpostring 1–100Sí
scopesCuerpoarray of string 1–40No
ttlHoursCuerpo1 | 24 | 168Sí
curl
curl -X POST 'https://www.notificado.co/api/staff-tokens/issue' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"name":"<name>","ttlHours":1}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-tokens/issue', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "name": "<name>",
    "ttlHours": 1
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "summary": {
    "createdAt": "2026-09-25T15:00:00Z",
    "createdAtBogota": "<createdAtBogota>",
    "expiresAt": "2026-09-25T15:00:00Z",
    "expiresAtBogota": "<expiresAtBogota>",
    "id": "<id>",
    "lastUsedAt": "2026-09-25T15:00:00Z",
    "lastUsedAtBogota": "<lastUsedAtBogota>",
    "name": "<name>",
    "own": true,
    "prefix": "<prefix>",
    "revokedAt": "2026-09-25T15:00:00Z",
    "revokedAtBogota": "<revokedAtBogota>",
    "scopes": [
      "staff:read"
    ],
    "status": "active",
    "userId": "<userId>"
  },
  "token": "<token>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listStaffTokens

POST/api/staff-tokens/list

Solo personal de NotificadoPermiso: admin:tokens:self

listStaffTokens

Parámetros de listStaffTokens
NombreDóndeTipoObligatorio
allCuerpobooleanNo
curl
curl -X POST 'https://www.notificado.co/api/staff-tokens/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-tokens/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "tokens": [
    {
      "createdAt": "2026-09-25T15:00:00Z",
      "createdAtBogota": "<createdAtBogota>",
      "expiresAt": "2026-09-25T15:00:00Z",
      "expiresAtBogota": "<expiresAtBogota>",
      "id": "<id>",
      "lastUsedAt": "2026-09-25T15:00:00Z",
      "lastUsedAtBogota": "<lastUsedAtBogota>",
      "name": "<name>",
      "own": true,
      "prefix": "<prefix>",
      "revokedAt": "2026-09-25T15:00:00Z",
      "revokedAtBogota": "<revokedAtBogota>",
      "scopes": [
        "staff:read"
      ],
      "status": "active",
      "userId": "<userId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

revokeStaffToken

POST/api/staff-tokens/revoke

Solo personal de NotificadoPermiso: or(admin:tokens:manage, admin:tokens:self)

revokeStaffToken

Parámetros de revokeStaffToken
NombreDóndeTipoObligatorio
tokenIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/staff-tokens/revoke' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"tokenId":"<tokenId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/staff-tokens/revoke', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "tokenId": "<tokenId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "createdAt": "2026-09-25T15:00:00Z",
  "createdAtBogota": "<createdAtBogota>",
  "expiresAt": "2026-09-25T15:00:00Z",
  "expiresAtBogota": "<expiresAtBogota>",
  "id": "<id>",
  "lastUsedAt": "2026-09-25T15:00:00Z",
  "lastUsedAtBogota": "<lastUsedAtBogota>",
  "name": "<name>",
  "own": true,
  "prefix": "<prefix>",
  "revokedAt": "2026-09-25T15:00:00Z",
  "revokedAtBogota": "<revokedAtBogota>",
  "scopes": [
    "staff:read"
  ],
  "status": "active",
  "userId": "<userId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

checkStorageLock

POST/api/storage-locks/check

Solo personal de NotificadoPermiso: admin:system:readHerramienta MCP: checkStorageLock

Staff only. Reads the S3 Object Lock actually applied to one evidence object (one HEAD, never the content): mode COMPLIANCE | GOVERNANCE | NONE (or n/a on a local dev disk), retainUntil (UTC), legalHold. Omit key to check the newest stored timestamp token. In production alert is true, with alertReason, when the object is deletable. Audited.

Parámetros de checkStorageLock
NombreDóndeTipoObligatorio
keyCuerpostring 1–512No
curl
curl -X POST 'https://www.notificado.co/api/storage-locks/check' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/storage-locks/check', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "alert": true,
  "alertReason": "<alertReason>",
  "backend": "local",
  "checkedAt": "2026-09-25T15:00:00Z",
  "defaulted": true,
  "key": "<key>",
  "legalHold": true,
  "mode": "COMPLIANCE",
  "production": true,
  "retainUntil": "2026-09-25T15:00:00Z"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

addSupportNote

POST/api/support-notes/add

Solo personal de NotificadoPermiso: admin:support:writeHerramienta MCP: addSupportNote

Staff only (superadmin, ops, support, compliance). Append a support note to one customer org: what happened and what was agreed (up to 4000 characters). Notes are staff-only, insert-only (never edited or deleted — write a new note to correct one) and shown on the org 360. Through MCP the call waits for your human to confirm it in /admin/mcp. Audited.

Parámetros de addSupportNote
NombreDóndeTipoObligatorio
bodyCuerpostring 1–4000Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/support-notes/add' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"body":"<body>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/support-notes/add', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "body": "<body>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "authorId": "<authorId>",
  "authorRole": "<authorRole>",
  "body": "<body>",
  "createdAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "orgId": "<orgId>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

listSupportNotes

POST/api/support-notes/list

Solo personal de NotificadoPermiso: admin:orgs:readHerramienta MCP: listSupportNotes

Staff only. One customer org's staff support notes (author id and role, text, when), newest first; page with cursor. Every call is audited.

Parámetros de listSupportNotes
NombreDóndeTipoObligatorio
cursorCuerpostring 1–200No
limitCuerpointeger 1–100No
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/support-notes/list' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/support-notes/list', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "nextCursor": "<nextCursor>",
  "rows": [
    {
      "authorId": "<authorId>",
      "authorRole": "<authorRole>",
      "body": "<body>",
      "createdAt": "2026-09-25T15:00:00Z",
      "id": "<id>",
      "orgId": "<orgId>"
    }
  ]
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

liftSuspension

POST/api/suspensions/lift

Solo personal de NotificadoPermiso: abuse:write

liftSuspension

Parámetros de liftSuspension
NombreDóndeTipoObligatorio
noteCuerpostring 3–1000Sí
orgIdCuerpostring (uuid)Sí
curl
curl -X POST 'https://www.notificado.co/api/suspensions/lift' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"note":"<note>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/suspensions/lift', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "note": "<note>",
    "orgId": "<orgId>"
  }),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "id": "<id>",
  "liftedAt": "2026-09-25T15:00:00Z",
  "liftedBy": "<liftedBy>",
  "orgId": "<orgId>",
  "reason": "<reason>",
  "suspendedAt": "2026-09-25T15:00:00Z",
  "suspendedBy": "<suspendedBy>"
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

triggerTestError

POST/api/test-errors/trigger

Solo personal de NotificadoPermiso: admin:ops:test-error

triggerTestError

Parámetros de triggerTestError
NombreDóndeTipoObligatorio
noteCuerpostring 1–200No
curl
curl -X POST 'https://www.notificado.co/api/test-errors/trigger' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{}'
TypeScript
const response = await fetch('https://www.notificado.co/api/test-errors/trigger', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({}),
});
const result = await response.json();
Ejemplo de respuesta
200
{
  "raised": true
}

Errores

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID