Lets get started finding your next job :]
Developer access
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.
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.
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]"
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"
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.
| Field | What it matches |
|---|---|
Fcountry | Country name, such as United States Of America |
Fpattern | Work pattern shown on the listing, such as Remote or Hybrid |
Fsearch | Words in the job title |
Faddress | Words in the job address |
caller_token | Token from email verification. You can send this header instead: Authorization: Bearer |
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"
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();
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()
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.
| Field | Meaning |
|---|---|
job.jobposition | Role title |
job.jobpattern | Work pattern |
job.jobexperience | Experience asked for |
job.jobdescription | Listing text |
job.jobcountry | Country |
job.jobaddress | Address or area |
job.jobdate | Posted label |
job.employer | Company name |
job.joblink | Public listing page |
company.company_name | Company name |
company.company_logo | Logo URL |
company.company_profile | Company page |
company.company_addressHQ | Company address |
company.company_country | Company country |
caller.email | Verified address stored for this caller token |
limit | Maximum jobs in one free response, always 80 |
returned | How many jobs this response actually contains |
enterprise.offered | True when this response contains 80 jobs |
enterprise.endpoint | Enterprise API to use when the free sample is full |
enterprise.docs | Documentation 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"
}
}
]
}
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
| Query | What it does |
|---|---|
q | Matches a job title or company name. On the company route it matches the company name. |
country | Exact country on the jobs route, such as United States Of America |
page | Page number, starting at 1 |
per_page | Page size, from 1 to 50. The default is 20. |
id | Job id for resource=job |
php cli/issue_api_key.php --label=partner --limit=60
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.
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).