Python
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)import { Kombo } from "@kombo-api/sdk";
const kombo = new Kombo({
integration_id: "workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key: "<YOUR_BEARER_TOKEN_HERE>",
});
async function run() {
const result = await kombo.ats.addCandidateAttachment({
candidate_id: "GRKdd9dibYKKCrmGRSMJf3wu",
body: {
attachment: {
name: "Frank Doe CV.txt",
content_type: "text/plain",
data: "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
type: "CV",
},
},
});
console.log(result);
}
run();require 'kombo'
Models = ::Kombo::Models
s = ::Kombo::Kombo.new(
integration_id: 'workday:HWUTwvyx2wLoSUHphiWVrp28',
security: Models::Shared::Security.new(
api_key: '<YOUR_BEARER_TOKEN_HERE>'
)
)
res = s.ats.add_candidate_attachment(candidate_id: 'GRKdd9dibYKKCrmGRSMJf3wu', body: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBody.new(
attachment: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBodyAttachment.new(
name: 'Frank Doe CV.txt',
content_type: 'text/plain',
data: 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
type: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBodyType::CV
)
))
unless res.post_ats_candidates_candidate_id_attachments_positive_response.nil?
# handle response
endcurl --request POST \
--url https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Integration-Id: <x-integration-id>' \
--data '
{
"attachment": {
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
}
'const options = {
method: 'POST',
headers: {
'X-Integration-Id': '<x-integration-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
attachment: {
name: 'Frank Doe CV.txt',
data: 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
type: 'CV',
content_type: 'text/plain'
}
})
};
fetch('https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'attachment' => [
'name' => 'Frank Doe CV.txt',
'data' => 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
'type' => 'CV',
'content_type' => 'text/plain'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Integration-Id: <x-integration-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments"
payload := strings.NewReader("{\n \"attachment\": {\n \"name\": \"Frank Doe CV.txt\",\n \"data\": \"SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=\",\n \"type\": \"CV\",\n \"content_type\": \"text/plain\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Integration-Id", "<x-integration-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments")
.header("X-Integration-Id", "<x-integration-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attachment\": {\n \"name\": \"Frank Doe CV.txt\",\n \"data\": \"SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=\",\n \"type\": \"CV\",\n \"content_type\": \"text/plain\"\n }\n}")
.asString();{
"status": "<string>",
"data": {},
"warnings": [
{
"message": "<string>"
}
]
}Candidates
Add attachment to candidate
Uploads an attachment file for the specified candidate.
POST
/
ats
/
candidates
/
{candidate_id}
/
attachments
Python
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)import { Kombo } from "@kombo-api/sdk";
const kombo = new Kombo({
integration_id: "workday:HWUTwvyx2wLoSUHphiWVrp28",
api_key: "<YOUR_BEARER_TOKEN_HERE>",
});
async function run() {
const result = await kombo.ats.addCandidateAttachment({
candidate_id: "GRKdd9dibYKKCrmGRSMJf3wu",
body: {
attachment: {
name: "Frank Doe CV.txt",
content_type: "text/plain",
data: "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
type: "CV",
},
},
});
console.log(result);
}
run();require 'kombo'
Models = ::Kombo::Models
s = ::Kombo::Kombo.new(
integration_id: 'workday:HWUTwvyx2wLoSUHphiWVrp28',
security: Models::Shared::Security.new(
api_key: '<YOUR_BEARER_TOKEN_HERE>'
)
)
res = s.ats.add_candidate_attachment(candidate_id: 'GRKdd9dibYKKCrmGRSMJf3wu', body: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBody.new(
attachment: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBodyAttachment.new(
name: 'Frank Doe CV.txt',
content_type: 'text/plain',
data: 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
type: Models::Shared::PostAtsCandidatesCandidateIdAttachmentsRequestBodyType::CV
)
))
unless res.post_ats_candidates_candidate_id_attachments_positive_response.nil?
# handle response
endcurl --request POST \
--url https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Integration-Id: <x-integration-id>' \
--data '
{
"attachment": {
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
}
'const options = {
method: 'POST',
headers: {
'X-Integration-Id': '<x-integration-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
attachment: {
name: 'Frank Doe CV.txt',
data: 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
type: 'CV',
content_type: 'text/plain'
}
})
};
fetch('https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'attachment' => [
'name' => 'Frank Doe CV.txt',
'data' => 'SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=',
'type' => 'CV',
'content_type' => 'text/plain'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Integration-Id: <x-integration-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments"
payload := strings.NewReader("{\n \"attachment\": {\n \"name\": \"Frank Doe CV.txt\",\n \"data\": \"SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=\",\n \"type\": \"CV\",\n \"content_type\": \"text/plain\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Integration-Id", "<x-integration-id>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.kombo.dev/v1/ats/candidates/{candidate_id}/attachments")
.header("X-Integration-Id", "<x-integration-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attachment\": {\n \"name\": \"Frank Doe CV.txt\",\n \"data\": \"SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=\",\n \"type\": \"CV\",\n \"content_type\": \"text/plain\"\n }\n}")
.asString();{
"status": "<string>",
"data": {},
"warnings": [
{
"message": "<string>"
}
]
}Supported integrations
Supported integrations
This feature is currently available for the following integrations:
Workday
SmartRecruiters
Oracle Recruiting Cloud
Lever
iCIMS
Recruitee
RecruiterFlow
Greenhouse (V1)
Teamtailor
Ashby
Onlyfy
UKG Ready
Bullhorn for Salesforce
Bullhorn
Bullhorn Login
Workable
Welcome to the Jungle
eRecruiter
Taleez
HR WORKS
OTYS
JazzHR
Homerun
Carerix
InRecruiting by Zucchetti
JobAdder
HR4YOU
Odoo
Mercury
Manatal
Avionté
Breezy HR
Kombo Sandbox
Loxo
We recommend using the add attachment to application 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.
Example Request Body
{
"candidate_id": "GRKdd9dibYKKCrmGRSMJf3wu",
"attachment": {
"name": "Frank Doe CV.txt",
"data": "SGkgdGhlcmUsIEtvbWJvIGlzIGN1cnJlbnRseSBoaXJpbmcgZW5naW5lZXJzIHRoYXQgbG92ZSB0byB3b3JrIG9uIGRldmVsb3BlciBwcm9kdWN0cy4=",
"type": "CV",
"content_type": "text/plain"
}
}
Authorizations
Headers
ID of the integration you want to interact with.
Path Parameters
The Kombo ID of the candidate you want to add the attachment to.
Body
application/json
POST /ats/candidates/:candidate_id/attachments Request body
Response
POST /ats/candidates/:candidate_id/attachments Positive response
Was this page helpful?
⌘I