task_id
that you use to poll for the result. This is used for operations that may
take longer to complete – such as bulk writes to a connected system.
This guide covers async endpoints in the Unified
API. It does not apply to AI Apply.
How it works
Working with an async endpoint is a three-step process:- Submit – Send a
POSTrequest with your payload. You receive atask_idimmediately. - Poll – Call the corresponding
GETendpoint with thetask_idat regular intervals. - Collect the result – Once the status is
COMPLETEDorFAILED, the response contains the final result or error details.
Task statuses
Every task is in exactly one of three statuses:| Status | Meaning | Terminal? |
|---|---|---|
PENDING | The task is still being processed. Keep polling. | No |
COMPLETED | The task finished processing all items. The data field contains the results. | Yes |
FAILED | The task could not be processed at all. The error field contains the details. | Yes |
COMPLETED means Kombo finished processing the task – it does not
mean every item in the request succeeded. Individual items may have
failed (e.g., one course could not be created in the connected tool).
These per-item outcomes are reported in the data array, where each
entry has its own status of SUCCEEDED or FAILED.In contrast, a task-level FAILED status means the task could not run
at all – for example, because the credentials for the connected tool
are no longer valid. In that case, no items were processed.In some cases, the connected tool supports batch processing, which
Kombo uses internally. When that happens, multiple items may share the
same outcome because they were processed as a single batch. Such
scenarios are usually explained in the endpoint-specific docs or listed
as action constraints in the
coverage grid.Submitting a request
Send aPOST request just like any other action endpoint. The response
contains a task_id that identifies the background task.
The following example uses the LMS bulk upsert courses
endpoint for illustration, but the pattern is
the same for all async endpoints:
Polling for the result
Use thetask_id from the previous step to poll the status endpoint.
While the task is pending
When the task completes
Thedata field contains the results. The exact shape depends on the
endpoint – check the API reference for details.
When the task fails
If the task fails before it can process all items, the response includes anerror object. See the error handling guide for details on how to
interpret it.
Idempotency
Async endpoints are idempotent by default. Sending the same request body for the same integration returns the existing task instead of creating a duplicate. This makes it safe to retry requests without risking duplicate processing – for example, if your initial request times out or you’re unsure whether it went through. Idempotency is derived automatically from the request body and integration details. Manual idempotency keys (e.g., via a header) are not currently supported. If this is something you need, please let us know.Recommended polling strategy
Async endpoints are designed for long-running operations that complete “eventually” rather than within seconds. The right polling interval depends on the action and the volume of data you’re processing – individual endpoints may include more specific guidance in the API reference. As a general rule:- Polling every few minutes is a good starting point for most use cases.
- For very large payloads or operations that you expect to take longer, polling every 30–60 minutes may be more appropriate.
- Stop polling once you receive a terminal status (
COMPLETEDorFAILED). - If a task stays
PENDINGlonger than expected, don’t poll indefinitely. Set a reasonable timeout on your side and treat exceeding it as an error. The right threshold depends on the action – check the API reference for endpoint-specific guidance or reach out to our support.