Jobserver API Documentation | Developer Guide
Loading jobserver.ai

Developer access

Jobserver job feed

Two ways to read listings. The free feed checks a verified email, remembers who called, and returns at most 80 jobs. The enterprise feed uses a server-issued key and can page the catalog.

1. Verify the caller email

POST https://jobserver.ai/api-injector/fetchjobs.php

The free feed does not answer until the caller proves they own an email address. Jobserver sends the same 6-digit code used by the other tools. The address must be a normal personal inbox. A confirmed address is stored, and each later job request is stored against that address.

Send the code

Post action=request_code and email. The reply includes verification_id. The code expires in 15 minutes. Too many sends in an hour return HTTP 429.

curl -X POST https://jobserver.ai/api-injector/fetchjobs.php \
  -d "action=request_code" \
  -d "[email protected]"

Confirm the code

Post action=verify_code with email, pin, and verification_id. A correct code returns caller_token. Save it. That token is the only copy Jobserver will show. Verifying the same email again replaces the token, and the previous one stops working.

curl -X POST https://jobserver.ai/api-injector/fetchjobs.php \
  -d "action=verify_code" \
  -d "[email protected]" \
  -d "pin=123456" \
  -d "verification_id=15"

2. Request jobs on the free feed

POST https://jobserver.ai/api-injector/fetchjobs.php

Send the caller token in Authorization: Bearer or in the caller_token field. Send the filters as a normal form body or as JSON. Leave a filter out to skip it. A request with no filters still returns a sample. The sample never contains more than 80 jobs. A missing or unknown token returns HTTP 401.

Request fields

FieldWhat it matches
FcountryCountry name, such as United States Of America
FpatternWork pattern shown on the listing, such as Remote or Hybrid
FsearchWords in the job title
FaddressWords in the job address
caller_tokenToken from email verification. You can send this header instead: Authorization: Bearer

Examples

cURL

curl -X POST https://jobserver.ai/api-injector/fetchjobs.php \
  -H "Authorization: Bearer YOUR_CALLER_TOKEN" \
  -d "Fcountry=United States Of America" \
  -d "Fpattern=Remote" \
  -d "Fsearch=nurse"

JavaScript

const body = new URLSearchParams({
  Fcountry: "United States Of America",
  Fpattern: "Remote",
  Fsearch: "nurse"
});
const response = await fetch("https://jobserver.ai/api-injector/fetchjobs.php", {
  method: "POST",
  headers: { Authorization: "Bearer YOUR_CALLER_TOKEN" },
  body
});
const data = await response.json();

Python

import requests
response = requests.post(
    "https://jobserver.ai/api-injector/fetchjobs.php",
    headers={"Authorization": "Bearer YOUR_CALLER_TOKEN"},
    data={
        "Fcountry": "United States Of America",
        "Fpattern": "Remote",
        "Fsearch": "nurse"
    }
)
data = response.json()

Response

status is Connected to Jobserver AI when the feed answers. caller.email is the verified address for this token. limit is 80. returned is how many jobs are in this reply. jobs is a list. Each item has a job and a company.

When returned is 80, enterprise.offered is true. That means the free sample is full. enterprise.endpoint and enterprise.docs point at the enterprise API, which pages past 80, fetches one job, and lists companies. A shorter sample leaves enterprise.offered false.

FieldMeaning
job.jobpositionRole title
job.jobpatternWork pattern
job.jobexperienceExperience asked for
job.jobdescriptionListing text
job.jobcountryCountry
job.jobaddressAddress or area
job.jobdatePosted label
job.employerCompany name
job.joblinkPublic listing page
company.company_nameCompany name
company.company_logoLogo URL
company.company_profileCompany page
company.company_addressHQCompany address
company.company_countryCompany country
caller.emailVerified address stored for this caller token
limitMaximum jobs in one free response, always 80
returnedHow many jobs this response actually contains
enterprise.offeredTrue when this response contains 80 jobs
enterprise.endpointEnterprise API to use when the free sample is full
enterprise.docsDocumentation for the enterprise key, search, single job, and company list
{
  "status": "Connected to Jobserver AI",
  "caller": { "email": "[email protected]" },
  "limit": 80,
  "returned": 80,
  "enterprise": {
    "offered": true,
    "message": "The free feed stops at 80 jobs. The enterprise API pages the full catalog, fetches one job by id, and lists companies.",
    "endpoint": "https://jobserver.ai/api/v1",
    "docs": "https://jobserver.ai/api-docs#api-v1-title"
  },
  "jobs": [
    {
      "job": {
        "jobposition": "Pharmacy Intern",
        "jobpattern": "part-time",
        "jobcountry": "United States Of America",
        "joblink": "https://jobserver.ai/jobserved?id=2150482878"
      },
      "company": {
        "company_name": "CVS Health Corporation",
        "company_logo": "https://jobserver.ai/companylogo/example.png"
      }
    }
  ]
}

3. Enterprise API

Use this when the free feed returns 80 jobs and you need the rest. It is a separate GET API. A partner key is issued on the server and stored as a hash. It is not the email caller token from the free feed. Each key has a per-minute limit. A limit hit returns HTTP 429. The free feed stays available for verified emails that only need a sample of 80.

GET https://jobserver.ai/api/v1?resource=jobs

GET https://jobserver.ai/api/v1?resource=job&id=123

GET https://jobserver.ai/api/v1?resource=companies

QueryWhat it does
qMatches a job title or company name. On the company route it matches the company name.
countryExact country on the jobs route, such as United States Of America
pagePage number, starting at 1
per_pagePage size, from 1 to 50. The default is 20.
idJob id for resource=job

Issue a key

php cli/issue_api_key.php --label=partner --limit=60

cURL

curl "https://jobserver.ai/api/v1?resource=jobs&q=nurse&country=United%20States%20Of%20America" \
  -H "Authorization: Bearer YOUR_API_KEY"

A missing or unknown key returns HTTP 401. An unknown job returns HTTP 404. List responses include jobs or companies, plus page, per_page, and total. The job route returns one job object, including the description. List rows omit the description.

Jobserver app feed

The iOS and Android app reads open listings without an API key. Each address is limited to 60 requests a minute. List rows omit the description. The job route includes it.

GET https://jobserver.ai/api/mobile?resource=jobs

GET https://jobserver.ai/api/mobile?resource=job&id=123

Optional filters on the jobs route: q (title or company), country (exact), pattern (exact, such as Remote), page, and per_page (1 to 50).