Job Search
Use the Job Search API to submit job searches, industries list, cities list, and return results.
Prerequisite
- x-api-key: Token that is provided by Apploi. This is needed to be able to use the API, and it must be added in the request headers.
Job Search
Used for retrieving all the jobs that match the specified criteria. Check all specifications for /jobs/search.
Request example
https://partners.apploi.com/jobs/search/?city_center=New+York&language=en&location=40.777,-73.874&location_filter=1&page=1&radius=50&source={partner_name}&utm_source={utm_partner}&searchbar=nurse
Note: Remember to add in the headers the x-api-key.
Request explained
| Parameter | Value | Description |
|---|---|---|
| language | en | Allowed values en (English) or es (Spanish), used to indicate the language used to search. |
| location | 40.777,-73.874 | Geolocation Point, Used to find jobs close to this point, within the radius range as defined by the radius parameter. |
| location_filter | 1 | Allowed values 1 or 0, if the parameter is 1, a distance filter is applied to return only jobs within the radius parameter. |
| radius | 50 | Radius distance in miles from the location coordinates |
| source | {partner_name} | Parameter necessary to identify the partner making the request. |
| utm_source | {utm_partner} | Identifies which site sent the traffic. It helps to identify the origin of the application, this can help to understand where the applications come from. |
| city_center | New+York | This parameter is only informative and can be used to group analytics |
Response example
"data": [ {
"job_type": "Full Time",
"name_es": "Enfermera práctica con licencia (LPN)",
"company_logo_url": "http://d37o2t2slkqywt.cloudfront.net/d9e0a8e1-3777-41f3-c06e-13af7bb85c8a",
"hidden": false,
"city": "Brookhaven",
"description": "<p>Welcome to the <strong>...",
"industry": "Healthcare",
"source": null,
"team_id": 37320,
"doc_type": "preferredjob",
"apply_method": "full_apply_endpoint",
"uid": "468003",
"external_url": null,
"id": "468003",
"state": "New York",
"job_code": "bellhavencenter-468003",
"preferred": true,
"address": "110 Beaver Dam Rd, Brookhaven, NY 11719, USA",
"number_of_questions_allowed": 2,
"brand_name": "Bellhaven Center",
"backfilled": false,
"published": true,
"aggregated": false,
"number_of_questions": 2,
"name": "Licensed Practical Nurse (LPN)",
"location": {
"lon": -72.9334145,
"lat": 40.7715761
},
"description_es": "<p>Bienvenido al <strong>...",
"published_date": "2021-01-29",
"order": 1,
"redirect_apply_url": "https://jobs.apploi.com/view/468003?utm_campaign=integration&utm_medium=job-board-search&utm_source=utm_partner-boosted&language=en&ajs_event=LOAD_JOB_PAGE&ajs_aid=3f617530-4530-11e9-a2ca-7e775511d9e3&ajs_prop_search_fetch_id=394f44dc0aff4ee6ae469221e8934ee8&ajs_prop_keyword=nurse&ajs_prop_page=1&ajs_prop_city_center=Nueva York&ajs_prop_language=en&ajs_prop_jobseeker_location_lat=40.777&ajs_prop_jobseeker_location_lon=-73.874&ajs_prop_search_order=1&ajs_prop_job_id=468003&ajs_prop_doc_type=preferredjob&ajs_prop_distance=49&ajs_prop_job_location_lat=40.7715761&ajs_prop_job_location_lon=-72.9334145&ajs_prop_boosted=1&ajs_prop_utm_source=utm_partner-boosted&ajs_prop_utm_medium=job-board-search&ajs_prop_utm_campaign=integration",
"partner_attributes": {
"sponsored": true,
"redirect_apply": "https://jobs.apploi.com/view/468003?utm_campaign=integration&utm_medium=job-board-search&utm_source=utm_partner-boosted&language=en&ajs_event=LOAD_JOB_PAGE&ajs_aid=3f617530-4530-11e9-a2ca-7e775511d9e3&ajs_prop_search_fetch_id=394f44dc0aff4ee6ae469221e8934ee8&ajs_prop_keyword=nurse&ajs_prop_page=1&ajs_prop_city_center=Nueva York&ajs_prop_language=en&ajs_prop_jobseeker_location_lat=40.777&ajs_prop_jobseeker_location_lon=-73.874&ajs_prop_search_order=1&ajs_prop_job_id=468003&ajs_prop_doc_type=preferredjob&ajs_prop_distance=49&ajs_prop_job_location_lat=40.7715761&ajs_prop_job_location_lon=-72.9334145&ajs_prop_boosted=1&ajs_prop_utm_source=utm_partner-boosted&ajs_prop_utm_medium=job-board-search&ajs_prop_utm_campaign=integration",
"utm_medium": "job-board-search",
"utm_campaign": "integration",
"keyword": "nurse",
"search_fetch_id": "394f44dc0aff4ee6ae469221e8934ee8",
"page": 1,
"order": 1,
"city_center": "New York",
"utm_source": "utm_partner-full-apply-boosted",
"source": "partner_name-apply"
},
"questions_url": "https://ats-integrations.apploi.com/v1/apploi/468003/questions.json?source=partner_name"
}]
Response explained
| Field Name | Values | Description |
|---|---|---|
| apply_method |
| If you don't want to use the Apply Integration you need to use the redirect_apply_url to allow applicants to apply to the job on an Apploi application page. If you need use the apply integration:
|
| number_of_questions_allowed |
|
|
| preferred |
|
|
| redirect_apply_url | string | Url where the person can apply to the job. |
| partner_attributes | Json Object | If you need use the apply integration you need to check Partner Attributes |
| questions_url | string | Url to get the job questions when the job has the method_apply equal to full_apply_endpoint. |
Examples
The examples search for nursing jobs within 50 miles of a point, read every page of results, and print how to apply to each job. Send only the parameters documented on /jobs/search: an unrecognized query parameter makes the whole request fail with 400.
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.
Paging. 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. If you need more results than that, narrow the search with location, industry or teams rather than paging deeper. The order of results can change between requests, so while you page through a search, a job can appear on two pages and another can be missed. The Python and TypeScript examples keep one copy of each job by id.
Choosing how to apply. First check external_url. When it holds a URL (not null or an empty string), the employer takes applications on its own site, so send the applicant to redirect_apply_url whatever apply_method says. Otherwise, apply_method tells you which flow the job takes:
- redirect: send the applicant to
redirect_apply_url. - easy_apply_endpoint: apply with Quick Apply.
- full_apply_endpoint: fetch the job's questions from
questions_url, then apply with Full Apply. Fetchingquestions_urldoes not need your API key.
Don't use number_of_questions_allowed to choose the flow: it 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.
The cURL example uses jq to read the responses.
# 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>"
SIZE=50
PAGE=1
while [ $((PAGE * SIZE)) -lt 10000 ]; do
RESPONSE=$(curl -sS --fail -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=$SIZE" \
--data-urlencode "page=$PAGE") || break
# One line per job: id, name, how to apply, and the URL that flow needs.
printf '%s\n' "$RESPONSE" | jq -r '.data[]
| (if (.external_url // "") != "" then ["redirect", .redirect_apply_url]
elif .apply_method == "full_apply_endpoint" then ["full_apply", .questions_url]
elif .apply_method == "easy_apply_endpoint" then ["quick_apply", ""]
else ["redirect", .redirect_apply_url] end) as $flow
| [.id, .name] + $flow | @tsv'
# Stop when a page comes back with fewer jobs than SIZE.
[ "$(printf '%s\n' "$RESPONSE" | jq '.data | length')" -lt "$SIZE" ] && break
PAGE=$((PAGE + 1))
done
# For a full_apply job, fetch its questions from its questions_url.
# This does not need your API key.
curl -sS "<a questions_url from the output above>"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())
def apply_flow(job):
"""Return how to apply to the job, and the URL that flow needs."""
if job.get("external_url"):
# The employer takes applications on its own site.
return "redirect", job["redirect_apply_url"]
if job["apply_method"] == "full_apply_endpoint":
# Fetch the questions from questions_url (no API key needed), then use Full Apply.
return "full_apply", job["questions_url"]
if job["apply_method"] == "easy_apply_endpoint":
return "quick_apply", None
return "redirect", job["redirect_apply_url"]
jobs = search_all_jobs({
"searchbar": "nurse",
"location": "40.777,-73.874",
"radius": 50,
"location_filter": 1,
"source": "your_partner_name",
})
for job in jobs:
flow, url = apply_flow(job)
print(job["id"], job["name"], flow, url or "")// 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()];
}
// Returns how to apply to the job, and the URL that flow needs.
function applyFlow(job: any): [string, string | null] {
if (job.external_url) {
// The employer takes applications on its own site.
return ["redirect", job.redirect_apply_url];
}
if (job.apply_method === "full_apply_endpoint") {
// Fetch the questions from questions_url (no API key needed), then use Full Apply.
return ["full_apply", job.questions_url];
}
if (job.apply_method === "easy_apply_endpoint") {
return ["quick_apply", null];
}
return ["redirect", job.redirect_apply_url];
}
const jobs = await searchAllJobs({
searchbar: "nurse",
location: "40.777,-73.874",
radius: "50",
location_filter: "1",
source: "your_partner_name",
});
for (const job of jobs) {
const [flow, url] = applyFlow(job);
console.log(job.id, job.name, flow, url ?? "");
}Industry Search
Return the list of industries in English and also in Spanish with the number of jobs available in each one. Check all specifications of /jobs/industries.
Request example
https://partners.apploi.com/jobs/industries/?location=40.777,-73.874&radius=50
Note: Remember to add in the headers the x-api-key.
Response example
{
"data": [
{
"en": "Other",
"es": "Otra",
"count": 10096
},
{
"en": "Vet/Animal Services",
"es": "Veterinaria/Servicios animales",
"count": 4
}]
}
City Search
Return the list of cities. Check all specifications of /jobs/cities.
Request example
https://partners.apploi.com/jobs/cities/?location=40.777,-73.874&radius=50
Note: Remember to add in the headers the x-api-key.
Response example
{
"data": [
{
"city": "New York",
"state": "New York",
"state_abbr": "NY",
"lat": 40.7127753,
"long": -74.0059728,
"amount_jobs": 6338
},
{
"city": "Brooklyn",
"state": "New York",
"state_abbr": "NY",
"lat": 40.6781784,
"long": -73.9441579,
"amount_jobs": 535
}]
}
About searching by job_idIf you include the job_id parameter in your searches the results will contain only a single document. If there is no record matching the requested job_id the response payload will be empty.
Updated 6 days ago

