{ "status": "error", "error": { "code": "INTEGRATION.MODEL_NOT_AVAILABLE", "title": "This data model isn't supported for the selected integration.", "message": "The \"employees\" model is not yet available for Greenhouse. Please reach out to Kombo if you need this functionality.", "log_url": "https://app.kombo.dev/my-prod/logs?interactionId=123456" }}
code (nullable) - A unique identifier for programmatic error handling, used to determine the specific type of error that occurred. See the list below for all available codes.
title (nullable) - A static, human-readable label. (Note: While we initially only used the message field, we are gradually moving static error descriptions to the title field).
message - A dynamic, detailed description of what went wrong in this specific instance.
log_url (nullable) - A link to the log page in the dashboard where you can investigate the issue yourself. If you need assistance, please share this link with our support team.
When building error handling logic, always use the code field to identify specific error types programmatically. See the complete list of error codes below.Important: Do not write conditional logic based on the message field, as message text may change between releases. Similarly, avoid relying on HTTP status codes or other response properties, as these may be updated for consistency across the API.
Scenario: You’re building a job board that automatically applies candidates to positions. A candidate clicks “Apply” on a job they’ve already applied to previously.When you call POST /ats/applications to create the application, the ATS system (like Greenhouse) rejects it because the candidate already applied. However, Kombo categorizes this specific rejection with a structured error code:
Copy
Ask AI
{ "status": "error", "error": { "code": "ATS.APPLICATION_ALREADY_EXISTS", "title": "Candidate has already applied to this job.", "message": "John Doe (john@example.com) has an existing application for Software Engineer position", // ... }}
Error Handling: You can check for this specific error code and handle it appropriately:
Copy
Ask AI
// ...call to create application...const body = await response.json()if (body.error.code === "ATS.APPLICATION_ALREADY_EXISTS") { showInfo("You've already applied to this position.") return}throw new Error("Application failed")
Integration system is unavailable
Scenario: The downstream ATS/HRIS API experiences downtime or maintenance. After internal retries, Kombo returns a categorized remote error.
Copy
Ask AI
{ "status": "error", "error": { "code": "REMOTE.SERVICE_UNAVAILABLE", "title": "The remote system is currently unavailable.", "message": "The API of \"Workday\" is currently unavailable. Please try again later.", "log_url": "https://app.kombo.dev/my-prod/logs?interactionId=123456" }}
Error Handling: Implement retry with exponential backoff, or inform the user to try again later.
Requests failing with PLATFORM.RATE_LIMIT_EXCEEDED, REMOTE.RATE_LIMIT_EXCEEDED or REMOTE.SERVICE_UNAVAILABLE are generally safe to retry. If our load balancer responds with HTTP 503, you should retry the request as well.Validation errors (PLATFORM.INPUT_INVALID and REMOTE.INPUT_INVALID) can be retried after you correct the underlying input.For other errors, avoid automatic retries without human input. Use exponential backoff (preferably with jitter) for retries.
Some errors include an error code that can be used to identify their cause and write application logic to handle them appropriately.
Since new error codes may be added in the future, your application logic should handle unknown error codes gracefully.
Below, you can find a list of all the error codes that can be returned by the API:
Some error codes appear in pairs with different namespaces to indicate their origin:
PLATFORM.RATE_LIMIT_EXCEEDED and REMOTE.RATE_LIMIT_EXCEEDED
PLATFORM.INPUT_INVALID and REMOTE.INPUT_INVALID
PLATFORM.UNKNOWN_ERROR and REMOTE.UNKNOWN_HTTP_ERROR
PLATFORM errors come from Kombo while REMOTE errors (originally) come from the ATS/HRIS system.
We’re still finalizing our error categorization.
Platform errors are already well-categorization, but not every remote-system error is fully classified yet.
If you notice a missing or miscategorized error, please let us know.
Status Code: 500
Title: “An unknown error occurred in our system.”
This is the fallback error message, when an unexpected error has occurred on the side of Kombo.We’re still improving our error categorization. If this seems like it should be a more specific error type (like ATS.JOB_CLOSED), please contact support.
Status Code: 503
Title: “The integration’s setup sync is still running.”
To prevent incomplete or inconsistent data, API requests are blocked until the setup sync completes.For larger remote systems, the initial sync can take longer. Monitor progress in the Kombo dashboard.If it takes unusually long or appears stuck, contact Kombo support. We can review the job and, if appropriate, trigger a limited “recent data only” sync to speed up availability.
Status Code: 500
Title: “The remote system is currently unavailable.”
This is usually due to scheduled maintenance or an outage on the vendor side. Check the logs for details. If it does not resolve within a few hours, please reach out to support.
Status Code: 429
Title: “Kombo has hit the rate limit of the integration’s API. Please try again later.”
Kombo is already retrying requests to the remote system automatically. Only when the backoff exceeds what we can do in the request we abort and return this error.
Status Code: 400
Title: “The remote system returned errors.”
We’re still improving our error categorization. If this seems like it should be a more specific error type (like ATS.JOB_CLOSED), please contact support.
Status Code: 400
Title: “The requested job is closed.”
This occurs when candidates try to apply to jobs that have been closed or archived in the ATS system. This is normal and not critical unless it happens frequently, which may indicate outdated job listings.
Ensure your UI filters out closed jobs and refreshes job statuses regularly. When this error occurs, show the user that the job is closed.
Status Code: 400
Title: “The candidate has already applied to this job.”
Show the candidate that they have already applied to the job. If your system created the first application, restrict the candidate from applying again.