For developers API v1
Remote jobs.
Ready for your
next build.
Put remote opportunities into your job board, community, or internal tool. One free endpoint, useful filters, and structured JSON.
No signup. No API key. Just a GET request.
/api/v1/jobs?category=programming&limit=1{
"data": [
{
"title": "Senior Frontend Engineer",
"company": {
"name": "Acme Corp"
},
"location": "Remote (Worldwide)",
"type": "Full-time"
}
],
"pagination": {
"limit": 1,
"offset": 0,
"has_more": true
}
}- Access
- Free to use
- Authentication
- No API key
- Response format
- JSON
- Page size
- Up to 50 jobs
A job board with a focus
Choose a category and job type to bring relevant opportunities to your audience.
A feed for your community
Find roles by keyword and link members to the full listing and application page.
A tool of your own
Work with structured job, company, location, and salary fields in your app or dashboard.
01 / Quickstart
Make it your own.
Choose the jobs you want, update the request, then copy an example into your project.
https://remotejobs.org/api/v1/jobscurl --fail 'https://remotejobs.org/api/v1/jobs?category=programming&limit=20&offset=0'JavaScript and Python examples run on your server. Cross-origin browser requests aren’t currently supported.
Open JSON response02 / Query parameters
Find the right opportunities.
All parameters are optional. Combine them to narrow your results; active jobs are returned newest first.
| Parameter | Default | How it works |
|---|---|---|
categorystring | All categories | A category slug, such as programming or design. Unknown slugs return an empty page. See available values below. |
typestring | All types | full-time, part-time, contract, or freelance. |
qstring | No search | English full-text search across job titles and descriptions. URL-encode your search terms. |
limitinteger | 20 | Jobs per request, from 1 to 50. |
offsetinteger | 0 | Number of jobs to skip. Use it with limit to fetch the next page. |
Available category slugs 31 categories
- General
general - Programming
programming - Design
design - Marketing
marketing - Sales
sales - Customer Support
customer-support - Writing
writing - Data Science
data-science - DevOps
devops - Product Management
product-management - Human Resources
human-resources - Finance
finance - Legal
legal - Healthcare
healthcare - Dental
dental - Education
education - Curriculum Development
curriculum-development - AI & Machine Learning
ai-machine-learning - AI Training
ai-training - Financial Crimes & AML
financial-crimes - Cybersecurity
cybersecurity - Environmental Health & Safety
ehs - Quality Assurance
quality-assurance - Medical Records
medical-records - Graphic Design
graphic-design - Compliance
compliance - Environmental & Safety
environmental-safety - Fitness & Wellness
fitness-wellness - Cyber Security
cyber-security - Accounting
accounting - Personal Training
personal-training
03 / Response reference
Useful data, without the guesswork.
Each response contains a data array of jobs, a pagination object, and meta with attribution and documentation links.
| Job fields | What to expect |
|---|---|
id, title | A job identifier and the listing title. |
url, apply_url | Both point to the job’s RemoteJobs.org page. Use these links to let readers view the listing and apply. |
company, category | Company name, logo_url, website, and profile url; category name and slug. Logo and website may be null. |
location | The listing’s location text, or null. Remote roles can still have country or region restrictions. |
salary_min, salary_max, salary_text | Salary bounds and the source’s salary text, when available. Any may be null; use salary_text for currency and pay-period context. |
type | Full-time, Part-time, Contract, or Freelance. Response values use these display names, rather than query slugs. |
description | Job description text, which may contain HTML, with a RemoteJobs.org application link appended. Sanitize it before rendering as HTML. |
posted_at | The posting timestamp, returned as an ISO 8601 string. |
is_translated, original_language | Whether the listing was translated, and its original language when recorded. The language may be null. |
View a full JSON example Illustrative data
{
"data": [
{
"id": "a1b2c3d4-5678-4abc-9012-3456789abcde",
"title": "Senior Frontend Engineer",
"url": "https://remotejobs.org/remote-jobs/senior-frontend-engineer-acme",
"apply_url": "https://remotejobs.org/remote-jobs/senior-frontend-engineer-acme",
"company": {
"name": "Acme Corp",
"logo_url": null,
"website": "https://example.com",
"url": "https://remotejobs.org/companies/acme-corp"
},
"category": {
"name": "Programming",
"slug": "programming"
},
"location": "Remote (Worldwide)",
"salary_min": 120000,
"salary_max": 160000,
"salary_text": "$120,000–$160,000 per year",
"type": "Full-time",
"description": "<p>Help us build our next product.</p>\n<p>Apply directly on <a href=\"https://remotejobs.org\">RemoteJobs.org</a>: https://remotejobs.org/remote-jobs/senior-frontend-engineer-acme</p>",
"posted_at": "2026-10-01T09:00:00Z",
"is_translated": false,
"original_language": null
}
],
"pagination": {
"total": 42,
"limit": 1,
"offset": 0,
"has_more": true
},
"meta": {
"powered_by": "RemoteJobs.org",
"url": "https://remotejobs.org",
"docs": "https://remotejobs.org/developers/api"
}
}04 / Pagination
Keep the next page simple.
Start with offset=0. Increase it by your page size for each request, keeping the same filters.
- 01First page
?limit=20&offset=0 - 02Next page
?limit=20&offset=20 - 03Keep going
?limit=20&offset=40
Know when to stop. Check pagination.has_more before continuing, and stop if data is empty. pagination.total is an estimated count. If a count cannot be retrieved, the request returns an error. Listings can change between requests; pagination isn’t a fixed snapshot.
05 / Limits & caching
A little care goes a long way.
Request limits
Keep usage below 200 requests per hour per IP address. Rate limiting is best-effort; this is not a guaranteed quota. API and MCP requests are limited separately. Up to 50 jobs can be returned in each request. Cache results in your application and avoid polling on every page view.
30-minute shared cache
Identical requests may be cached for 30 minutes, with stale responses served for up to another hour while revalidating. Results may not reflect an immediately posted job.
Handle the response
| Status | Next step |
|---|---|
200 OK | Read data and pagination. An empty data array means there are no jobs on this page. |
400 Invalid request | Send whole numbers for limit and offset. |
429 Rate limited | Wait for the number of seconds in Retry-After before trying again. |
500 Server error | The API couldn’t fetch jobs. Retry later rather than treating the failure as an empty result. |
Rate-limit headers: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (a Unix timestamp in seconds).
06 / Attribution
Built with a little help.
If you display listings from the API, please include a visible link back to RemoteJobs.org and keep the job’s application link intact. Here’s a simple attribution you can use.
<a href="https://remotejobs.org">
Powered by RemoteJobs.org
</a>Use of the API and third-party content is covered by our terms of service.
From an idea to an integration
What will you build?
Start with a request. Get in touch if you need help with a larger integration.