Endpoint for retrieving a processed application. This endpoint allows users to fetch the current details of a specific candidate's application for a specific job, including the applicant's status, notes, and other application data.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
For the full workflow around job applications (finding them, updating their status, messaging applicants and scheduling interviews), see the Applicant & Status Management guide.
Examples
The examples read your API key from an environment variable named APPLOI_API_KEY. Before running them, set APPLOI_API_KEY in your own environment to the Partner API key you received from Apploi. The examples do not set it for you, and the key should never be written into your code.
Where the id comes from
Despite its name, the applicant_id path parameter takes the id of a job application: one person's application to one job. Take it from the id field of an entry in a GET /applicants response:
{
"data": [
{
"id": 265733753,
"applicant_id": 71207841,
"job_id": 1470975,
"applicant_updated": "2026-09-18T14:03:22+00:00"
}
],
"offset": 0,
"limit": 50
}For this entry, request /applicants/265733753. Don't send the entry's applicant_id (71207841), which identifies the person rather than the job application. A person's id usually returns 404, but it can match a different job application and return that one, or a 403 if that job application is outside your key's scope.
Fetching one job application
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
curl https://partners.apploi.com/applicants/265733753 \
-H "X-Api-Key: $APPLOI_API_KEY"import os
import requests
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
API_KEY = os.environ["APPLOI_API_KEY"]
job_application_id = 265733753 # the "id" of an entry from GET /applicants
response = requests.get(
f"https://partners.apploi.com/applicants/{job_application_id}",
headers={"X-Api-Key": API_KEY},
timeout=30,
)
response.raise_for_status()
job_application = response.json()["data"]
print(job_application["applicant_state"], job_application["job"]["name"])
print(job_application["applicant_profile"]["email"])// APPLOI_API_KEY must hold the Partner API key you received from Apploi.
// These examples do not set it for you: set it yourself, in your own
// environment, before running them. For example, in your shell:
// export APPLOI_API_KEY="<the API key you received from Apploi>"
if (!process.env.APPLOI_API_KEY) {
throw new Error("Set APPLOI_API_KEY to the Partner API key you received from Apploi");
}
const API_KEY: string = process.env.APPLOI_API_KEY;
const jobApplicationId = 265733753; // the "id" of an entry from GET /applicants
const response = await fetch(`https://partners.apploi.com/applicants/${jobApplicationId}`, {
headers: { "X-Api-Key": API_KEY },
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const jobApplication = (await response.json()).data;
console.log(jobApplication.applicant_state, jobApplication.job.name);
console.log(jobApplication.applicant_profile.email);require "json"
require "net/http"
require "uri"
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
API_KEY = ENV.fetch("APPLOI_API_KEY")
job_application_id = 265733753 # the "id" of an entry from GET /applicants
uri = URI("https://partners.apploi.com/applicants/#{job_application_id}")
request = Net::HTTP::Get.new(uri)
request["X-Api-Key"] = API_KEY
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: 30) do |http|
http.request(request)
end
raise "Request failed with status #{response.code}" unless response.is_a?(Net::HTTPSuccess)
job_application = JSON.parse(response.body)["data"]
puts [job_application["applicant_state"], job_application["job"]["name"]].join(" ")
puts job_application["applicant_profile"]["email"]The job application is wrapped in data. Trimmed to a few fields, the response looks like this:
{
"data": {
"id": 265733753,
"applicant_id": 71207841,
"job_id": 1470975,
"applicant_state": "Interview Scheduled",
"applicant_updated": "2026-09-18T14:03:22+00:00",
"applicant_profile": {
"id": 71207841,
"first_name": "Jane",
"last_name": "Doe",
"email": "[email protected]"
},
"job": {
"id": 1470975,
"name": "Registered Nurse",
"team_id": 123456
}
}
}applicant_state is the job application's current status. applicant_profile describes the person who applied, and job the job they applied to. The full list of fields is in the response schema on this page.
resume_link is a signed download link that expires, or null when no resume is on file. Download the resume when you need it rather than storing the link.
Handling errors
| Status | Response body | What happened |
|---|---|---|
404 | {"developer_message": "Object Not Found", "extra": null} | No job application has this id. |
404 | {"developer_message": "The requested URL was not found on the server. ...", "extra": null} | The id is not a whole number. |
403 | {"developer_message": "You don't have the permission to access the requested resource. ...", "extra": null} | The job application exists, but its job is outside your API key's scope. |
403 | {"developer_message": "Forbidden", "extra": null} | The job application has been deleted. |
403 | {"message": "Forbidden"} | The X-Api-Key header is missing or the key is invalid. |
None of these succeed when retried unchanged. Check the id, and check that it came from the id field rather than applicant_id. Do retry a 5xx once or twice, after a few seconds' wait. The Errors guide covers status codes across the whole API.
These examples treat a 404 as "no such job application" and stop on anything else:
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
# Prints the status code on the last line, after the response body
curl -sS https://partners.apploi.com/applicants/265733753 \
-H "X-Api-Key: $APPLOI_API_KEY" \
-w "\n%{http_code}\n"import os
import requests
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
API_KEY = os.environ["APPLOI_API_KEY"]
def get_job_application(job_application_id):
response = requests.get(
f"https://partners.apploi.com/applicants/{job_application_id}",
headers={"X-Api-Key": API_KEY},
timeout=30,
)
if response.status_code == 404:
return None # no job application with this id
response.raise_for_status() # a 403 means it's outside your key's scope or deleted
return response.json()["data"]
job_application = get_job_application(265733753)
if job_application is None:
print("No job application with that id")// APPLOI_API_KEY must hold the Partner API key you received from Apploi.
// These examples do not set it for you: set it yourself, in your own
// environment, before running them. For example, in your shell:
// export APPLOI_API_KEY="<the API key you received from Apploi>"
if (!process.env.APPLOI_API_KEY) {
throw new Error("Set APPLOI_API_KEY to the Partner API key you received from Apploi");
}
const API_KEY: string = process.env.APPLOI_API_KEY;
async function getJobApplication(jobApplicationId: number): Promise<any | null> {
const response = await fetch(`https://partners.apploi.com/applicants/${jobApplicationId}`, {
headers: { "X-Api-Key": API_KEY },
});
if (response.status === 404) {
return null; // no job application with this id
}
if (!response.ok) {
// a 403 means it's outside your key's scope or deleted
throw new Error(`Request failed with status ${response.status}: ${await response.text()}`);
}
return (await response.json()).data;
}
const jobApplication = await getJobApplication(265733753);
if (jobApplication === null) {
console.log("No job application with that id");
}require "json"
require "net/http"
require "uri"
# APPLOI_API_KEY must hold the Partner API key you received from Apploi.
# These examples do not set it for you: set it yourself, in your own
# environment, before running them. For example, in your shell:
# export APPLOI_API_KEY="<the API key you received from Apploi>"
API_KEY = ENV.fetch("APPLOI_API_KEY")
def get_job_application(job_application_id)
uri = URI("https://partners.apploi.com/applicants/#{job_application_id}")
request = Net::HTTP::Get.new(uri)
request["X-Api-Key"] = API_KEY
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: 30) do |http|
http.request(request)
end
return nil if response.is_a?(Net::HTTPNotFound) # no job application with this id
# a 403 means it's outside your key's scope or deleted
raise "Request failed with status #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)["data"]
end
job_application = get_job_application(265733753)
puts "No job application with that id" if job_application.nil?Keeping up with changes
To track status changes, don't call this endpoint for every job application on a schedule. Instead, ask GET /applicants with updated_after for the job applications that changed since your last run, and fetch the full detail here only for those.
Sensitive data
Send include_sensitive_data=true to ask for the person's Social Security Number. Apploi has to enable this for your team first.
- Without the parameter,
applicant_profilehas nosocial_security_numberkey. - With it,
social_security_numberis the SSN when the feature is enabled and the SSN was collected in a signed document for this job application, andnullotherwise. date_of_birthcomes back either way. Withinclude_sensitive_data=trueand the feature enabled, if a signed document for this job application has a birth date, that date replaces the profile's, as a plain date such as"1990-01-01". This happens whether or not an SSN was found, and the date can differ from the one on the profile.
403Invalid Token
404Not Found

