
code like INTEGRATION.SETUP_SYNC_PENDING:
If you receive one of these error
codes keep requesting the endpoint until you get a successful response.
Alternatively listen to our data-changed webhook.
🦉 The first syncing of data could take a few seconds up to multiple hours, depending on your scope config, the system itself (some are heavily rate-limited) and how much data is in the system of your customer.The UX for your customer should therefore be designed around some delay/waiting time.
- we recommend setting the
page_sizequery param to the maximum batching (250 elements) to minimize number of API calls and maximize API response size.- Our API is optimized to serve a few calls with large payloads at comparatively low latencies. That makes our API perfect for batch-requesting large amounts of data in a few seconds.
- unless you want to get jobs that are not currently open, you should set the
statusesfilter toOPENThe possible options here areOPEN,CLOSED,DRAFT,ARCHIVED - make sure to implement pagination, by using the
nextkey in our API response and passing it in thecursorquery param -
if you are searching for only specific jobs, you can use any of our filters to
search for them more easily using the endpoint-specific filters, such as
remote_ids,job_codes,name_contains,post_url. Here it is important to once again batch requests. Instead of sending 20 individual requests containing one ID each, send one request with comma-separated IDs. - the
job_codefield on jobs corresponds to the human-readable code that HR teams assign in the ATS. In many systems, this is referred to as the “Requisition Code” or “Requisition ID”. Theremote_idfield, by contrast, is the ATS system’s internal identifier and is typically not visible to recruiters.
Getting updates on the data
To get updates on the data, we discourage re-reading the entire dataset every time you want to update something. We have implemented change tracking for you so that you can just process the records that have changed. The change-tracking of Kombo (which you can learn more about here) centers around theupdated_after query parameter, which you can use in the following way:
- Store the timestamp at which you start ingesting the data from the first fetch in your own database. This field should probably be called something like this:
-
Whenever Kombo detects a change, we send you a
data-changedwebhook that looks like this: -
You should make a lookup in your database, finding the
last_fetched_from_kombo_atfor this specific integration and then pass it again in theupdated_afterquery param of the get endpoint, like this:Please be aware that when updating jobs, you want to set the paraminclude_deletedtotrueso that you can be notified of jobs that were deleted. You can learn more about how to handle those jobs here. -
We will return all records that have been altered in one of the following ways:
- property changed (i.e.
statusproperty of a job) - relation property changed (
descriptionof ascreening_questionrelated to a job)
- property changed (i.e.
- If you want to see which property of a record has changed, you have to compare the current data to the data you have stored in your own database. Kombo does not provide you with a “previous” value for the data points.
Handling failing syncs
It is possible that a sync fails, and if that happens, you will still be able to access the data based on the latest successful sync. Once the sync succeeds again, you will be able to get all updates that have happened since the last time. When a sync fails, thesync-finished webhook has a data.sync_state property that is not "SUCCEEDED":
These values mean the sync failed and the problem is only fixable by Kombo
These values mean the sync failed and the problem is only fixable by you/your customers
Let your customer choose which jobs to expose to you
In a lot of cases, your customer won’t want you to supply candidates for all jobs in their ATS but only for some jobs. Unfortunately, that means you have to implement some additional logic after you have synced all jobs from the ATS.🦉 How to solve this is really dependent on the way your product works. You and your team will have to decide what’s best for you - we can just share the solutions we have seen with other customers so far.
Match jobs in your database to ATS jobs
In order to create applications for a job you will always need to have the ID of your job in your database.
This is not a problem if you just fetch all jobs via Kombo and then display them to customers or applicants. But in a lot of cases, you will have to match jobs that got into your database with existing records or records you get from a multiposter.
Manually created jobs
If you have some jobs in your system before the customer connects their ATS, you’ll have to find the jobs in the ATS that correspond to the ones you have. Ideally, you’ll use a unique identifier such as the ID/job code or perhaps even the URL. In cases where you don’t have those data points, you can use the job title to find the most likely match in the ATS. If you have to use this approach, someone needs to check whether the job was linked correctly (either you or your customer). We recommend showing your customer a dropdown list of jobs that you fetched from the ATS. The customer can then just search for the right one and click on it.Multiposters
If your customers are multiposting jobs to your platform you have to match the incoming jobs in a similar way. We strongly recommend requiring multiposters to share the job code or some other unique identifier about the job with you so that you can easily identify the job. If you don’t have a unique identifier you could try to match the job based on it’s title but then you must have a human verifying the correctness of the link.Reacting to deleted/closed jobs
A common way to take jobs offline in an ATS is to close or archive them. In this case we will set the job status toARCHIVED or CLOSED.
Some ATS’s allow the complete deletion of jobs, in which case we will stop receiving that job on the ATS API. When that happens we set the remote_deleted_at timestamp for that record to let you know that this entry does not exist anymore. We will, however, not update the job status to be CLOSED. After 14 days we will completely remove the record from our system.
By default, we will exclude deleted jobs from our API response, so that you don’t ingest any deleted records into your system. To get notified about deleted entries you can set the query param ?include_deleted=true. If you don’t do this, your applications will most likely fail because it’s not possible to apply for a deleted job.