Skip to content

API reference

Cases and documents

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

Every example assumes a signed-in session; how to get one is in Authentication

caseDetail

GET/_x/query/case-detail

Firm memberPermission: case:readMCP tool: 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.

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

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

caseList

GET/_x/query/case-list

Firm memberPermission: case:readMCP tool: caseList

The caller's firm's cases (procesos), newest first: id, 23-digit radicado, juzgado, ciudad, especialidad, clase de proceso and cliente. For the next page pass cursor = "<createdAt>_<id>" of the last row you got. Use the id with caseDetail, or to start a notification on that case.

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

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

importDetail

GET/_x/query/import-detail

Firm memberPermission: case:read

importDetail

Parameters of importDetail
NameInTypeRequired
importIdQuerystring (uuid)Yes
orgIdQuerystring (uuid)Yes
_firstQueryinteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterQuerystringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/import-detail?importId=<importId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/import-detail?importId=<importId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

importErrorCsv

GET/_x/query/import-error-csv

Firm memberPermission: case:read

importErrorCsv

Parameters of importErrorCsv
NameInTypeRequired
importIdQuerystring (uuid)Yes
orgIdQuerystring (uuid)Yes
_firstQueryinteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterQuerystringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/import-error-csv?importId=<importId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/import-error-csv?importId=<importId>&orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

listImports

GET/_x/query/list-imports

Firm memberPermission: case:read

listImports

Parameters of listImports
NameInTypeRequired
cursorQuerystring 1–64No
importIdQuerystring (uuid)No
limitQueryinteger 1–100No
orgIdQuerystring (uuid)Yes
_firstQueryinteger 1–10000page size; present, the response is the page envelope rather than the bare rows (1 to 10000)No
_afterQuerystringthe endCursor a previous page answered; needs _firstNo
curl
curl 'https://www.notificado.co/_x/query/list-imports?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-imports?orgId=<orgId>', {
  headers: { cookie: sessionCookie },
});
const result = await response.json();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

checkAddress

POST/api/address/check

Firm memberPermission: case:writeMCP tool: 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.

Parameters of checkAddress
NameInTypeRequired
emailBodystring 1–320Yes
orgIdBodystring (uuid)Yes
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();
Example response
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"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

detachAttachment

POST/api/attachments/detach

Firm memberPermission: case:write

detachAttachment

