Give it a company, get its open jobs - in one consistent shape, ready to filter.
Job Postings is a jobs API that returns the open positions on a company's public career board. Every job comes back in the same shape: title, department, team, locations, remote and workplace type, employment type, posting date and apply link. Filter by keyword, location, department, employment type, posting date or remote. Paid plans add the full job description and salary ranges where the company publishes them.
Try it — live request, no key required
No key required to try it. Get a key to use it in your app.
{
"status": "ok",
"error": null,
"data": {
"company": "Airbnb",
"boardTotal": 174,
"truncated": false,
"total": 174,
"page": 1,
"pages": 4,
"count": 2,
"jobs": [
{
"id": "8299386",
"title": "Office Manager, China",
"department": "People",
"team": null,
"location": "Beijing, China",
"locations": [
"Beijing, China"
],
"remote": false,
"workplaceType": "onsite",
"employmentType": null,
"experienceLevel": null,
"postedAt": "2026-10-19T01:34:11.000Z",
"updatedAt": "2026-10-19T01:34:11.000Z",
"url": "https://careers.airbnb.com/positions/8299386?gh_jid=8299386",
"applyUrl": "https://careers.airbnb.com/positions/8299386?gh_jid=8299386",
"summary": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences…",
"description": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences that make it possible for guests to connect with communities in a more authentic way.\n\nYour Location:\n\nThis position needs to be based in the Beijing, China office 5 days a week. No Visa/Relocation Support.\n\nThe Community you will join:\n\nThe Office Manager plays a critical role in delivering a seamless and welcoming office experience by coordinating daily office operations, supporting local leaders and employees, and…",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null,
"summary": null
}
},
{
"id": "8299396",
"title": "Head of Homes Supply, Thailand & Vietnam",
"department": "Sales",
"team": null,
"location": "Bangkok, Thailand",
"locations": [
"Bangkok, Thailand",
"Bangkok, Bangkok Metropolis, Thailand"
],
"remote": true,
"workplaceType": "remote",
"employmentType": null,
"experienceLevel": null,
"postedAt": "2026-10-18T08:55:16.000Z",
"updatedAt": "2026-10-18T08:55:16.000Z",
"url": "https://careers.airbnb.com/positions/8299396?gh_jid=8299396",
"applyUrl": "https://careers.airbnb.com/positions/8299396?gh_jid=8299396",
"summary": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences…",
"description": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences that make it possible for guests to connect with communities in a more authentic way.\n\nThe Community You Will Join\n\nThe Homes team grows Airbnb's destination business. We manage a competitive portfolio of accommodations that meets guest expectations for value, variety, and quality. We help all types of hosts grow their business through new products, partnerships, best practices, and innovation.\n\nThe Difference You Will…",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null,
"summary": null
}
}
]
}
}
About the Job Postings API
Company career boards each publish jobs in their own format, with their own names for the same things. Job Postings maps every board to one schema, so the same code works for any company it covers. Pass the company name, such as airbnb or ramp, or a link to the company's careers board, and get its open roles newest first. Up to 2,000 open jobs are returned per company, paged, and filters for keyword, location, department and remote work run before paging.
What people use it for
- Job Aggregators
- Job boards and niche job sites pull the open roles at the companies they track, in one schema whatever career board each company uses.
- Hiring Signals
- Sales and investment tools watch which companies are hiring, for which teams and where, as a growth signal.
- Career Pages
- Agencies and site builders show a client's live openings on their own pages without integrating each careers system separately.
- Job Alerts
- Alert services check a list of companies for new roles matching a keyword, location or remote preference.
Ways to call it
One endpoint, many ways in — REST with JSON, XML, YAML and CSV, plus GraphQL and an MCP interface for AI agents.
- JSON
- Default REST response
- XML
- Markup format
- YAML
- Human-readable
- CSV
- Tabular export
- GraphQL
- Query language
- MCP
- For AI agents
Other ways to use Job Postings
Same data, same APIVerve account, same credit balance — one key works on all of them.
Which companies does it cover?
What do I pass as company?
How current are the jobs?
Why is a field null for some jobs?
What do I get on the free plan?
Request parameters — GET /v1/jobpostings
Sent in the query string. Premium parameters are accepted on every plan but only take effect on plans that include them. Anything not listed here is dropped rather than passed through.
Required
| Parameter | Type | Example | Description |
|---|---|---|---|
companyRequired | string | airbnb | The company's career board name, usually the company name in lowercase, for example airbnb, stripe or palantir. Required unless url is given. length 0-100 |
Optional
| Parameter | Type | Example | Description |
|---|---|---|---|
keywordOptional | string | engineer | Return only jobs whose title, department or team contains every word given, for example engineer or product designer. length 0-100 |
locationOptional | string | New York | Return only jobs with a location containing this text, for example London, New York or Germany. length 0-100 |
remoteOptional | boolean | true | true returns only jobs open to remote work; false only jobs that are not. |
departmentOptional | string | Engineering | Return only jobs whose department or team contains this text, for example Engineering or Sales. length 0-100 |
employmentTypeOptional | string | full-time | Return only jobs of this employment type. Jobs whose board gives no employment type are kept, since many boards leave it blank; only jobs of another type are left out.full-timepart-timecontractinternshiptemporary |
postedSinceOptional | string | 7d | Return only jobs first published at or after this date or date-time (ISO 8601, for example 2026-10-01), or within this age: a number followed by h, d or w, for example 12h, 7d or 2w. Jobs with no posting date are left out when this is set. length 0-30 |
minSalaryOptionalPremium | number | 100000 | Return only jobs whose salary range reaches at least this amount, in the job's own currency and pay period: the top of the range is compared, or the bottom when no top is given. Jobs that publish no salary are left out when this is set. range 0-inf |
pageOptional | integer | 1 | Page of results to return: 10 jobs per page on the free plan, 50 on paid plans. default 1 · range 1-200 |
curl "https://api.apiverve.com/v1/jobpostings?company=airbnb&keyword=engineer&location=New%20York&remote=true&department=Engineering&employmentType=full-time&postedSince=7d&minSalary=100000&page=1" \
-H "x-api-key: YOUR_API_KEY"Authentication
Send your key in the x-api-key header. That is the only auth step — no token exchange, and no per-endpoint scope to configure.
| Header | When | Value |
|---|---|---|
x-api-keyRequired | Every request | Your API key. Header names are case-insensitive, so X-API-Key is the same header. |
AuthorizationAlternate | Instead of the above | Bearer <key> — for clients that only expose bearer auth. Resolves to the same account and the same billing. |
A 401 means the key is missing, invalid or expired. A 403 means the key is valid but not permitted here — blocked by a key restriction or an IP allow-list. Running out of credits is a 429.
Response — GET /v1/jobpostings
Every APIVerve endpoint returns the same three top-level keys, so one response handler covers your whole integration: status, error and data. Only data changes shape.
{
"status": "ok",
"error": null,
"data": {
"company": "Airbnb",
"boardTotal": 174,
"truncated": false,
"total": 174,
"page": 1,
"pages": 4,
"count": 2,
"jobs": [
{
"id": "8299386",
"title": "Office Manager, China",
"department": "People",
"team": null,
"location": "Beijing, China",
"locations": [
"Beijing, China"
],
"remote": false,
"workplaceType": "onsite",
"employmentType": null,
"experienceLevel": null,
"postedAt": "2026-10-19T01:34:11.000Z",
"updatedAt": "2026-10-19T01:34:11.000Z",
"url": "https://careers.airbnb.com/positions/8299386?gh_jid=8299386",
"applyUrl": "https://careers.airbnb.com/positions/8299386?gh_jid=8299386",
"summary": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences…",
"description": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences that make it possible for guests to connect with communities in a more authentic way.\n\nYour Location:\n\nThis position needs to be based in the Beijing, China office 5 days a week. No Visa/Relocation Support.\n\nThe Community you will join:\n\nThe Office Manager plays a critical role in delivering a seamless and welcoming office experience by coordinating daily office operations, supporting local leaders and employees, and…",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null,
"summary": null
}
},
{
"id": "8299396",
"title": "Head of Homes Supply, Thailand & Vietnam",
"department": "Sales",
"team": null,
"location": "Bangkok, Thailand",
"locations": [
"Bangkok, Thailand",
"Bangkok, Bangkok Metropolis, Thailand"
],
"remote": true,
"workplaceType": "remote",
"employmentType": null,
"experienceLevel": null,
"postedAt": "2026-10-18T08:55:16.000Z",
"updatedAt": "2026-10-18T08:55:16.000Z",
"url": "https://careers.airbnb.com/positions/8299396?gh_jid=8299396",
"applyUrl": "https://careers.airbnb.com/positions/8299396?gh_jid=8299396",
"summary": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences…",
"description": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who have welcomed over 2 billion guest arrivals in almost every country across the globe. Every day, hosts offer unique stays and experiences that make it possible for guests to connect with communities in a more authentic way.\n\nThe Community You Will Join\n\nThe Homes team grows Airbnb's destination business. We manage a competitive portfolio of accommodations that meets guest expectations for value, variety, and quality. We help all types of hosts grow their business through new products, partnerships, best practices, and innovation.\n\nThe Difference You Will…",
"salary": {
"min": null,
"max": null,
"currency": null,
"interval": null,
"summary": null
}
}
]
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
company | string | "Airbnb" | Company name as its career board gives it; null when the board does not name the company |
boardTotal | number | 174 | Number of open jobs on the board |
truncated | boolean | false | true when the company has more open jobs than are returned across all pages |
total | number | 174 | Number of jobs matching the filters |
page | number | 1 | Page of results returned |
pages | number | 4 | Number of pages of matching jobs |
count | number | 2 | Number of jobs returned on this page |
jobs | array[2] | Jobs on this page, newest first | |
id | string | "8299386" | The job's id on the company's career board |
title | string | "Office Manager, China" | Job title |
department | string | "People" | Department the job is in; null when the board gives none |
team | object | null | Team or job function; null when the board gives none |
location | string | "Beijing, China" | Primary location of the job |
locations | array | [Beijing, China] | Every location the job is offered in, primary first |
remote | boolean | false | true when the job is open to remote work |
workplaceType | string | "onsite" | remote, hybrid or onsite; null when the board does not say |
employmentType | object | null | full-time, part-time, contract, internship, temporary or volunteer; null when the board does not say |
experienceLevel | object | null | Seniority the job is posted at, as the board words it; null when the board does not say |
postedAt | string | "2026-10-19T01:34:11.000Z" | When the job was first published (ISO 8601) |
updatedAt | string | "2026-10-19T01:34:11.000Z" | When the job was last updated (ISO 8601); null when the board does not publish it |
url | string | "https://careers.airbnb.com/positions/8299386?gh_jid=8299386" | URL of the job's posting page |
applyUrl | string | "https://careers.airbnb.com/positions/8299386?gh_jid=8299386" | URL to apply for the job |
summary | string | "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who h… | Opening of the job description, up to 280 characters; null when the board lists no description |
descriptionPremium | string | "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 million hosts who h… | Full job description as plain text; null when the board lists no description |
salary | object | {...} | Salary range as the company publishes it; every value is null when it publishes none |
minPremium | object | null | Lower end of the salary range |
maxPremium | object | null | Upper end of the salary range |
currencyPremium | object | null | ISO 4217 currency of the salary range |
intervalPremium | object | null | Period the salary is paid per: year, month, week, day or hour |
summaryPremium | object | null | The salary range as the company words it, for example $211.4K - $290.6K |
Response headers
Every response carries your balance, so your own code always knows where it stands without polling anything. All four are exposed to browsers through CORS.
| Header | What it carries |
|---|---|
x-api-remaining-credits | Credits left in the current cycle |
x-api-credits-used | Credits spent in the current cycle |
x-api-max-credits | The allowance for the cycle |
x-api-version | Version of the endpoint that answered |
Errors
Read the HTTP status first, then error for the specific reason. The body names the parameter that has to change.
| Status | Meaning | What to do |
|---|---|---|
400 | Input was rejected | Read error; it names the parameter that has to change. |
401 | Key missing or invalid | Check the header name and the key value. |
403 | Key valid, but not permitted here | A key restriction or an IP allow-list — never a bad key. |
429 | Rate limited, or out of credits | Read error to tell them apart, then back off or top up. |
What a call costs — 10 credits per call
Credits are shared across every APIVerve API — one balance, one key, one bill. Failed requests never count against it, so a rejected input costs nothing.
| Plan | Per month | Credits | Job Postings calls | Per 1,000 calls |
|---|---|---|---|---|
| Free | Free | 200 | 20 | Free |
| Starter | $29.99 | 200,000 | 20,000 | $1.50 |
| Pro | $99.99 | 1,000,000 | 100,000 | $1.00 |
| Mega | $299.99 | 4,000,000 | 400,000 | $0.75 |
Calls are what the credits buy at this API's rate — spend them here, on any of the other APIs, or across both. Nothing is reserved per endpoint.
Call it from cURL — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
curl "https://api.apiverve.com/v1/jobpostings" \
-H "x-api-key: YOUR_API_KEY"Resources
Call it from Node.js — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
const res = await fetch("https://api.apiverve.com/v1/jobpostings", {
headers: { "x-api-key": "YOUR_API_KEY" },
});
const { data } = await res.json();
console.log(data);Resources
Call it from Python — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
import requests
res = requests.get(
"https://api.apiverve.com/v1/jobpostings",
headers={"x-api-key": "YOUR_API_KEY"},
)
print(res.json()["data"])Resources
Call it from C# / .NET — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var json = await client.GetStringAsync("https://api.apiverve.com/v1/jobpostings");
Console.WriteLine(json);Resources
Call it from Go — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
req, _ := http.NewRequest("GET", "https://api.apiverve.com/v1/jobpostings", nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))Resources
Call it from PHP — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
$ch = curl_init("https://api.apiverve.com/v1/jobpostings");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: YOUR_API_KEY"]);
$response = curl_exec($ch);
echo $response;Resources
Call it from Ruby — GET /v1/jobpostings
No SDK to install — this is a plain HTTPS call to /v1/jobpostings with your key in the x-api-key header. Swap in a real key and it runs as-is.
require "net/http"
uri = URI("https://api.apiverve.com/v1/jobpostings")
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = "YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.bodyResources
Zero-code embed — one snippet, no backend
Drop an interactive Job Postings form onto any page. The widget calls the API for you, so no key ever appears in your markup and there is nothing to deploy.
Changelog — Job Postings API
Every change to this endpoint, newest first. Breaking changes ship as a new version and the previous one keeps serving — response fields are added, never removed or retyped in place, so an integration written against v1 keeps working.
Entries are picked up from dated catalog snapshots, so the first one appears after the next snapshot that moves something. A period where nothing changed produces no entry — silence is a valid changelog for the Job Postings API.
data
- Job Postings
- Job Search