- get_applications - Get applications
- move_application_to_stage - Move application to stage
- add_application_result_link - Add result link to application
- add_application_note - Add note to application
- get_application_attachments - Get application attachments
- add_application_attachment - Add attachment to application
- reject_application - Reject application
- get_candidates - Get candidates
- create_candidate - Create candidate
- get_candidate_attachments - Get candidate attachments
- add_candidate_attachment - Add attachment to candidate
- add_candidate_result_link - Add result link to candidate
- add_candidate_tag - Add tag to candidate
- remove_candidate_tag - Remove tag from candidate
- get_tags - Get tags
- get_application_stages - Get application stages
- get_jobs - Get jobs
- create_application - Create application
- get_users - Get users
- get_roles - Get roles
- get_offers - Get offers
- get_rejection_reasons - Get rejection reasons
- get_interviews - Get interviews
- import_tracked_application - Import tracked application
Retrieve all applications.
Visit our in-depth guides to learn more about:
- 💡 Being aware of which applications are tracked
- 🚦 Hiring signals
- 📈 Application stage changes
- ❓ ATS-specific limitations
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_applications(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | candidate | n/a | ✓ Yes || candidate → tags | ✗ No | ✗ No || current_stage | n/a | ✓ Yes || job | ✗ No | ✗ No || interviews | ✓ Yes | ✓ Yes || offers | ✓ Yes | ✓ Yes |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
outcomes |
List[str] | ➖ | Filter by a comma-separated list of PENDING, HIRED, DECLINED * PENDING: The application is still being processed. * HIRED: The candidate was hired. * DECLINED: The candidate was declined. Leave this blank to get results matching all values. |
job_ids |
List[str] | ➖ | Filter by a comma-separated list of job IDs. We will only return applications that are related to any of the jobs. |
job_remote_ids |
List[str] | ➖ | Filter by a comma-separated list of job remote IDs. We will only return applications that are related to any of the jobs. |
current_stage_ids |
List[str] | ➖ | Filter by a comma-separated list of application stage IDs. We will only return applications that are currently in any of the stages. |
remote_created_after |
date | ➖ | Filter applications by the day they were created in the remote system. This allows you to get applications that were created on or after a certain day. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsApplicationsResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Moves an application to a specified stage. Use job-specific stages from GET /jobs, not the deprecated /application-stages endpoint.
This endpoint requires the permission **Set application stage** to be enabled in [your scope config](/scopes).{
"stage_id": "3PJ8PZhZZa1eEdd2DtPNtVup",
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.move_application_to_stage(application_id="<id>", stage_id="<id>")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.move_application_to_stage(application_id="<id>", stage_id="<id>")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.move_application_to_stage(application_id="GRKdd9dibYKKCrmGRSMJf3wu", stage_id="3PJ8PZhZZa1eEdd2DtPNtVup")
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | The Kombo ID of the application you want to move to a different stage. |
stage_id |
str | ✔️ | The Kombo ID of the stage to move the application to. This stage must be allowed for the job that the application is connected to. Get available stages from the stages property on the job, not from the deprecated application-stages endpoint. |
remote_fields |
Optional[models.PutAtsApplicationsApplicationIDStageRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PutAtsApplicationsApplicationIDStagePositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Add a result link to an application.
This can, for example, be used to link a candidate back to a test result/assessment in your application. As not all ATS tools have a "result link" feature, we sometimes repurpose other fields to expose it.
This endpoint requires the permission **Add result links** to be enabled in [your scope config](/scopes).{
"application_id": "8Xi6iZrwusZqJmDGXs49GBmJ",
"label": "Assessment Result",
"url": "https://example.com/test-results/5BtP1WC1UboS7CF3yxjKcvjG",
"details": {
"custom_field_name_prefix": "Acme:",
"attributes": [
{
"key": "Score",
"value": "100%"
},
{
"key": "Time",
"value": "2:30h"
}
]
},
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_result_link(application_id="<id>", label="<value>", url="https://dapper-grandson.com/")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_result_link(application_id="<id>", label="<value>", url="https://dapper-grandson.com/")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_result_link(application_id="8Xi6iZrwusZqJmDGXs49GBmJ", label="Assessment Result", url="https://example.com/test-results/5BtP1WC1UboS7CF3yxjKcvjG", details={
"custom_field_name_prefix": "Acme:",
"attributes": [
{
"key": "Score",
"value": "100%",
},
{
"key": "Time",
"value": "2:30h",
},
],
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | The Kombo ID of the application you want to create the link for. |
label |
str | ✔️ | If we can display a display name for the link, we will use this label. |
url |
str | ✔️ | URL of the link. |
details |
Optional[models.PostAtsApplicationsApplicationIDResultLinksRequestBodyDetails] | ➖ | Additional details with attributes that will be added to the result. This can be percentages, scores, or any text. We generally recommend using short attribute keys and a short custom_field_name_prefix to avoid overflowing the ATS UI. |
remote_fields |
Optional[models.PostAtsApplicationsApplicationIDResultLinksRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsApplicationsApplicationIDResultLinksPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Add a note to an application.
Add extra information to an application. This can be any extra text information you want to add to an application.
This endpoint requires the permission **Add notes** to be enabled in [your scope config](/scopes).{
"content": "A new message from the candidate is available in YourChat!",
"content_type": "PLAIN_TEXT",
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_note(application_id="<id>", content="<value>", content_type="PLAIN_TEXT")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_note(application_id="<id>", content="<value>", content_type="PLAIN_TEXT")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_note(application_id="8Xi6iZrwusZqJmDGXs49GBmJ", content="A new message from the candidate is available in YourChat!", content_type="PLAIN_TEXT")
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | The Kombo ID of the application you want to create the note for. |
content |
str | ✔️ | UTF-8 content of the note. |
content_type |
models.ContentType | ✔️ | Content type of the note. Currently only PLAIN_TEXT is supported. |
remote_fields |
Optional[models.PostAtsApplicationsApplicationIDNotesRequestBodyRemoteFields] | ➖ | Tool specific remote fields for the note. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsApplicationsApplicationIDNotesPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Get attachments from a candidate or application.
Get attachments from an application. If the ATS stores the attachments on the candidate, it will get the attachments from the corresponding candidate instead.
This endpoint requires the permission **Read document attachments** to be enabled in [your scope config](/scopes).from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_application_attachments(application_id="8Xi6iZrwusZqJmDGXs49GBmJ")
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | The Kombo ID of the application you want to obtain attachments for. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsApplicationsApplicationIDAttachmentsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Uploads an attachment file for the specified applicant.
If adding an attachment to an application is not supported by the integration, the attachment will be [added to the candidate](/ats/v1/post-candidates-candidate-id-attachments) instead. This endpoint requires the permission **Add attachments** to be enabled in [your scope config](/scopes).{
"application_id": "GRKdd9dibYKKCrmGRSMJf3wu",
"attachment": {
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
},
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_attachment(application_id="<id>", attachment={
"name": "<value>",
"type": "CV",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_attachment(application_id="<id>", attachment={
"name": "<value>",
"type": "CV",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_application_attachment(application_id="GRKdd9dibYKKCrmGRSMJf3wu", attachment={
"name": "Frank Doe CV.txt",
"content_type": "text/plain",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | POST /ats/applications/:application_id/attachments Parameter |
attachment |
models.PostAtsApplicationsApplicationIDAttachmentsRequestBodyAttachment | ✔️ | N/A |
remote_fields |
Optional[models.PostAtsApplicationsApplicationIDAttachmentsRequestBodyRemoteFields] | ➖ | N/A |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsApplicationsApplicationIDAttachmentsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Rejects an application with a provided reason.
Rejects an application with a provided reason. Optionally, you can provide a free text note. You can get the list of rejection reasons with our Get rejection reasons endpoint.
This endpoint requires the permission **Reject applications** to be enabled in [your scope config](/scopes).{
"rejection_reason_id": "3PJ8PZhZZa1eEdd2DtPNtVup",
"note": "Candidate was a great culture fit but didn't bring the hard skills we need.",
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.reject_application(application_id="<id>", rejection_reason_id="<id>")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.reject_application(application_id="<id>", rejection_reason_id="<id>")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.reject_application(application_id="GRKdd9dibYKKCrmGRSMJf3wu", rejection_reason_id="3PJ8PZhZZa1eEdd2DtPNtVup", note="Candidate was a great culture fit but didn't bring the hard skills we need.")
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
application_id |
str | ✔️ | The Kombo ID of the application you want to reject. |
rejection_reason_id |
str | ✔️ | The Kombo ID of the rejection reason. |
note |
Optional[str] | ➖ | A optional free text rejection note. Passed through if possible. |
remote_fields |
Optional[models.PostAtsApplicationsApplicationIDRejectRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsApplicationsApplicationIDRejectPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all candidates.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_candidates(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | applications | ✓ Yes | ✓ Yes || applications → current_stage | ✗ No | ✗ No || applications → job | ✗ No | ✗ No || tags | ✓ Yes | ✗ No |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
email |
Optional[str] | ➖ | Filter the candidates based on an email address. When set, returns only the candidates where the given email is in email_addresses. This filter is case-insensitive. |
job_ids |
List[str] | ➖ | Filter by a comma-separated list of job IDs. We will only return candidates that have applied to any of the jobs. |
first_name |
Optional[str] | ➖ | Filter candidates by first name. This filter is case-insensitive and matches the exact first name. Fuzzy matching might be enabled in the future, so consider this for your implementation. |
last_name |
Optional[str] | ➖ | Filter candidates by last name. This filter is case-insensitive and matches the exact last name. Fuzzy matching might be enabled in the future, so consider this for your implementation. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsCandidatesResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Create a new candidate and application for the specified job.
**We recommend using the [Create application](/ats/v1/post-jobs-job-id-applications) endpoint instead.** We realized that in practice it was always more about creating _applications_ instead of _candidates_, so we created a new, more aptly named one that you should use instead: [Create application](/ats/v1/post-jobs-job-id-applications)
Using it also has the benefit that we return the newly created applicant at the root level, so you can easily store its ID.
</Warning>
{
"candidate": {
"first_name": "Frank",
"last_name": "Doe",
"company": "Acme Inc.",
"title": "Head of Integrations",
"email_address": "frank.doe@example.com",
"phone_number": "+1-541-754-3010",
"gender": "MALE",
"salary_expectations": {
"amount": 100000,
"period": "YEAR"
},
"availability_date": "2021-01-01",
"location": {
"city": "New York",
"country": "US",
"state": "NY"
},
"social_links": [
{
"url": "https://www.linkedin.com/in/frank-doe-123456789/"
},
{
"url": "https://twitter.com/frankdoe"
}
]
},
"application": {
"job_id": "BDpgnpZ148nrGh4mYHNxJBgx",
"stage_id": "8x3YKRDcuRnwShdh96ShBNn1"
},
"attachments": [
{
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
],
"screening_question_answers": [
{
"question_id": "3phFBNXRweGnDmsU9o2vdPuQ",
"answer": "Yes"
},
{
"question_id": "EYJjhMQT3LtVKXnTbnRT8s6U",
"answer": [
"GUzE666zfyjeoCJX6A8n7wh6",
"5WPHzzKAv8cx97KtHRUV96U8",
"7yZfKGzWigXxxRTygqAfHvyE"
]
}
],
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_candidate(candidate={
"first_name": "Crystal",
"last_name": "Prohaska",
"email_address": "Adelia.Littel99@yahoo.com",
}, application={
"job_id": "<id>",
}, screening_question_answers=[
{
"question_id": "D8yPrjXXvA2XeBksTmrVvKSn",
"answer": "Yes",
},
])
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_candidate(candidate={
"first_name": "Crystal",
"last_name": "Prohaska",
"email_address": "Adelia.Littel99@yahoo.com",
}, application={
"job_id": "<id>",
}, screening_question_answers=[
{
"question_id": "D8yPrjXXvA2XeBksTmrVvKSn",
"answer": "Yes",
},
])
# Handle response
print(res)from kombo import Kombo
from kombo.utils import parse_datetime
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_candidate(candidate={
"first_name": "Frank",
"last_name": "Doe",
"email_address": "frank.doe@example.com",
"company": "Acme Inc.",
"title": "Head of Integrations",
"phone_number": "+1-541-754-3010",
"location": {
"city": "New York",
"country": "US",
"state": "NY",
},
"gender": "MALE",
"availability_date": parse_datetime("2021-01-01T00:00:00Z"),
"salary_expectations": {
"period": "YEAR",
"amount": 100000,
},
"social_links": [
{
"url": "https://www.linkedin.com/in/frank-doe-123456789/",
},
{
"url": "https://twitter.com/frankdoe",
},
],
}, application={
"job_id": "BDpgnpZ148nrGh4mYHNxJBgx",
"stage_id": "8x3YKRDcuRnwShdh96ShBNn1",
}, screening_question_answers=[
{
"question_id": "3phFBNXRweGnDmsU9o2vdPuQ",
"answer": "Yes",
},
{
"question_id": "EYJjhMQT3LtVKXnTbnRT8s6U",
"answer": [
"GUzE666zfyjeoCJX6A8n7wh6",
"5WPHzzKAv8cx97KtHRUV96U8",
"7yZfKGzWigXxxRTygqAfHvyE",
],
},
], attachments=[
{
"name": "Frank Doe CV.txt",
"content_type": "text/plain",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
},
])
# Handle response
print(res)| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
candidate |
models.PostAtsCandidatesRequestBodyCandidate | ✔️ | N/A | |
application |
models.PostAtsCandidatesRequestBodyApplication | ✔️ | Currently, every candidate has one application. If you are interested in talent pools, please contact Kombo. | |
screening_question_answers |
List[models.PostAtsCandidatesRequestBodyScreeningQuestionAnswer] | ➖ | Array of answers to screening questions. Currently, not all question types are supported, and unsupported ones will not be submitted. The available questions for a job can be retrieved from the get jobs endpoint. The answers will be validated based on the format of the questions. Make sure to follow this schema to avoid errors. |
[ { "question_id": "D8yPrjXXvA2XeBksTmrVvKSn", "answer": "Yes" } ] |
attachments |
List[models.PostAtsCandidatesRequestBodyAttachment] | ➖ | An array of the attachments you would like upload. | |
source |
Optional[models.PostAtsCandidatesRequestBodySource] | ➖ | : warning: ** DEPRECATED : This will be removed in a future release, please migrate away from it as soon as possible. ( you're a job board or recruiting service, you can use this to make sure your customers can see which candidates came from you. This is deprecated because writing sources requires users to do some setup in most ATSs. |
|
sourced_by |
Optional[models.PostAtsCandidatesRequestBodySourcedBy] | ➖ | Credit the recruiter or team member who sourced this candidate. While the source field tracks the channel/platform (e.g., "Awesome Jobboard"), the sourced_by field tracks the individual person responsible for finding the candidate. |
|
gdpr_consent |
Optional[models.PostAtsCandidatesRequestBodyGdprConsent] | ➖ | Optional GDPR consent information required in some jurisdictions (like the Czech Republic or Slovakia). | |
remote_fields |
Optional[models.PostAtsCandidatesRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. | |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsCandidatesPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Get attachments from a candidate, including all attachments of all of their applications.
This endpoint requires the permission **Read document attachments** to be enabled in [your scope config](/scopes).from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_candidate_attachments(candidate_id="8Xi6iZrwusZqJmDGXs49GBmJ")
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
candidate_id |
str | ✔️ | The Kombo ID of the candidate you want to obtain attachments for. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsCandidatesCandidateIDAttachmentsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Uploads an attachment file for the specified candidate.
**We recommend using the [add attachment to application](/ats/v1/post-applications-application-id-attachments) endpoint instead.**We realized that in practice it was always more about adding attachments to applications instead of candidates, so we created a new, more aptly named one that you should use instead: add attachment to application
This endpoint requires the permission **Add attachments** to be enabled in [your scope config](/scopes).{
"candidate_id": "GRKdd9dibYKKCrmGRSMJf3wu",
"attachment": {
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_attachment(candidate_id="<id>", attachment={
"name": "<value>",
"type": "COVER_LETTER",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_attachment(candidate_id="<id>", attachment={
"name": "<value>",
"type": "COVER_LETTER",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_attachment(candidate_id="GRKdd9dibYKKCrmGRSMJf3wu", attachment={
"name": "Frank Doe CV.txt",
"content_type": "text/plain",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
candidate_id |
str | ✔️ | The Kombo ID of the candidate you want to add the attachment to. |
attachment |
models.PostAtsCandidatesCandidateIDAttachmentsRequestBodyAttachment | ✔️ | N/A |
remote_fields |
Optional[models.PostAtsCandidatesCandidateIDAttachmentsRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsCandidatesCandidateIDAttachmentsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Add a result link to a candidate.
**We recommend to use [add result link to application](/ats/v1/post-applications-application-id-result-links) instead.**This can, for example, be used to link a candidate back to a test result/assessment in your application. As not all ATS tools have a "result link" feature, we sometimes repurpose other fields to expose it.
This endpoint requires the permission **Add result links** to be enabled in [your scope config](/scopes).{
"label": "Assessment Result",
"url": "https://example.com/test-results/5BtP1WC1UboS7CF3yxjKcvjG",
"details": {
"custom_field_name_prefix": "Acme:",
"attributes": [
{
"key": "Score",
"value": "100%"
},
{
"key": "Time",
"value": "2:30h"
}
]
},
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_result_link(candidate_id="<id>", label="<value>", url="https://thrifty-cellar.net")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_result_link(candidate_id="<id>", label="<value>", url="https://thrifty-cellar.net")
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_result_link(candidate_id="8Xi6iZrwusZqJmDGXs49GBmJ", label="Assessment Result", url="https://example.com/test-results/5BtP1WC1UboS7CF3yxjKcvjG", details={
"custom_field_name_prefix": "Acme:",
"attributes": [
{
"key": "Score",
"value": "100%",
},
{
"key": "Time",
"value": "2:30h",
},
],
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
candidate_id |
str | ✔️ | The Kombo ID of the candidate you want to add the result link to. |
label |
str | ✔️ | If the system allows us to display a display name for the link, we will use this label. |
url |
str | ✔️ | URL of the link. |
details |
Optional[models.PostAtsCandidatesCandidateIDResultLinksRequestBodyDetails] | ➖ | Additional details with attributes that will be added to the result. This can be percentages, scores, or any text. We generally recommend using short attribute keys and a short custom_field_name_prefix to avoid overflowing the ATS UI. |
remote_fields |
Optional[models.PostAtsCandidatesCandidateIDResultLinksRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsCandidatesCandidateIDResultLinksPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Add a tag to a candidate.
Kombo takes care of creating the tag if required, finding out the right ID, and appending it to the list of tags.
This endpoint requires the permission **Manage tags** to be enabled in [your scope config](/scopes).{
"tag": {
"name": "Excellent Fit"
}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_tag(candidate_id="<id>", tag={
"name": "<value>",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_tag(candidate_id="<id>", tag={
"name": "<value>",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.add_candidate_tag(candidate_id="8Xi6iZrwusZqJmDGXs49GBmJ", tag={
"name": "Excellent Fit",
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
candidate_id |
str | ✔️ | The Kombo ID of the candidate you want to add the tag to. |
tag |
models.PostAtsCandidatesCandidateIDTagsRequestBodyTag | ✔️ | N/A |
remote_fields |
Optional[models.PostAtsCandidatesCandidateIDTagsRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsCandidatesCandidateIDTagsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Remove a tag from a candidate based on its name.
This will also succeed if the tag does not exist on the candidate.
This endpoint requires the permission **Manage tags** to be enabled in [your scope config](/scopes).{
"tag": {
"name": "Excellent Fit"
}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.remove_candidate_tag(candidate_id="<id>", tag={
"name": "<value>",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.remove_candidate_tag(candidate_id="<id>", tag={
"name": "<value>",
})
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.remove_candidate_tag(candidate_id="8Xi6iZrwusZqJmDGXs49GBmJ", tag={
"name": "Excellent Fit",
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
candidate_id |
str | ✔️ | The Kombo ID of the candidate you want to remove the tag from. |
tag |
models.DeleteAtsCandidatesCandidateIDTagsRequestBodyTag | ✔️ | N/A |
remote_fields |
Optional[models.DeleteAtsCandidatesCandidateIDTagsRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.DeleteAtsCandidatesCandidateIDTagsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all tags.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_tags(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, only changes to the returned record itself are considered. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Get all application stages available in the ATS.
**This endpoint is deprecated!**Get all application stages available in the ATS. This is deprecated because most ATS systems have separate sets of stages for each job. We'd recommend using the stages property from the GET Jobs endpoint instead.
Important: Using global stages can cause "Stage not found" errors when moving applications, especially with systems like Workable that have job-specific stages.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_application_stages(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, only changes to the returned record itself are considered. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsApplicationStagesResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all jobs.
Visit our in-depth guides to learn more about:
- 🔄 Getting updates of the data
- ❗ Handling failing syncs
- 🔍 Letting your customer choose which jobs to expose
- 🔗 Matching jobs in your database to ATS jobs
- 🗑️ Reacting to deleted/closed jobs
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_jobs(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | stages | ✓ Yes | ✗ No || screening_questions | ✓ Yes | ✗ No || job_postings | ✓ Yes | ✓ Yes || hiring_team | ✓ Yes | ✗ No |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
job_codes |
List[str] | ➖ | Filter by a comma-separated list of job codes. |
post_url |
Optional[str] | ➖ | Filter by the post_url field. Can be used to find a job based on its public posting URL. |
statuses |
List[str] | ➖ | Filter by a comma-separated list of OPEN, CLOSED, DRAFT, ARCHIVED Leave this blank to get results matching all values. |
employment_types |
List[str] | ➖ | Filter by a comma-separated list of FULL_TIME, PART_TIME, CONTRACT, SEASONAL, INTERNSHIP Leave this blank to get results matching all values. |
visibilities |
List[str] | ➖ | Filter by a comma-separated list of PUBLIC, INTERNAL, UNLISTED, CONFIDENTIAL Leave this blank to get results matching all values. |
remote_created_after |
date | ➖ | Filter jobs by the day they were created in the remote system. This allows you to get jobs that were created on or after a certain day. |
name_contains |
Optional[str] | ➖ | Filter by the name field. Can be used to find a job by keywords present in the job name. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Create a new application and candidate for the specified job.
Visit our in-depth guides to learn more about:
- 🌐 Setting the source of the application
- 📎 Uploading attachments with the application
- ♻️ Retry behaviour
- ✏️ Writing answers to screening questions
⚠️ Handling ATS-specific limitations
{
"candidate": {
"first_name": "Frank",
"last_name": "Doe",
"company": "Acme Inc.",
"title": "Head of Integrations",
"email_address": "frank.doe@example.com",
"phone_number": "+1-541-754-3010",
"gender": "MALE",
"salary_expectations": {
"amount": 100000,
"period": "YEAR"
},
"availability_date": "2021-01-01",
"location": {
"city": "New York",
"zip_code": "10016",
"state": "NY",
"country": "US"
}
},
"stage_id": "8x3YKRDcuRnwShdh96ShBNn1",
"attachments": [
{
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
],
"screening_question_answers": [
{
"question_id": "3phFBNXRweGnDmsU9o2vdPuQ",
"answer": "Yes"
},
{
"question_id": "EYJjhMQT3LtVKXnTbnRT8s6U",
"answer": [
"GUzE666zfyjeoCJX6A8n7wh6",
"5WPHzzKAv8cx97KtHRUV96U8",
"7yZfKGzWigXxxRTygqAfHvyE"
]
}
],
"remote_fields": {}
}from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_application(job_id="<id>", candidate={
"first_name": "Jayda",
"last_name": "Rogahn",
"email_address": "Rowena74@hotmail.com",
}, screening_question_answers=[
{
"question_id": "D8yPrjXXvA2XeBksTmrVvKSn",
"answer": "Yes",
},
])
# Handle response
print(res)from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_application(job_id="<id>", candidate={
"first_name": "Jayda",
"last_name": "Rogahn",
"email_address": "Rowena74@hotmail.com",
}, screening_question_answers=[
{
"question_id": "D8yPrjXXvA2XeBksTmrVvKSn",
"answer": "Yes",
},
])
# Handle response
print(res)from kombo import Kombo
from kombo.utils import parse_datetime
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.create_application(job_id="BDpgnpZ148nrGh4mYHNxJBgx", candidate={
"first_name": "Frank",
"last_name": "Doe",
"email_address": "frank.doe@example.com",
"company": "Acme Inc.",
"title": "Head of Integrations",
"phone_number": "+1-541-754-3010",
"location": {
"city": "New York",
"country": "US",
"state": "NY",
"zip_code": "10016",
},
"gender": "MALE",
"availability_date": parse_datetime("2021-01-01T00:00:00Z"),
"salary_expectations": {
"period": "YEAR",
"amount": 100000,
},
}, stage_id="8x3YKRDcuRnwShdh96ShBNn1", attachments=[
{
"name": "Frank Doe CV.txt",
"content_type": "text/plain",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
},
], screening_question_answers=[
{
"question_id": "3phFBNXRweGnDmsU9o2vdPuQ",
"answer": "Yes",
},
{
"question_id": "EYJjhMQT3LtVKXnTbnRT8s6U",
"answer": [
"GUzE666zfyjeoCJX6A8n7wh6",
"5WPHzzKAv8cx97KtHRUV96U8",
"7yZfKGzWigXxxRTygqAfHvyE",
],
},
])
# Handle response
print(res)| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
job_id |
str | ✔️ | The Kombo ID or Remote ID of the Job this candidate should apply for. If you want to use the ID of the integrated system (remote_id) you need to prefix the id with "remote:". You can use the remote ID if you do not want to sync jobs. | |
candidate |
models.PostAtsJobsJobIDApplicationsRequestBodyCandidate | ✔️ | N/A | |
stage_id |
Optional[str] | ➖ | Stage this candidate should be in. If left out, the default stage for this job will be used. You can obtain the possible stage_ids from the get-jobs endpoint. |
|
attachments |
List[models.PostAtsJobsJobIDApplicationsRequestBodyAttachment] | ➖ | Array of the attachments you would like to upload. The first CV in the attachments will be treated as the resume of the candidate when the tool allows previewing a resume. | |
source |
Optional[models.PostAtsJobsJobIDApplicationsRequestBodySource] | ➖ | : warning: ** DEPRECATED : This will be removed in a future release, please migrate away from it as soon as possible. ( you're a job board or recruiting service, you can use this to make sure your customers can see which candidates came from you. This is deprecated because writing sources requires users to do some setup in most ATSs. |
|
sourced_by |
Optional[models.PostAtsJobsJobIDApplicationsRequestBodySourcedBy] | ➖ | Credit the recruiter or team member who sourced this candidate. While the source field tracks the channel/platform (e.g., "Awesome Jobboard"), the sourced_by field tracks the individual person responsible for finding the candidate. |
|
gdpr_consent |
Optional[models.PostAtsJobsJobIDApplicationsRequestBodyGdprConsent] | ➖ | Optional GDPR consent information required in some jurisdictions (like the Czech Republic or Slovakia). | |
remote_fields |
Optional[models.PostAtsJobsJobIDApplicationsRequestBodyRemoteFields] | ➖ | Additional fields that we will pass through to specific ATS systems. | |
screening_question_answers |
List[models.PostAtsJobsJobIDApplicationsRequestBodyScreeningQuestionAnswer] | ➖ | Array of answers to screening questions. Currently, not all question types are supported, and unsupported ones will not be submitted. The available questions for a job can be retrieved from the get jobs endpoint. The answers will be validated based on the format of the questions. Make sure to follow this schema to avoid errors. |
[ { "question_id": "D8yPrjXXvA2XeBksTmrVvKSn", "answer": "Yes" } ] |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsJobsJobIDApplicationsPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all users.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_users(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | system_role_assignment | ✓ Yes | ✓ Yes |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
emails |
List[str] | ➖ | Filter by a comma-separated list of emails. We will only return users who have any of the emails. The format of the emails is case-insensitive. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all roles.
Visit our in-depth guide about roles to learn more.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_roles(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, only changes to the returned record itself are considered. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
scopes |
List[str] | ➖ | Filter by a comma-separated list of SYSTEM, JOB * SYSTEM: System-wide roles that apply globally (e.g., an "Admin" role). * JOB: Job-scoped roles that apply to specific jobs (e.g., a "Hiring Manager" role). Leave this blank to get results matching all values. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all offers.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_offers(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | application | n/a | ✓ Yes || application → candidate | ✗ No | ✗ No || application → job | ✗ No | ✗ No |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all rejection reasons.
Get all rejection reasons available in the system. The Kombo ID is required in the associated reject application action.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_rejection_reasons(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, only changes to the returned record itself are considered. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsRejectionReasonsResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Retrieve all interviews.
Top level filters use AND, while individual filters use OR if they accept multiple arguments. That means filters will be resolved like this: (id IN ids) AND (remote_id IN remote_ids)
from kombo import Kombo
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.get_interviews(page_size=100, include_deleted=False, ignore_unsupported_filters=False)
while res is not None:
# Handle items
res = res.next()| Parameter | Type | Required | Description |
|---|---|---|---|
cursor |
Optional[str] | ➖ | An optional cursor string used for pagination. This can be retrieved from the next property of the previous page response. |
page_size |
Optional[int] | ➖ | The number of results to return per page. Maximum is 250. |
updated_after |
date | ➖ | Filter the entries based on the modification date in format YYYY-MM-DDTHH:mm:ss.sssZ. Returns records where either the record itself OR its nested data has been updated since this timestamp, even if the record's own changed_at field remains unchanged.If you want to track entry deletion, also set the include_deleted=true query parameter, because otherwise, deleted entries will be hidden.For more details, see Understanding changed_at vs updated_after Behavior. For this endpoint, updated_after matches when the returned record changed, or when related data changed as described below.| Path | Relationship | Target Record | | --- | --- | --- | | interviewers | ✓ Yes | ✗ No || application | n/a | ✓ Yes || application → candidate | ✗ No | ✗ No || application → job | ✗ No | ✗ No |Relationship: Whether adding or removing entries from this list triggers an update (n/a for single references that are not lists). Target Record: Whether changes to the linked record itself trigger an update. |
include_deleted |
Optional[bool] | ➖ | By default, deleted entries are not returned. Use the include_deleted query param to include deleted entries too. |
ignore_unsupported_filters |
Optional[bool] | ➖ | When set to true, filters targeting fields not supported by this integration will be ignored instead of filtering out all results. |
ids |
List[str] | ➖ | Filter by a comma-separated list of IDs such as 222k7eCGyUdgt2JWZDNnkDs3,B5DVmypWENfU6eMe6gYDyJG3. |
remote_ids |
List[str] | ➖ | Filter by a comma-separated list of remote IDs. |
job_ids |
List[str] | ➖ | Filter by a comma-separated list of job IDs. We will only return interviews for applications associated with any of these jobs. |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.GetAtsInterviewsResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |
Import tracked application
Retroactively import existing applications into Kombo's tracking system. This is particularly useful if you have enabled the 'sync only created applications' setting and want to start tracking applications that were created before using Kombo.
To import an application, you'll need to provide specific identifiers based on the ATS. The available id_type values are defined by Kombo based on the tool's API capabilities. Please reach out to Kombo support if you require further types to be supported.
Once imported, Kombo will automatically fetch and update the application's complete data during the next sync.
{
"tracked_at": "2024-04-12T14:33:47.000Z",
"successfactors": {
"id_type": "application_remote_id",
"application_remote_id": "1224042"
}
}from kombo import Kombo
from kombo.utils import parse_datetime
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.import_tracked_application(tracked_at=parse_datetime("2024-07-27T05:49:24.648Z"))
# Handle response
print(res)from kombo import Kombo
from kombo.utils import parse_datetime
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.import_tracked_application(tracked_at=parse_datetime("2024-07-27T05:49:24.648Z"))
# Handle response
print(res)from kombo import Kombo
from kombo.utils import parse_datetime
with Kombo(
integration_id="workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key="<YOUR_BEARER_TOKEN_HERE>",
) as k_client:
res = k_client.ats.import_tracked_application(tracked_at=parse_datetime("2024-04-12T14:33:47Z"), successfactors={
"id_type": "application_remote_id",
"application_remote_id": "1224042",
})
# Handle response
print(res)| Parameter | Type | Required | Description |
|---|---|---|---|
tracked_at |
date | ✔️ | YYYY-MM-DDTHH:mm:ss.sssZ |
erecruiter |
Optional[models.PostAtsImportTrackedApplicationRequestBodyErecruiterUnion] | ➖ | N/A |
successfactors |
Optional[models.PostAtsImportTrackedApplicationRequestBodySuccessfactorsUnion] | ➖ | N/A |
recruitee |
Optional[models.PostAtsImportTrackedApplicationRequestBodyRecruiteeUnion] | ➖ | N/A |
greenhouse |
Optional[models.PostAtsImportTrackedApplicationRequestBodyGreenhouseUnion] | ➖ | N/A |
onlyfy |
Optional[models.PostAtsImportTrackedApplicationRequestBodyOnlyfyUnion] | ➖ | N/A |
smartrecruiters |
Optional[models.PostAtsImportTrackedApplicationRequestBodySmartrecruitersUnion] | ➖ | N/A |
retries |
Optional[utils.RetryConfig] | ➖ | Configuration to override the default retry behavior of the client. |
models.PostAtsImportTrackedApplicationPositiveResponse
| Error Type | Status Code | Content Type |
|---|---|---|
| errors.KomboAtsError | default | application/json |
| errors.SDKDefaultError | 4XX, 5XX | */* |