Used for retrieving all the jobs that match the specified criteria
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Note: Every incoming request to the API must contain an API key. Otherwise, the caller receives a 403 Forbidden response.
Examples
Replace your_partner_name with the partner name agreed with Apploi.
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. The Job Search guide explains each search parameter in more detail.
Send only the parameters listed on this page. An unrecognized query parameter makes the whole request fail with 400 and an errors message naming it.
Your first search
Search for nursing jobs within 50 miles of a point:
# 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 -G https://partners.apploi.com/jobs/search \
-H "X-Api-Key: $APPLOI_API_KEY" \
--data-urlencode "searchbar=nurse" \
--data-urlencode "location=40.777,-73.874" \
--data-urlencode "radius=50" \
--data-urlencode "location_filter=1" \
--data-urlencode "size=20" \
--data-urlencode "source=your_partner_name"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"]
response = requests.get(
"https://partners.apploi.com/jobs/search",
headers={"X-Api-Key": API_KEY},
params={
"searchbar": "nurse",
"location": "40.777,-73.874",
"radius": 50,
"location_filter": 1,
"size": 20,
"source": "your_partner_name",
},
timeout=30,
)
response.raise_for_status()
for job in response.json()["data"]:
print(job["id"], job["name"], job["city"], job["apply_method"])// 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 params = new URLSearchParams({
searchbar: "nurse",
location: "40.777,-73.874",
radius: "50",
location_filter: "1",
size: "20",
source: "your_partner_name",
});
const response = await fetch(`https://partners.apploi.com/jobs/search?${params}`, {
headers: { "X-Api-Key": API_KEY },
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const { data } = await response.json();
for (const job of data) {
console.log(job.id, job.name, job.city, job.apply_method);
}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")
uri = URI("https://partners.apploi.com/jobs/search")
uri.query = URI.encode_www_form(
searchbar: "nurse",
location: "40.777,-73.874",
radius: 50,
location_filter: 1,
size: 20,
source: "your_partner_name",
)
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)
JSON.parse(response.body)["data"].each do |job|
puts [job["id"], job["name"], job["city"], job["apply_method"]].join(" ")
endlocation_filter=1 returns only jobs inside radius. With 0, the default, location only sorts the results by distance. The jobs are in data. Trimmed to the fields these examples use, a result looks like this:
{
"data": [
{
"id": "468003",
"name": "Licensed Practical Nurse (LPN)",
"city": "Brookhaven",
"state": "New York",
"apply_method": "full_apply_endpoint",
"number_of_questions_allowed": 2,
"questions_url": "https://ats-integrations.apploi.com/v1/apploi/468003/questions.json?source=your_partner_name",
"external_url": null,
"redirect_apply_url": "https://apply-jobs.apploi.com/job/468003?utm_source=...",
"partner_attributes": {
"sponsored": true,
"search_fetch_id": "394f44dc0aff4ee6ae469221e8934ee8",
"page": 1,
"order": 1
}
}
],
"elasticsearch_errors": [],
"errors": [],
"buckets": []
}Paging through results
page starts at 1, and size sets how many jobs are on each page. size defaults to 50, and anything above 1000 is served as 1000, so keep size at 1000 or below. The response has no total count, so keep requesting the next page until one comes back with fewer jobs than size.
page multiplied by size must stay below 10,000, or the request fails with 400. At the default size that is 199 pages. If you need more results than that, narrow the search with location, industry or teams rather than paging deeper. The examples also keep one copy of each job by id, in case a job appears on two pages.
# 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>"
# Page 1
curl -G https://partners.apploi.com/jobs/search \
-H "X-Api-Key: $APPLOI_API_KEY" \
--data-urlencode "searchbar=nurse" \
--data-urlencode "location=40.777,-73.874" \
--data-urlencode "radius=50" \
--data-urlencode "location_filter=1" \
--data-urlencode "source=your_partner_name" \
--data-urlencode "size=50" \
--data-urlencode "page=1"
# Page 2: same search, next page
curl -G https://partners.apploi.com/jobs/search \
-H "X-Api-Key: $APPLOI_API_KEY" \
--data-urlencode "searchbar=nurse" \
--data-urlencode "location=40.777,-73.874" \
--data-urlencode "radius=50" \
--data-urlencode "location_filter=1" \
--data-urlencode "source=your_partner_name" \
--data-urlencode "size=50" \
--data-urlencode "page=2"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 search_all_jobs(search, size=50):
size = min(size, 1000) # larger sizes are served as 1000
jobs = {}
page = 1
while page * size < 10000:
response = requests.get(
"https://partners.apploi.com/jobs/search",
headers={"X-Api-Key": API_KEY},
params={**search, "page": page, "size": size},
timeout=30,
)
response.raise_for_status()
data = response.json()["data"]
for job in data:
jobs[job["id"]] = job
if len(data) < size:
break
page += 1
return list(jobs.values())
jobs = search_all_jobs({
"searchbar": "nurse",
"location": "40.777,-73.874",
"radius": 50,
"location_filter": 1,
"source": "your_partner_name",
})// 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 searchAllJobs(search: Record<string, string>, size = 50): Promise<any[]> {
size = Math.min(size, 1000); // larger sizes are served as 1000
const jobs = new Map<string, any>();
for (let page = 1; page * size < 10000; page++) {
const params = new URLSearchParams({ ...search, page: String(page), size: String(size) });
const response = await fetch(`https://partners.apploi.com/jobs/search?${params}`, {
headers: { "X-Api-Key": API_KEY },
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const { data } = await response.json();
for (const job of data) {
jobs.set(job.id, job);
}
if (data.length < size) {
break;
}
}
return [...jobs.values()];
}
const jobs = await searchAllJobs({
searchbar: "nurse",
location: "40.777,-73.874",
radius: "50",
location_filter: "1",
source: "your_partner_name",
});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 search_all_jobs(search, size = 50)
size = [size, 1000].min # larger sizes are served as 1000
jobs = {}
page = 1
while page * size < 10000
uri = URI("https://partners.apploi.com/jobs/search")
uri.query = URI.encode_www_form(search.merge(page: page, size: size))
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)
data = JSON.parse(response.body)["data"]
data.each do |job|
jobs[job["id"]] = job
end
break if data.length < size
page += 1
end
jobs.values
end
jobs = search_all_jobs(
searchbar: "nurse",
location: "40.777,-73.874",
radius: 50,
location_filter: 1,
source: "your_partner_name",
)Choosing how to apply to a job
First check external_url. When it is set, the employer takes applications on its own site and redirect_apply_url points there, so send the applicant to redirect_apply_url whatever apply_method says. Otherwise, apply_method tells you which apply flow the job takes:
apply_method | What to do |
|---|---|
redirect | Send the applicant to redirect_apply_url. The job can't be applied to through the API. |
easy_apply_endpoint | The job has no screening questions. Submit with Quick Apply. |
full_apply_endpoint | Fetch the job's questions from questions_url, collect the answers, then submit with Full Apply. |
Use apply_method to choose the flow, not number_of_questions_allowed. That field counts only the job's questions with a text, date, single-choice, multiple-choice or slider answer, so it can be lower than the job's total number of questions, and can be 0 on a full_apply_endpoint job.
For both API flows, send the job's partner_attributes back unchanged in the apply request. See Partner Attributes.
questions_url is only set for full_apply_endpoint jobs, and fetching it does not need your API key. The cURL example fetches the questions for the job in the sample response above.
curl "https://ats-integrations.apploi.com/v1/apploi/468003/questions.json?source=your_partner_name"import requests
def next_apply_step(job):
if job.get("external_url"):
return {"flow": "redirect", "url": job["redirect_apply_url"]}
if job["apply_method"] == "full_apply_endpoint":
response = requests.get(job["questions_url"], timeout=30)
response.raise_for_status()
return {"flow": "full_apply", "questions": response.json()}
if job["apply_method"] == "easy_apply_endpoint":
return {"flow": "quick_apply"}
return {"flow": "redirect", "url": job["redirect_apply_url"]}
step = next_apply_step(jobs[0])async function nextApplyStep(job: any) {
if (job.external_url) {
return { flow: "redirect", url: job.redirect_apply_url };
}
if (job.apply_method === "full_apply_endpoint") {
const response = await fetch(job.questions_url);
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
return { flow: "full_apply", questions: await response.json() };
}
if (job.apply_method === "easy_apply_endpoint") {
return { flow: "quick_apply" };
}
return { flow: "redirect", url: job.redirect_apply_url };
}
const step = await nextApplyStep(jobs[0]);require "json"
require "net/http"
require "uri"
def next_apply_step(job)
return { flow: "redirect", url: job["redirect_apply_url"] } if job["external_url"]
if job["apply_method"] == "full_apply_endpoint"
response = Net::HTTP.get_response(URI(job["questions_url"]))
raise "Request failed with status #{response.code}" unless response.is_a?(Net::HTTPSuccess)
return { flow: "full_apply", questions: JSON.parse(response.body) }
end
return { flow: "quick_apply" } if job["apply_method"] == "easy_apply_endpoint"
{ flow: "redirect", url: job["redirect_apply_url"] }
end
step = next_apply_step(jobs[0])Looking up a single job
To look up a job you already know, send its job_id with your usual source. Without source, the job's partner_attributes and questions_url lose your attribution, and you are told to send partner_attributes back unchanged when you apply. The search filters are ignored, and data holds that one job. It is empty if the job isn't found, or if the job is private and you didn't send include_private=1. Leave page out: any page after the first is empty.
# 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 -G https://partners.apploi.com/jobs/search \
-H "X-Api-Key: $APPLOI_API_KEY" \
--data-urlencode "job_id=468003" \
--data-urlencode "source=your_partner_name"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"]
response = requests.get(
"https://partners.apploi.com/jobs/search",
headers={"X-Api-Key": API_KEY},
params={"job_id": "468003", "source": "your_partner_name"},
timeout=30,
)
response.raise_for_status()
jobs = response.json()["data"]
job = jobs[0] if jobs else None// 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 lookupParams = new URLSearchParams({ job_id: "468003", source: "your_partner_name" });
const lookupResponse = await fetch(`https://partners.apploi.com/jobs/search?${lookupParams}`, {
headers: { "X-Api-Key": API_KEY },
});
if (!lookupResponse.ok) {
throw new Error(`Request failed with status ${lookupResponse.status}`);
}
const job = (await lookupResponse.json()).data[0];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")
uri = URI("https://partners.apploi.com/jobs/search")
uri.query = URI.encode_www_form(job_id: "468003", source: "your_partner_name")
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 = JSON.parse(response.body)["data"].first # nil when the job isn't found
