Update candidate
Updates an existing candidate for the authenticated company.
At least one updatable field must be present. Supplying notes creates a
note_added activity. Supplying a new stage creates a stage_changed
activity and enqueues the candidate.stage_changed webhook event.
curl --request PATCH \
--url https://app.outhire.ai/api/v1/candidates/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Jane Doe",
"rating": 5,
"stage": "phonescreen",
"notes": "Spoke with hiring manager",
"ats_candidate_id": "ext-456",
"location": "Melbourne, Australia"
}
'import requests
url = "https://app.outhire.ai/api/v1/candidates/{id}"
payload = {
"name": "Jane Doe",
"rating": 5,
"stage": "phonescreen",
"notes": "Spoke with hiring manager",
"ats_candidate_id": "ext-456",
"location": "Melbourne, Australia"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Jane Doe',
rating: 5,
stage: 'phonescreen',
notes: 'Spoke with hiring manager',
ats_candidate_id: 'ext-456',
location: 'Melbourne, Australia'
})
};
fetch('https://app.outhire.ai/api/v1/candidates/{id}', 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://app.outhire.ai/api/v1/candidates/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Jane Doe',
'rating' => 5,
'stage' => 'phonescreen',
'notes' => 'Spoke with hiring manager',
'ats_candidate_id' => 'ext-456',
'location' => 'Melbourne, Australia'
]),
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://app.outhire.ai/api/v1/candidates/{id}"
payload := strings.NewReader("{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.outhire.ai/api/v1/candidates/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outhire.ai/api/v1/candidates/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 419,
"public_id": "e3745169-a137-4b99-8fcc-373d6d4c8d60",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+61412345678",
"linkedin": "https://linkedin.com/in/janedoe",
"location": "Sydney, Australia",
"stage": "applied",
"rating": 4,
"fit_score": 82,
"application_source": "public_api",
"ats_candidate_id": "ext-456",
"job": {
"id": 40,
"title": "Senior Engineer"
},
"created_at": "2026-03-11T10:21:54.289003Z",
"updated_at": "2026-03-11T10:21:54.544000Z",
"applied_at": "2026-03-11T10:21:54.289003Z",
"resume_url": "https://api.outhire.ai/storage/cv/example.pdf?token=eyJhbGciOiJIUzI1NiIs...",
"resume_data": {
"personalInfo": {
"name": "Jane Doe",
"email": "jane@example.com"
},
"summary": "Senior engineer with 8 years of experience"
},
"resume_status": "processed"
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Numeric candidate id.
Body
Request body for updating a candidate.
All fields are optional, but at least one recognized field must be present.
Several fields are nullable and can be explicitly cleared by sending null.
stage is not nullable in the current implementation.
Candidate name after trimming.
1 - 200"Jane Doe"
Optional candidate email. Used in duplicate detection by job.
"jane@example.com"
Candidate phone number, or null to clear it.
100"+61 412 345 678"
LinkedIn profile URL, or null to clear it.
"https://linkedin.com/in/janedoe"
Freeform location, or null to clear it.
500"Melbourne, Australia"
Optional note that creates a note_added activity row.
2000"Spoke with hiring manager"
Candidate rating from 1 to 5, or null to clear it.
1 <= x <= 55
External ATS candidate id, or null to clear it.
255"ext-456"
New candidate stage. Cannot be null in the current implementation.
prospect, applied, phonescreen, inprogress, hired, rejected "phonescreen"
Response
Candidate updated
Wrapper for a single candidate resource.
Public representation of a candidate.
Show child attributes
Show child attributes
{
"id": 419,
"public_id": "e3745169-a137-4b99-8fcc-373d6d4c8d60",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+61412345678",
"linkedin": "https://linkedin.com/in/janedoe",
"location": "Sydney, Australia",
"stage": "applied",
"rating": 4,
"fit_score": 82,
"application_source": "public_api",
"ats_candidate_id": "ext-456",
"job": { "id": 40, "title": "Senior Engineer" },
"created_at": "2026-03-11T10:21:54.289003Z",
"updated_at": "2026-03-11T10:21:54.544000Z",
"applied_at": "2026-03-11T10:21:54.289003Z",
"resume_url": "https://api.outhire.ai/storage/cv/example.pdf?token=eyJhbGciOiJIUzI1NiIs...",
"resume_data": {
"personalInfo": {
"name": "Jane Doe",
"email": "jane@example.com"
},
"summary": "Senior engineer with 8 years of experience"
},
"resume_status": "processed"
}
curl --request PATCH \
--url https://app.outhire.ai/api/v1/candidates/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Jane Doe",
"rating": 5,
"stage": "phonescreen",
"notes": "Spoke with hiring manager",
"ats_candidate_id": "ext-456",
"location": "Melbourne, Australia"
}
'import requests
url = "https://app.outhire.ai/api/v1/candidates/{id}"
payload = {
"name": "Jane Doe",
"rating": 5,
"stage": "phonescreen",
"notes": "Spoke with hiring manager",
"ats_candidate_id": "ext-456",
"location": "Melbourne, Australia"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Jane Doe',
rating: 5,
stage: 'phonescreen',
notes: 'Spoke with hiring manager',
ats_candidate_id: 'ext-456',
location: 'Melbourne, Australia'
})
};
fetch('https://app.outhire.ai/api/v1/candidates/{id}', 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://app.outhire.ai/api/v1/candidates/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Jane Doe',
'rating' => 5,
'stage' => 'phonescreen',
'notes' => 'Spoke with hiring manager',
'ats_candidate_id' => 'ext-456',
'location' => 'Melbourne, Australia'
]),
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://app.outhire.ai/api/v1/candidates/{id}"
payload := strings.NewReader("{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://app.outhire.ai/api/v1/candidates/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.outhire.ai/api/v1/candidates/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Jane Doe\",\n \"rating\": 5,\n \"stage\": \"phonescreen\",\n \"notes\": \"Spoke with hiring manager\",\n \"ats_candidate_id\": \"ext-456\",\n \"location\": \"Melbourne, Australia\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 419,
"public_id": "e3745169-a137-4b99-8fcc-373d6d4c8d60",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": "+61412345678",
"linkedin": "https://linkedin.com/in/janedoe",
"location": "Sydney, Australia",
"stage": "applied",
"rating": 4,
"fit_score": 82,
"application_source": "public_api",
"ats_candidate_id": "ext-456",
"job": {
"id": 40,
"title": "Senior Engineer"
},
"created_at": "2026-03-11T10:21:54.289003Z",
"updated_at": "2026-03-11T10:21:54.544000Z",
"applied_at": "2026-03-11T10:21:54.289003Z",
"resume_url": "https://api.outhire.ai/storage/cv/example.pdf?token=eyJhbGciOiJIUzI1NiIs...",
"resume_data": {
"personalInfo": {
"name": "Jane Doe",
"email": "jane@example.com"
},
"summary": "Senior engineer with 8 years of experience"
},
"resume_status": "processed"
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": [
{
"field": "email",
"message": "Invalid email"
}
]
}
}