Operations marked /v1 authenticate with an agent token; the rest, with a panel session. How both work is in Authentication
GET/_x/query/my-kyc
Firm memberPermission: kyc:submit
myKyc
Parameters of myKyc| Name | In | Type | Required |
|---|
userId | Query | string (uuid) | Yes |
_first | Query | integer 1–500page size; present, the response is the page envelope rather than the bare rows (1 to 500) | No |
_after | Query | stringthe nextCursor a previous page answered; needs _first | No |
curlcurl 'https://www.notificado.co/_x/query/my-kyc?userId=<userId>' \
-b cookies.txt
TypeScriptconst response = await fetch('https://www.notificado.co/_x/query/my-kyc?userId=<userId>', {
headers: { cookie: sessionCookie },
});
const result = await response.json();
Example response
200[
null
]
Errors
400 X_INPUT_INVALID or X_CURSOR_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/change-sirna-email
Firm memberPermission: kyc:submit
changeSirnaEmail
Parameters of changeSirnaEmail| Name | In | Type | Required |
|---|
sirnaEmail | Body | string 3–320 | Yes |
curlcurl -X POST 'https://www.notificado.co/api/change-sirna-email' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{"sirnaEmail":"<sirnaEmail>"}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/change-sirna-email', {
method: 'POST',
headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
body: JSON.stringify({
"sirnaEmail": "<sirnaEmail>"
}),
});
const result = await response.json();
Example response
200{
"currentSirnaEmail": "<currentSirnaEmail>",
"expiresInMinutes": -9007199254740991,
"requestId": "<requestId>",
"sentTo": "<sentTo>"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/confirm-sirna-email-change
Firm memberPermission: kyc:submit
confirmSirnaEmailChange
Parameters of confirmSirnaEmailChange| Name | In | Type | Required |
|---|
code | Body | string 6–12 | Yes |
curlcurl -X POST 'https://www.notificado.co/api/confirm-sirna-email-change' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{"code":"<code>"}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/confirm-sirna-email-change', {
method: 'POST',
headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
body: JSON.stringify({
"code": "<code>"
}),
});
const result = await response.json();
Example response
200{
"pendingSirnaEmail": "<pendingSirnaEmail>",
"sirnaEmail": "<sirnaEmail>",
"status": "awaiting_staff"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/v1/confirm-upload
Firm memberPermission: or(kyc:submit, affiliate:self, affiliate:self, case:write)/v1 · bearer tokenIdempotency-KeyMCP tool: confirmUpload
Step 2: checks the stored bytes and answers the document id for attachDocument.
Parameters of confirmUpload| Name | In | Type | Required |
|---|
Idempotency-Key | Header | string ≤ 255Replays the first response for a repeated key. | No |
contentType | Body | string 1–127 | Yes |
filename | Body | string 1–255 | Yes |
key | Body | string 1–512 | Yes |
kind | Body | "certificado_vigencia" | "cedula" | "tarjeta_profesional" | "provenance_proof" | "otro" | "einvoice_xml" | "einvoice_pdf" | Yes |
curlcurl -X POST 'https://www.notificado.co/v1/confirm-upload' \
-H "authorization: Bearer $NOTIFICADO_TOKEN" \
-H "idempotency-key: $(uuidgen)" \
-H 'content-type: application/json' \
-d '{
"contentType": "<contentType>",
"filename": "<filename>",
"key": "<key>",
"kind": "certificado_vigencia"
}'
TypeScriptconst response = await fetch('https://www.notificado.co/v1/confirm-upload', {
method: 'POST',
headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json', 'idempotency-key': crypto.randomUUID() },
body: JSON.stringify({
"contentType": "<contentType>",
"filename": "<filename>",
"key": "<key>",
"kind": "certificado_vigencia"
}),
});
const result = await response.json();
Example response
200{
"bytes": -9007199254740991,
"createdAt": "2026-09-25T15:00:00Z",
"filename": "<filename>",
"id": "<id>",
"kind": "certificado_vigencia",
"mime": "<mime>",
"pageCount": -9007199254740991,
"sha256": "<sha256>"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied409 X_IDEMPOTENCY_CONFLICT422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/prove-sirna-email
Firm memberPermission: kyc:submit
proveSirnaEmail
Parameters of proveSirnaEmail| Name | In | Type | Required |
|---|
code | Body | string 6–12 | Yes |
curlcurl -X POST 'https://www.notificado.co/api/prove-sirna-email' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{"code":"<code>"}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/prove-sirna-email', {
method: 'POST',
headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
body: JSON.stringify({
"code": "<code>"
}),
});
const result = await response.json();
Example response
200{
"evaluation": "<evaluation>",
"proven": true,
"reasons": [
"<reasons>"
],
"status": "<status>"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/v1/request-upload
Firm memberPermission: or(kyc:submit, affiliate:self, affiliate:self, case:write)/v1 · bearer tokenIdempotency-KeyMCP tool: requestUpload
Step 1: a signed PUT grant for one PDF, PNG or JPEG (20 MB). PUT the bytes, then confirmUpload(key).
Parameters of requestUpload| Name | In | Type | Required |
|---|
Idempotency-Key | Header | string ≤ 255Replays the first response for a repeated key. | No |
contentType | Body | string 1–127 | Yes |
filename | Body | string 1–255 | Yes |
kind | Body | "certificado_vigencia" | "cedula" | "tarjeta_profesional" | "provenance_proof" | "otro" | "einvoice_xml" | "einvoice_pdf" | Yes |
size | Body | integer 0–9007199254740991 | Yes |
curlcurl -X POST 'https://www.notificado.co/v1/request-upload' \
-H "authorization: Bearer $NOTIFICADO_TOKEN" \
-H "idempotency-key: $(uuidgen)" \
-H 'content-type: application/json' \
-d '{
"contentType": "<contentType>",
"filename": "<filename>",
"kind": "certificado_vigencia",
"size": 0
}'
TypeScriptconst response = await fetch('https://www.notificado.co/v1/request-upload', {
method: 'POST',
headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json', 'idempotency-key': crypto.randomUUID() },
body: JSON.stringify({
"contentType": "<contentType>",
"filename": "<filename>",
"kind": "certificado_vigencia",
"size": 0
}),
});
const result = await response.json();
Example response
200{
"contentType": "<contentType>",
"expiresAt": -9007199254740991,
"key": "<key>",
"maxBytes": -9007199254740991,
"method": "PUT",
"url": "<url>"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied409 X_IDEMPOTENCY_CONFLICT422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/resend-possession-code
Firm memberPermission: kyc:submit
resendPossessionCode
curlcurl -X POST 'https://www.notificado.co/api/resend-possession-code' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/resend-possession-code', {
method: 'POST',
headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
body: JSON.stringify({}),
});
const result = await response.json();
Example response
200{
"alreadyProven": true,
"sentTo": "<sentTo>"
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/set-my-name
Firm memberPermission: kyc:submit
setMyName
Parameters of setMyName| Name | In | Type | Required |
|---|
fullName | Body | string 3–200 | Yes |
curlcurl -X POST 'https://www.notificado.co/api/set-my-name' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{"fullName":"<fullName>"}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/set-my-name', {
method: 'POST',
headers: { 'content-type': 'application/json', origin: 'https://www.notificado.co', cookie: sessionCookie },
body: JSON.stringify({
"fullName": "<fullName>"
}),
});
const result = await response.json();
Example response
200{
"ok": true,
"reverify": true
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds
POST/api/submit-kyc
Firm memberPermission: kyc:submit
submitKyc
Parameters of submitKyc| Name | In | Type | Required |
|---|
cedula | Body | string 1–32 | Yes |
documentType | Body | "CC" | "CE" | "PPT" | No |
fullName | Body | string 1–200 | Yes |
sirnaEmail | Body | string (email) ≤ 320 | Yes |
tarjetaProfesional | Body | string 1–32 | Yes |
vigenciaDocumentId | Body | string (uuid) | No |
curlcurl -X POST 'https://www.notificado.co/api/submit-kyc' \
-b cookies.txt \
-H 'origin: https://www.notificado.co' \
-H 'content-type: application/json' \
-d '{
"cedula": "<cedula>",
"fullName": "<fullName>",
"sirnaEmail": "<sirnaEmail>",
"tarjetaProfesional": "<tarjetaProfesional>"
}'
TypeScriptconst response = await fetch('https://www.notificado.co/api/submit-kyc', {
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>"
}),
});
const result = await response.json();
Example response
200{
"identityId": "<identityId>",
"resubmitted": true,
"status": "<status>",
"warnings": [
"<warnings>"
]
}
Errors
400 X_INPUT_INVALID401 X_UNAUTHENTICATED — no credential, or one that did not resolve403 policy denied422 X_BODY_INVALID429 X_RATE_LIMITED — retry after Retry-After seconds