Skip to content

API reference

Notifications

18 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

bounceAlerts

GET/_x/query/bounce-alerts

Firm memberPermission: notification:readMCP tool: bounceAlerts

Recipients whose notification could NOT be delivered (status bounced: the recipient's mail server refused it for good; status failed: our mail transport refused to send it) 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 bounced or failed: verify the address, re-issue to another sworn address in the panel (switchChannel), or notify by physical means. Read-only.

Parameters of bounceAlerts
NameInTypeRequired
notificationIdQuerystring (uuid)No
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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

caseNotifications

GET/_x/query/case-notifications

Firm memberPermission: notification:readMCP tool: caseNotifications

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

Parameters of caseNotifications
NameInTypeRequired
caseIdQuerystring (uuid)Yes
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-notifications?caseId=<caseId>&orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/case-notifications?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

listPendingApprovals

GET/_x/query/list-pending-approvals

Firm memberPermission: notification:read

listPendingApprovals

Parameters of listPendingApprovals
NameInTypeRequired
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-pending-approvals?orgId=<orgId>' \
  -b cookies.txt
TypeScript
const response = await fetch('https://www.notificado.co/_x/query/list-pending-approvals?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

listPendingSends

GET/_x/query/list-pending-sends

Firm memberPermission: and(notification:send, notification:send)

listPendingSends

Parameters of listPendingSends
NameInTypeRequired
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-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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

memorialReadiness

GET/_x/query/memorial-readiness

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

Parameters of memorialReadiness
NameInTypeRequired
notificationIdQuerystring (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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationDetail

GET/_x/query/notification-detail

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

Parameters of notificationDetail
NameInTypeRequired
idQuerystring (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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationList

GET/_x/query/notification-list

Firm memberPermission: notification:readMCP tool: 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. For the next page pass cursor = "<createdAt>_<id>" of the last row you got. Read-only.

Parameters of notificationList
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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

notificationMemorials

GET/_x/query/notification-memorials

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

Parameters of notificationMemorials
NameInTypeRequired
limitQueryinteger 1–200No
notificationIdQuerystring (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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

sendConfirmationDetail

GET/_x/query/send-confirmation-detail

Firm memberPermission: notification:read

sendConfirmationDetail

Parameters of sendConfirmationDetail
NameInTypeRequired
confirmationIdQuerystring (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/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();
Example response
200
[
  null
]

Errors

  • 400 X_INPUT_INVALID or X_CURSOR_INVALID
  • 403 policy denied

switchChannel

POST/api/channels/switch

Firm memberPermission: notification:send

switchChannel

Parameters of switchChannel
NameInTypeRequired
emailBodystring 1–320Yes
evidenceDocumentIdsBodyarray of string 1–64No
juramentoBodyboolean | string 0–8No
nameBodystring 0–300No
notificationIdBodystring 1–64No
orgIdBodystring 1–64Yes
overrideReasonBodystring 0–2000 | nullNo
recipientIdBodystring 1–64Yes
sourceBodystring 1–64Yes
sourceTextBodystring 1–2000Yes
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();
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

createMemorial

POST/api/memorials/create

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

Parameters of createMemorial
NameInTypeRequired
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
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();
Example response
200
{
  "charge": "free",
  "jobId": "<jobId>",
  "memorialId": "<memorialId>",
  "templateId": "<templateId>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

downloadMemorial

POST/api/memorials/download

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

Parameters of downloadMemorial
NameInTypeRequired
formatBody"docx" | "pdf"Yes
memorialIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
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();
Example response
200
{
  "bytes": 0,
  "contentBase64": "<contentBase64>",
  "contentType": "<contentType>",
  "filename": "<filename>",
  "format": "docx",
  "memorialId": "<memorialId>",
  "sha256": "<sha256>"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

sendNotification

POST/api/notifications/send

Firm memberPermission: or(and(approval:request, not(notification:send)), notification:send)MCP tool: 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). If your token belongs to a paralegal it returns { status: "awaiting_approval", approvalUrl } instead: a lawyer of the firm approves or rejects it in the panel (X_SEND_APPROVALS_OFF when the firm has not turned approvals on).

Parameters of sendNotification
NameInTypeRequired
confirmBodytrueYes
noteBodystring 1–1000No
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
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();
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

addRecipient

POST/api/recipients/add

Firm memberPermission: notification:send

addRecipient

Parameters of addRecipient
NameInTypeRequired
emailBodystring (email)Yes
evidenceDocumentIdsBodyarray of string (uuid)Yes
juramentoBodybooleanYes
nameBodystring 1–300Yes
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
overrideReasonBodystring 1–2000 | nullNo
sourceBody"comunicaciones_previas" | "camara_de_comercio" | "rut" | "contrato" | "web_oficial" | "otro"Yes
sourceTextBodystring 1–2000Yes
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();
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

requestSendApproval

POST/api/send-approvals/request

Firm memberPermission: and(approval:request, not(notification:send))

requestSendApproval

Parameters of requestSendApproval
NameInTypeRequired
noteBodystring 1–1000No
notificationIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
curl
curl -X POST 'https://www.notificado.co/api/send-approvals/request' \
  -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/send-approvals/request', {
  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();
Example response
200
{
  "approvalId": "<approvalId>",
  "approvalUrl": "<approvalUrl>",
  "notificationId": "<notificationId>",
  "status": "awaiting_approval"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID

approveSend

POST/api/sends/approve

Firm memberPermission: and(notification:send, notification:send)

approveSend

Parameters of approveSend
NameInTypeRequired
approvalIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
curl
curl -X POST 'https://www.notificado.co/api/sends/approve' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"approvalId":"<approvalId>","orgId":"<orgId>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/sends/approve', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "approvalId": "<approvalId>",
    "orgId": "<orgId>"
  }),
});
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

confirmSend

POST/api/sends/confirm

Firm memberPermission: and(notification:send, notification:send)

confirmSend

Parameters of confirmSend
NameInTypeRequired
confirmationIdBodystring (uuid)Yes
draftSha256Bodystring 64–64No
orgIdBodystring (uuid)Yes
returnToBodystring 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();
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

rejectSend

POST/api/sends/reject

Firm memberPermission: and(notification:send, notification:send)

rejectSend

Parameters of rejectSend
NameInTypeRequired
approvalIdBodystring (uuid)Yes
orgIdBodystring (uuid)Yes
reasonBodystring 1–1000Yes
curl
curl -X POST 'https://www.notificado.co/api/sends/reject' \
  -b cookies.txt \
  -H 'origin: https://www.notificado.co' \
  -H 'content-type: application/json' \
  -d '{"approvalId":"<approvalId>","orgId":"<orgId>","reason":"<reason>"}'
TypeScript
const response = await fetch('https://www.notificado.co/api/sends/reject', {
  method: 'POST',
  headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
  body: JSON.stringify({
    "approvalId": "<approvalId>",
    "orgId": "<orgId>",
    "reason": "<reason>"
  }),
});
const result = await response.json();
Example response
200
{
  "approvedBy": "<approvedBy>",
  "createdAt": "2026-09-25T15:00:00Z",
  "decidedAt": "2026-09-25T15:00:00Z",
  "draftedBy": "<draftedBy>",
  "id": "<id>",
  "note": "<note>",
  "notificationId": "<notificationId>",
  "rejectReason": "<rejectReason>",
  "rejectedBy": "<rejectedBy>",
  "requestedVia": "panel",
  "status": "pending"
}

Errors

  • 400 X_INPUT_INVALID
  • 403 policy denied
  • 422 X_BODY_INVALID