Parameters of detachAttachment
NameInTypeRequired
attachmentIdBodystring (uuid)Yes
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
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();
Example response
200
{
  "bytes": -9007199254740991,
  "filename": "<filename>",
  "id": "<id>",
  "kind": "auto_admisorio",
  "mime": "<mime>",
  "position": -9007199254740991,
  "sha256": "<sha256>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

createCase

POST/api/cases/create

Firm memberPermission: case:writeMCP tool: 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.

Parameters of createCase
NameInTypeRequired
ciudadBodystring 1–120Yes
claseProcesoBodystring 1–200Yes
clienteBodystring 1–300Yes
especialidadBodystring 1–120Yes
juzgadoBodystring 1–300Yes
juzgadoEmailBodystring (email) ≤ 320Yes
radicadoBodystring 23–40Yes
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();
Example response
200
{
  "ciudad": "<ciudad>",
  "claseProceso": "<claseProceso>",
  "cliente": "<cliente>",
  "createdAt": "2026-09-25T15:00:00Z",
  "especialidad": "<especialidad>",
  "id": "<id>",
  "juzgado": "<juzgado>",
  "juzgadoEmail": "<juzgadoEmail>",
  "radicado": "<radicado>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

updateCase

POST/api/cases/update

Firm memberPermission: case:writeMCP tool: 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.

Parameters of updateCase
NameInTypeRequired
caseIdBodystring (uuid)Yes
ciudadBodystring 1–120No
claseProcesoBodystring 1–200No
clienteBodystring 1–300No
especialidadBodystring 1–120No
juzgadoBodystring 1–300No
juzgadoEmailBodystring (email) ≤ 320No
radicadoBodystring 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();
Example response
200
{
  "ciudad": "<ciudad>",
  "claseProceso": "<claseProceso>",
  "cliente": "<cliente>",
  "createdAt": "2026-09-25T15:00:00Z",
  "especialidad": "<especialidad>",
  "id": "<id>",
  "juzgado": "<juzgado>",
  "juzgadoEmail": "<juzgadoEmail>",
  "radicado": "<radicado>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

attachDocument

POST/api/documents/attach

Firm memberPermission: case:writeMCP tool: 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.

Parameters of attachDocument
NameInTypeRequired
documentIdBodystring (uuid)Yes
kindBody"auto_admisorio" | "demanda" | "anexo" | "subsanacion" | "providencia" | "otro"Yes
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
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();
Example response
200
{
  "bytes": -9007199254740991,
  "filename": "<filename>",
  "id": "<id>",
  "kind": "auto_admisorio",
  "mime": "<mime>",
  "position": -9007199254740991,
  "sha256": "<sha256>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

updateDraft

POST/api/drafts/update

Firm memberPermission: case:writeMCP tool: 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.

Parameters of updateDraft
NameInTypeRequired
mensajeBodystring 1–5000No
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
providenciaBodystring 1–200Yes
providenciaFechaBodystringYes
templateBody"art8-personal"Yes
terminoDiasBodyinteger 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();
Example response
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"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

confirmImportUpload

POST/api/import-uploads/confirm

Firm memberPermission: case:write

confirmImportUpload

Parameters of confirmImportUpload
NameInTypeRequired
filenameBodystring 1–255Yes
keyBodystring 1–512Yes
curl
curl -X POST 'https://www.notificado.co/api/import-uploads/confirm' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"filename":"<filename>","key":"<key>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/import-uploads/confirm', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "filename": "<filename>",
    "key": "<key>"
  }),
});
const result = await response.json();
Example response
200
{
  "bytes": -9007199254740991,
  "createdAt": "2026-09-25T15:00:00Z",
  "draftedRows": -9007199254740991,
  "errorRows": -9007199254740991,
  "failureCode": "<failureCode>",
  "failureDetail": "<failureDetail>",
  "fileSha256": "<fileSha256>",
  "filename": "<filename>",
  "finishedAt": "2026-09-25T15:00:00Z",
  "id": "<id>",
  "status": "queued",
  "totalRows": -9007199254740991
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

requestImportUpload

POST/api/import-uploads/request

Firm memberPermission: case:write

requestImportUpload

Parameters of requestImportUpload
NameInTypeRequired
filenameBodystring 1–255Yes
sizeBodyinteger 0–9007199254740991No
curl
curl -X POST 'https://www.notificado.co/api/import-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/import-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();
Example response
200
{
  "contentType": "<contentType>",
  "expiresAt": -9007199254740991,
  "key": "<key>",
  "maxBytes": -9007199254740991,
  "method": "PUT",
  "url": "<url>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

createNotification

POST/api/notifications/create

Firm memberPermission: case:writeMCP tool: 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.

Parameters of createNotification
NameInTypeRequired
caseIdBodystring (uuid)Yes
mensajeBodystring 1–5000No
orgIdBodystring (uuid)Yes
providenciaBodystring 1–200Yes
providenciaFechaBodystringYes
templateBody"art8-personal"Yes
terminoDiasBodyinteger 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();
Example response
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"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

addParty

POST/api/parties/add

Firm memberPermission: case:writeMCP tool: 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.

Parameters of addParty
NameInTypeRequired
caseIdBodystring (uuid)Yes
idNumberBodystring 1–40No
nameBodystring 1–300Yes
roleBody"demandante" | "demandado" | "apoderado" | "otro"Yes
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();
Example response
200
{
  "caseId": "<caseId>",
  "id": "<id>",
  "idNumber": "<idNumber>",
  "name": "<name>",
  "role": "demandante"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

removeRecipient

POST/api/recipients/remove

Firm memberPermission: case:write

removeRecipient

Parameters of removeRecipient
NameInTypeRequired
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
recipientIdBodystring (uuid)Yes
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();
Example response
200
{
  "email": "<email>",
  "id": "<id>",
  "name": "<name>",
  "notificationId": "<notificationId>",
  "status": "queued"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID