Arbeitnow API: Free Job Board Endpoint, Limits & Examples
TL;DR
Arbeitnow's job board API is a free, keyless GET endpoint at https://www.arbeitnow.com/api/job-board-api, with a separate UK endpoint at arbeitnow.co.uk. It returns 300 jobs per page, focused on Europe and Germany and sourced mostly from ATS platforms such as Greenhouse, SmartRecruiters, Join, Teamtailor, Recruitee and Comeet. The only documented filter is visa_sponsorship, and paging is a page parameter with no total count. Arbeitnow's terms require a link back to Arbeitnow.com and say the permission to use the API can be revoked at any time.
On this page
The Arbeitnow API is one free endpoint with no key: send GET https://www.arbeitnow.com/api/job-board-api and you get 300 jobs per page as JSON, newest first. There's a separate UK endpoint at https://www.arbeitnow.co.uk/api/job-board-api. The only documented filter is visa_sponsorship=true, and Arbeitnow's terms ask for a link back to Arbeitnow.com in exchange.
Arbeitnow is a Berlin-based job board focused on Europe, with an emphasis on visa sponsorship, remote and four-day-week roles. Its blog says the API's data comes mostly from applicant tracking systems: Greenhouse, SmartRecruiters, Join.com, Teamtailor, Recruitee and Comeet. This guide covers the endpoints, the full response, working code, and the terms and limits that matter before you build on it. Everything here was checked against Arbeitnow's own pages and live responses on November 1, 2026.
At a Glance
| Endpoint | GET https://www.arbeitnow.com/api/job-board-api |
| UK endpoint | GET https://www.arbeitnow.co.uk/api/job-board-api |
| Auth | None, no key or signup |
| Page size | 300 jobs per page (meta.per_page) |
| Filters | visa_sponsorship=true is the only one documented |
| Paging | ?page=, with links.next; no total count |
| Rate limit | x-ratelimit-limit: 50 header; window not stated |
| Terms | Link back to Arbeitnow.com required; access can be revoked |
Getting Access
There's nothing to sign up for. Arbeitnow's blog post on the API says it "requires no API key," and every response includes a short notice in meta.terms:
This is a free public API for jobs, please do not abuse. I would appreciate linking back to the site. By using the API, you agree to the terms of service present on Arbeitnow.com
That last sentence matters, and it's covered under Terms and Usage below.
The Endpoint
curl "https://www.arbeitnow.com/api/job-board-api"
# Only jobs that offer visa sponsorship
curl "https://www.arbeitnow.com/api/job-board-api?visa_sponsorship=true"
# Second page
curl "https://www.arbeitnow.com/api/job-board-api?page=2"Request Parameters
| Parameter | Notes |
|---|---|
page | Page number, starting at 1 |
visa_sponsorship | true to return only jobs offering visa sponsorship |
That's the whole documented list. remote is a field in the response, not a filter: when we sent remote=true, the first page still came back mixed, with only 9 of 300 jobs marked remote. Filter on job.remote in your own code instead. There's no keyword, location, company or date filter, so for anything more specific you fetch pages and filter client-side.
The Response
A response has three top-level keys: data, links and meta. The structure below is from a live response; the job values are trimmed:
{
"data": [
{
"slug": "senior-backend-engineer-123456",
"company_name": "Acme GmbH",
"title": "Senior Backend Engineer",
"description": "<p>We are looking for...</p>",
"remote": false,
"url": "https://www.arbeitnow.com/jobs/companies/acme/senior-backend-engineer-123456",
"tags": ["Engineering"],
"job_types": ["fulltime permanent"],
"location": "Berlin, Berlin, Germany",
"created_at": 1793537717
}
],
"links": {
"first": "https://www.arbeitnow.com/api/job-board-api?page=1",
"last": null,
"prev": null,
"next": "https://www.arbeitnow.com/api/job-board-api?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"to": 300,
"per_page": 300,
"path": "https://www.arbeitnow.com/api/job-board-api",
"terms": "This is a free public API for jobs, please do not abuse. ...",
"info": "Jobs are updated every hour and order by the `created_at` timestamp. Use `?page=` to paginate. ..."
}
}| Field | What it is |
|---|---|
slug | Arbeitnow's job identifier, also the end of its URL |
company_name | Company name |
title | Job title |
description | Full description as HTML; in our responses it arrived HTML-escaped (<p>), so decode it before rendering |
remote | Boolean remote flag |
url | The job's page on arbeitnow.com, not the employer's own posting |
tags | Category tags, such as Engineering or Product |
job_types | Free-form strings, such as fulltime permanent or Experienced; often empty |
location | One display string, sometimes empty |
created_at | Unix timestamp in seconds |
meta.info says jobs are updated every hour and ordered by created_at.
Code Examples
JavaScript (Node 18+)
async function fetchArbeitnowPage(page = 1, { visaSponsorship = false } = {}) {
const params = new URLSearchParams({ page: String(page) });
if (visaSponsorship) params.set("visa_sponsorship", "true");
const res = await fetch(`https://www.arbeitnow.com/api/job-board-api?${params}`);
if (!res.ok) throw new Error(`Arbeitnow API error: ${res.status}`);
const { data, links } = await res.json();
return { jobs: data, hasMore: Boolean(links.next) };
}
const { jobs } = await fetchArbeitnowPage(1);
const remoteJobs = jobs.filter((job) => job.remote); // remote is a field, not a filter
console.log(`${jobs.length} jobs on page 1, ${remoteJobs.length} remote`);Python
import html
import requests
def fetch_arbeitnow_page(page: int = 1, visa_sponsorship: bool = False) -> dict:
params = {"page": page}
if visa_sponsorship:
params["visa_sponsorship"] = "true"
res = requests.get("https://www.arbeitnow.com/api/job-board-api", params=params, timeout=30)
res.raise_for_status()
return res.json()
body = fetch_arbeitnow_page(1)
for job in body["data"]:
description_html = html.unescape(job["description"])
print(job["title"], "|", job["company_name"], "|", job["location"] or "no location")Paging Through Results
Request ?page=1, then follow links.next until it's null or a page comes back empty. There's no total count: links.last is null and meta has no total, so you can't know up front how many pages exist.
Pages are big (300 jobs), and the feed only changes hourly, so fetch on a schedule, store what you get, and dedupe on slug. Re-reading the whole feed on every user request is exactly the abuse the meta.terms notice asks you to avoid.
Errors
Arbeitnow doesn't document error codes. Treat any non-200 response as a failure, back off, and retry later. Responses carry x-ratelimit-limit and x-ratelimit-remaining headers, so watch x-ratelimit-remaining and slow down before it reaches zero.
Limits and Pricing
The API is free. The only limit we could see is the x-ratelimit-limit: 50 response header; Arbeitnow doesn't say over what time window it applies. There's no published paid plan, but Arbeitnow's blog offers a "custom, private, tailored API endpoint" for a monthly fee, by email.
Terms and Usage
Read these before you put Arbeitnow data in a product:
- Link back. Section 11 of Arbeitnow's terms of service says: "You also agree to providing a link back to Arbeitnow.com on your platform."
- Revocable. The same section says the API is provided "as is" and "as available" and "We may revoke the permission to use API at any time."
- Use license. Section 2.1 grants permission "to temporarily download one copy of the materials" and lists restrictions including using the materials "for any commercial purpose, or for any public display (commercial or non-commercial)" and mirroring them "on any other server." The terms don't say whether that clause covers API data, so ask Arbeitnow before you build a commercial or public product on it.
What the Arbeitnow API Doesn't Give You
- Search filters. No keyword, location, company, salary or date filters; only
visa_sponsorship. - Salary. There's no salary field.
- Structured location.
locationis one string, sometimes empty, with no IDs or coordinates. - Direct employer apply links.
urlpoints to Arbeitnow's job page. - Company data. Only
company_name: no logo, website or size. - Global coverage. The focus is Europe and Germany, plus the separate UK endpoint.
Alternatives
- CleanJobData vs Arbeitnow: a side-by-side with a global API over employer ATS platforms and career sites, with structured filters and published commercial terms.
- The Remotive API: another free, keyless feed, for remote jobs only.
- The best free job APIs in 2026: every free option we've tested.
FAQ
Does the Arbeitnow API need an API key?
No. You call https://www.arbeitnow.com/api/job-board-api directly with no key, header or signup.
How many jobs does the Arbeitnow API return per request?
300 per page, according to meta.per_page in the response. Use ?page= to get the next 300, and stop when links.next is null.
Can I filter Arbeitnow jobs by remote or location?
Not server-side. The only documented filter is visa_sponsorship=true. remote is a boolean on each job, so filter on it in your code; the same goes for location.
What are the Arbeitnow API rate limits?
Responses carry an x-ratelimit-limit header of 50, but Arbeitnow doesn't say what time window it covers. Fetch on a schedule and cache, since the feed only updates hourly.
Can I use Arbeitnow API data commercially?
It isn't clearly granted. The terms require a link back to Arbeitnow.com, let Arbeitnow revoke API access at any time, and include a use license that restricts commercial use and public display, without saying whether that applies to the API. Ask Arbeitnow before launching a product on it.
Is there an alternative with global coverage and filters?
CleanJobData is a self-serve API with a free trial: search by title, location IDs, remote type, salary, experience level and more, using GET requests and a Bearer token. It sources from employer ATS platforms and career sites worldwide rather than from Arbeitnow's board. See the Jobs API reference or try it in the playground.