Skip to main content

Notification Payloads

HTTP, FTP and SFTP channels receive the payload below as JSON unless a transformer reshapes it. Email channels receive a formatted mail built from the same data.

Structure​

{
"id": "4c1a9c0e-2f1d-4d3e-9a1b-7f0c2e8b5d21",
"timestamp": "2026-10-25T09:14:03.120Z",
"team_id": "team_123456",
"project_id": "proj_123456",
"step_id": "step_abc123",
"event": "TASK_DISCARDED",
"event_level": "TASK",
"upload": { "...": "see Upload object" },
"task": { "...": "see Task object, null for upload events" },
"issue": { "...": "see Issue object, null unless reported or discarded" },
"duplicate_of_upload_id": null
}
FieldTypeDescription
idStringUnique id of this notification. Use it to deduplicate.
timestampStringISO 8601 time the notification was created.
team_idStringTeam that owns the project.
project_idStringProject in which the event occurred.
step_idString or nullPipeline step of the task. null for upload events.
eventStringOne of the events listed in Notification Events.
event_levelStringUPLOAD or TASK.
uploadObjectThe upload. Always present.
taskObject or nullThe task. Present for task events, null for upload events.
issueObject or nullReviewer message and issues. Present for TASK_REPORTED and TASK_DISCARDED, otherwise null.
duplicate_of_upload_idString or nullId of the earlier upload. Present for UPLOAD_DUPLICATE_DETECTED, otherwise null.

Upload object​

{
"id": "upl_abcdef123456",
"name": "invoice.pdf",
"status": "IN_REVIEW",
"warning_type": null,
"meta": [{ "name": "reference", "value": "INV-2026-001" }],
"folder_id": "folder_123456",
"created_at": "2026-10-25T09:12:40.000Z",
"processed_at": null,
"export_failed_at": null,
"files": [
{
"id": "file_123",
"name": "invoice.pdf",
"content_type": "application/pdf",
"base64": null
}
]
}
FieldTypeDescription
idStringUpload id.
nameStringUpload name, usually the file name or mail subject.
statusStringPROCESSING, IN_REVIEW or COMPLETED.
warning_typeString or nullPOTENTIAL_DUPLICATE_UPLOAD, ALL_ATTACHMENTS_FILTERED or null.
metaArrayMetadata name/value pairs given at upload time.
folder_idStringFolder the upload currently sits in.
created_atStringWhen the upload was created.
processed_atString or nullWhen the upload completed. null until then.
export_failed_atString or nullWhen the last export attempt failed. null when the export succeeded or has not run.
filesArrayFiles in the upload with id, name and content_type. base64 is null in notifications.

Task object​

{
"id": "tsk_123456",
"name": "invoice.pdf",
"created_at": "2026-10-25T09:12:41.000Z",
"meta": [{ "name": "reference", "value": "INV-2026-001" }],
"status": "DISCARDED",
"step_type": "EXTRACT",
"upload_id": "upl_abcdef123456",
"project_id": "proj_123456",
"approved": false,
"failure_reason": null,
"soft_fail_reason": null,
"filter_verdict": "keep",
"filter_score": 0.97,
"exported_at": null,
"export_failed_at": null,
"last_opened_at": "2026-10-25T09:13:55.000Z"
}
FieldTypeDescription
idStringTask id.
nameStringTask name.
created_atStringWhen the task was created.
metaArrayMetadata inherited from the upload.
statusStringPROCESSING, REVIEWING, COMPLETED, FAILED, DISCARDED, FILTERED or UNPROCESSABLE.
step_typeStringStep type: GROUP, SEGMENT, CLASSIFY or EXTRACT.
upload_idStringUpload the task belongs to.
project_idStringProject id.
approvedBooleanWhether a reviewer approved the task.
failure_reasonString or nullPARSING_FAILED, TIMED_OUT or UNKNOWN when status is FAILED.
soft_fail_reasonString or nullThe recoverable error that sent the task to review, for example VALIDATION_FAILED or PREDICTING_ENTITIES_ERROR.
filter_verdictString or nullkeep or filter once the filter model has judged the task.
filter_scoreNumber or nullThe filter model's score for keeping the task.
exported_atString or nullWhen the task was exported.
export_failed_atString or nullWhen the task's export last failed.
last_opened_atString or nullWhen a reviewer last opened the task.

The notification task object does not include page contents or extracted values. Use the Tasks API with task.id to fetch them.

Issue object​

Sent with TASK_REPORTED and TASK_DISCARDED. Both carry the reviewer's free-text message and the issues they ticked.

{
"message": "Totals do not add up, please check page 2.",
"issues": [{ "label": "Wrong value", "value": "total_amount" }],
"reported_by": "user_123456"
}
FieldTypeDescription
messageString or nullThe reviewer's message. Can be empty.
issuesArrayTicked issues as label / value pairs. Can be empty.
reported_byStringId of the user who reported or discarded.

Example: upload processed​

{
"id": "0b7e3f2a-6c7d-4a1e-8f3b-2d9c1e4a5b60",
"timestamp": "2026-10-25T09:20:11.000Z",
"team_id": "team_123456",
"project_id": "proj_123456",
"step_id": null,
"event": "UPLOAD_PROCESSED",
"event_level": "UPLOAD",
"upload": {
"id": "upl_abcdef123456",
"name": "invoice.pdf",
"status": "COMPLETED",
"warning_type": null,
"meta": [],
"folder_id": "folder_processed",
"created_at": "2026-10-25T09:12:40.000Z",
"processed_at": "2026-10-25T09:20:10.000Z",
"export_failed_at": null,
"files": [{ "id": "file_123", "name": "invoice.pdf", "content_type": "application/pdf", "base64": null }]
},
"task": null,
"issue": null,
"duplicate_of_upload_id": null
}

Handling notifications​

  • Branch on event, not on upload.status or task.status: statuses describe the current state, events describe what just happened.
  • Treat id as an idempotency key.
  • Respond with a 2xx status quickly and do the work afterwards. A rejected or slow response is logged as a failed delivery and is not retried.