curl --request POST \
--url https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"jobId": 12345,
"resumeURLs": [
"https://example.com/resumes/john-doe.pdf",
"https://example.com/resumes/jane-smith.docx"
]
}
'import requests
url = "https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume"
payload = {
"jobId": 12345,
"resumeURLs": ["https://example.com/resumes/john-doe.pdf", "https://example.com/resumes/jane-smith.docx"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jobId: 12345,
resumeURLs: [
'https://example.com/resumes/john-doe.pdf',
'https://example.com/resumes/jane-smith.docx'
]
})
};
fetch('https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume', 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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume",
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([
'jobId' => 12345,
'resumeURLs' => [
'https://example.com/resumes/john-doe.pdf',
'https://example.com/resumes/jane-smith.docx'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume"
payload := strings.NewReader("{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"batchId": 12345,
"fileCount": 2,
"jobId": 12345
}
}Bulk upload resumes to a job
Upload up to 5,000 resumes for parsing and associate them with a
specific job. Parsed resumes automatically create job candidates with
AI evaluation against the job’s criterionDetails, producing profile
match scores and recommendations.
Returns a batchId that can be used to retrieve the created
candidates later.
Validation rules:
jobIdmust be provided and must be a valid integer.resumeURLsmust be provided, must be an array, and cannot be empty.- Each URL must be a non-empty string (whitespace-only strings are invalid) and must be publicly accessible.
- Maximum 5,000 resume URLs per request.
- The job must exist and belong to your company.
Triggered webhook events (see the webhooks section for payloads):
resume.bulk_upload_parse.startedwhen batch processing starts.resume.bulk_upload_parse.completedwhen batch processing completes (carriessuccessCountandfailedCount).resume.bulk_upload_parse.failedif batch processing fails.
curl --request POST \
--url https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"jobId": 12345,
"resumeURLs": [
"https://example.com/resumes/john-doe.pdf",
"https://example.com/resumes/jane-smith.docx"
]
}
'import requests
url = "https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume"
payload = {
"jobId": 12345,
"resumeURLs": ["https://example.com/resumes/john-doe.pdf", "https://example.com/resumes/jane-smith.docx"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jobId: 12345,
resumeURLs: [
'https://example.com/resumes/john-doe.pdf',
'https://example.com/resumes/jane-smith.docx'
]
})
};
fetch('https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume', 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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume",
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([
'jobId' => 12345,
'resumeURLs' => [
'https://example.com/resumes/john-doe.pdf',
'https://example.com/resumes/jane-smith.docx'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume"
payload := strings.NewReader("{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.taptalent.io/v1/partner/job-candidates/bulk/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jobId\": 12345,\n \"resumeURLs\": [\n \"https://example.com/resumes/john-doe.pdf\",\n \"https://example.com/resumes/jane-smith.docx\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"batchId": 12345,
"fileCount": 2,
"jobId": 12345
}
}Authorizations
Company-scoped API key. Production keys are prefixed sk_live_,
sandbox keys sk_test_, each followed by 22 base62 characters
(pattern ^sk_(live|test)_[0-9A-Za-z]{22}$). Generate keys in the
TapTalent dashboard under Account Settings → Developers → API Key
Management; a key is shown once at generation and old keys are
invalidated immediately on regeneration.
Body
Request body for bulk-uploading resumes to a job.
The job ID to associate the resumes with. The job must exist and belong to your company.
Array of publicly accessible URLs pointing to resume files (PDF, DOC, DOCX). Maximum 5,000 resumes per request; must be provided and cannot be empty.
1 - 5000 elementsPublicly accessible URL of a resume file. Must be a non-empty string (whitespace-only strings are invalid).
1Response
Batch accepted for processing.
Success envelope for the bulk resume upload endpoint. Note this family
of bulk operations uses the {success: true, data} envelope rather than
the {status: "success", data} envelope used by the other job-candidate
endpoints.
Was this page helpful?
.png?fit=max&auto=format&n=lKy84_BssSCy2hcz&q=85&s=ac7c949427cc2893306f6036415f087e)