Polling task status
Both /audio2dialog and /dialog2meeting are async. After submitting a task, poll the corresponding status endpoint until status reaches completed or failed.
GET/third-party/note-taker/audio2dialog/{task_id}
GET/third-party/note-taker/dialog2meeting/{task_id}
Response fields
| Field | Type | Description |
|---|---|---|
task_id | string | The UUID of the task. |
status | string | One of queued, processing, completed, failed. |
progress | number | null | Fraction between 0 and 1 while processing (e.g. 0.42 ≈ 42% complete). null when queued. 1 when completed. |
created_at | string | null | ISO-8601 timestamp when the task was created. Reserved for future use — currently returns null. |
updated_at | string | null | ISO-8601 timestamp of the last progress update. Reserved for future use — currently returns null. |
completed_at | string | null | ISO-8601 timestamp when the task finished. Reserved for future use — currently returns null. |
result | object | null | Present only when status=completed. Shape depends on the endpoint — see the individual endpoint pages for the result schema. |
error | object | null | Present only when status=failed. Contains {"code":"TASK_FAILED","message":"..."}. |
Polling strategy
Start polling after 2 seconds. Double the interval on each poll, capping at 15 seconds. For audio longer than one hour, transcription can take close to real time, so intervals of 15 seconds are appropriate for the full wait.
Note
Use
progress as the liveness signal — if it does not advance for several minutes while status is still processing, the task may be stalled. Consider treating it as a failure and resubmitting.Sample responses
Queued
{
"ok": true,
"data": {
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued",
"progress": null,
"created_at": null,
"updated_at": null,
"completed_at": null,
"result": null,
"error": null
}
}Processing
{
"ok": true,
"data": {
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "processing",
"progress": 0.42,
"created_at": null,
"updated_at": null,
"completed_at": null,
"result": null,
"error": null
}
}Completed (audio2dialog)
The result contains a signed URL to a JSON file holding the dialog array. Fetch it with a plain GET (no auth header) before the URL expires.
{
"ok": true,
"data": {
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"progress": 1,
"created_at": null,
"updated_at": null,
"completed_at": null,
"result": {
"dialog_url": "https://storage.example.com/.../dialog.json?signature=...",
"expires_in": 86400
},
"error": null
}
}Completed (dialog2meeting)
The result contains the full Markdown note inline plus a signed DOCX URL valid for 24 hours.
{
"ok": true,
"data": {
"task_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"status": "completed",
"progress": 1,
"created_at": null,
"updated_at": null,
"completed_at": null,
"result": {
"markdown": "# Meeting note\n\n## Attendees\n- Alice\n- Bob\n...",
"docx_url": "https://storage.example.com/.../meeting.docx?signature=..."
},
"error": null
}
}Failed
{
"ok": true,
"data": {
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "failed",
"progress": null,
"created_at": null,
"updated_at": null,
"completed_at": null,
"result": null,
"error": {
"code": "TASK_FAILED",
"message": "Audio file could not be decoded. Ensure the file is a valid audio format."
}
}
}