LingintLingint developer docs

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

FieldTypeDescription
task_idstringThe UUID of the task.
statusstringOne of queued, processing, completed, failed.
progressnumber | nullFraction between 0 and 1 while processing (e.g. 0.42 ≈ 42% complete). null when queued. 1 when completed.
created_atstring | nullISO-8601 timestamp when the task was created. Reserved for future use — currently returns null.
updated_atstring | nullISO-8601 timestamp of the last progress update. Reserved for future use — currently returns null.
completed_atstring | nullISO-8601 timestamp when the task finished. Reserved for future use — currently returns null.
resultobject | nullPresent only when status=completed. Shape depends on the endpoint — see the individual endpoint pages for the result schema.
errorobject | nullPresent 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."
    }
  }
}