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

ParameterValueDescription
languageenAllowed values en (English) or es (Spanish), used to indicate the language used to search.
location40.777,-73.874Geolocation Point, Used to find jobs close to this point, within the radius range as defined by the radius parameter.
location_filter1Allowed values 1 or 0, if the parameter is 1, a distance filter is applied to return only jobs within the radius parameter.
radius50Radius 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_centerNew+YorkThis 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&nbsp;<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 NameValuesDescription
apply_method
  • redirect.
  • easy_apply_endpoint.
  • full_apply_endpoint.

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:
  • redirect: Indicates that the job is not an Apploi job and should use the redirect_apply_url.
  • easy_apply_endpoint: indicates that you should use Quick Apply
  • full_apply_endpoint: indicates that you should use Full Apply
number_of_questions_allowed
  • Integer
  • 0 For apply_method redirect or easy_apply_endpoint
  • 0 For full_apply_endpoint

preferred
  • true
  • false
  • true If the job is sponsored.
  • false if the job is not sponsored.
redirect_apply_urlstringUrl where the person can apply to the job.
partner_attributesJson ObjectIf you need use the apply integration you need to check Partner Attributes
questions_urlstringUrl 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. Fetching questions_url does 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_id

If 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.