/jobs/search

Used for retrieving all the jobs that match the specified criteria

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

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(" ")
end

location_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_methodWhat to do
redirectSend the applicant to redirect_apply_url. The job can't be applied to through the API.
easy_apply_endpointThe job has no screening questions. Submit with Quick Apply.
full_apply_endpointFetch 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
Query Params
string

Name of the state to filter. example: Texas

string

Set to 1 to include private (hidden) jobs in results. By default (0), only public jobs are returned.

string

Identifies a specific product promotion or strategic campaign.

string

Identifies which site sent the traffic

string

Language to use for search, this parameter is added to the property redirect_apply_url for apploi jobs. The allowed values are (en|es), By default the value for language is en. Example: language=es.

string

Partner name

string

Name of the city to filter. example: Houston

string

Id of the job. If present the request will return only the specified job (if found)

string

Radius distance in miles from the location coordinates

string

GPS coordinates of the location using the format 'lat,long' for example: 25.7616798,-80.1917902

string

id of the team or teams to search the apploi jobs, if it is more than one, use commas to separate. example: teams=30463,30464

string

Name of the city, Parameter used to group the statistics by city. example: Chicago

string

Number of jobs per page. Defaults to 50. A size above 1000 is served as 1000.

string

Identifies what type of link was used, such as cost per click or email.

string

Use 0 (default) for only sorting by location. Use 1 for filtering by location. into the param.

Keyword(s) to use on the search

string

Page number, starting at 1. Each page holds size jobs (50 by default). page multiplied by size must be less than 10000, or the request returns 400.

string

Name of the industry to filter, should be in English, if it is more than one, use commas to separate. example: Retail,Healthcare,Other

Response

Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json