Skip to content

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.

Your next idea starts herev1 / JSON
GET/api/v1/jobs?category=programming&limit=1
Example response · abbreviated
{
  "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.

GEThttps://remotejobs.org/api/v1/jobs
Reset
curl --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 response

02 / Query parameters

Find the right opportunities.

All parameters are optional. Combine them to narrow your results; active jobs are returned newest first.

Supported job query parameters, defaults, and usage
ParameterDefaultHow it works
categorystringAll categoriesA category slug, such as programming or design. Unknown slugs return an empty page. See available values below.
typestringAll typesfull-time, part-time, contract, or freelance.
qstringNo searchEnglish full-text search across job titles and descriptions. URL-encode your search terms.
limitinteger20Jobs per request, from 1 to 50.
offsetinteger0Number of jobs to skip. Use it with limit to fetch the next page.
Available category slugs 31 categories
  • Generalgeneral
  • Programmingprogramming
  • Designdesign
  • Marketingmarketing
  • Salessales
  • Customer Supportcustomer-support
  • Writingwriting
  • Data Sciencedata-science
  • DevOpsdevops
  • Product Managementproduct-management
  • Human Resourceshuman-resources
  • Financefinance
  • Legallegal
  • Healthcarehealthcare
  • Dentaldental
  • Educationeducation
  • Curriculum Developmentcurriculum-development
  • AI & Machine Learningai-machine-learning
  • AI Trainingai-training
  • Financial Crimes & AMLfinancial-crimes
  • Cybersecuritycybersecurity
  • Environmental Health & Safetyehs
  • Quality Assurancequality-assurance
  • Medical Recordsmedical-records
  • Graphic Designgraphic-design
  • Compliancecompliance
  • Environmental & Safetyenvironmental-safety
  • Fitness & Wellnessfitness-wellness
  • Cyber Securitycyber-security
  • Accountingaccounting
  • Personal Trainingpersonal-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.

Fields returned for each job
Job fieldsWhat to expect
id, titleA job identifier and the listing title.
url, apply_urlBoth point to the job’s RemoteJobs.org page. Use these links to let readers view the listing and apply.
company, categoryCompany name, logo_url, website, and profile url; category name and slug. Logo and website may be null.
locationThe listing’s location text, or null. Remote roles can still have country or region restrictions.
salary_min, salary_max, salary_textSalary bounds and the source’s salary text, when available. Any may be null; use salary_text for currency and pay-period context.
typeFull-time, Part-time, Contract, or Freelance. Response values use these display names, rather than query slugs.
descriptionJob description text, which may contain HTML, with a RemoteJobs.org application link appended. Sanitize it before rendering as HTML.
posted_atThe posting timestamp, returned as an ISO 8601 string.
is_translated, original_languageWhether the listing was translated, and its original language when recorded. The language may be null.
View a full JSON example Illustrative data
JSON
{
  "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.

  1. 01
    First page?limit=20&offset=0
  2. 02
    Next page?limit=20&offset=20
  3. 03
    Keep 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

API response status codes and recommended handling
StatusNext step
200 OKRead data and pagination. An empty data array means there are no jobs on this page.
400 Invalid requestSend whole numbers for limit and offset.
429 Rate limitedWait for the number of seconds in Retry-After before trying again.
500 Server errorThe 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.

Powered by RemoteJobs.org
HTML
<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.

Get started Talk to us