We Work Remotely APIweworkremotely.com ↗
Search We Work Remotely job listings by keyword. Returns job title, company, location, headquarters, and description for every matching listing in one call.
What is the We Work Remotely API?
The We Work Remotely API exposes 1 endpoint — search_jobs — that runs a keyword search against WWR's listings and returns the full results page as structured data. A single call yields up to the complete set of matching job cards, each with 5 fields including job title, company name, remote location tag, company headquarters, and a listing description. No pagination is needed; the source renders all matches on one page.
curl -X GET 'https://api.parse.bot/scraper/de9becb7-22de-4201-9cea-ac5101a7aeb8/search_jobs?term=developer' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace weworkremotely-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: We Work Remotely job search — bounded, re-runnable."""
from parse_apis.weworkremotely_com_api import WeWorkRemotely, InputFormatInvalid
client = WeWorkRemotely()
# Search for remote developer jobs, cap at 5 results.
try:
for job in client.jobs.search(term="developer", limit=5):
print(job.job_title, "-", job.company_name, f"({job.location})")
print(" Category:", job.category, "| Posted:", job.posted)
print(" Tags:", ", ".join(job.tags))
print(" URL:", job.job_url)
except InputFormatInvalid:
print("Search term was rejected by the site.")
# Drill into the first result of a different search.
hit = client.jobs.search(term="human resources", limit=1).first()
if hit is not None:
print("\nFirst HR listing:", hit.job_title)
print(" Company:", hit.company_name, "| HQ:", hit.company_headquarters)
print(" Snippet:", hit.description_snippet)
print(" Slug:", hit.job_slug)
print("\nexercised: jobs.search")
Runs a keyword search on We Work Remotely and returns every job listing card on the results page in one round trip (the site renders all matches on a single, category-grouped page with no pagination, so `count` is the full number of matching listings; sponsored ad cards are excluded). Each row is one job posting with its title, company, location (the listing's remote-region tag such as 'Anywhere in the World', falling back to the company headquarters when no region tag is shown), company_headquarters, a description_snippet built from the listing's tag line (job type, salary band, region — the site shows no prose summary on result cards), the full job_url, the job_slug identifier, the site category the listing was grouped under, the raw tags list, and the relative posted label (e.g. '12d' or 'New'). A keyword the site has no matches for returns an empty jobs array with count 0 and is a valid result. Empty term is rejected.
| Param | Type | Description |
|---|---|---|
| termrequired | string | Free-text search keyword or phrase matched against job listings (e.g. developer). Multi-word phrases are searched as typed. |
{
"type": "object",
"fields": {
"jobs": "array of job listing objects: job_title, company_name, location (remote region tag or headquarters), company_headquarters, description_snippet (tag line joined with ' · '), job_url (absolute), job_slug, category (site section the listing was grouped under), tags (array of strings), posted (relative age label)",
"term": "string, the search keyword that was applied",
"count": "integer, number of listings returned (all matches; the page is not paginated)"
},
"sample": {
"data": {
"jobs": [
{
"tags": [
"Contract",
"$100,000 or more USD",
"Anywhere in the World"
],
"posted": "12d",
"job_url": "https://weworkremotely.com/remote-jobs/sanctuary-computer-senior-shopify-developer",
"category": "Design Jobs",
"job_slug": "sanctuary-computer-senior-shopify-developer",
"location": "Anywhere in the World",
"job_title": "Senior Shopify Developer",
"company_name": "Sanctuary Computer",
"description_snippet": "Contract · $100,000 or more USD · Anywhere in the World",
"company_headquarters": "New York City"
}
],
"term": "developer",
"count": 25
},
"status": "success"
}
}About the We Work Remotely API
What the API returns
The search_jobs endpoint accepts a single term parameter — a free-text keyword or phrase — and returns an array of job listing objects alongside the original term string and a count integer representing the total number of matched listings. Each object in the jobs array includes job_title, company_name, location (the remote region tag or company headquarters region as displayed on WWR), company_headquarters, and description.
Search behavior and pagination
We Work Remotely groups results by category on a single, non-paginated results page. The API reflects this exactly: count is the full number of matching listings, and the jobs array is complete in one round trip. Multi-word phrases passed to term are matched the same way the site's own search handles them. Sponsored ad cards are excluded from results.
Coverage scope
The API covers the public job listing cards visible on WWR search results — remote-first roles across engineering, design, marketing, customer support, sales, and other categories the site features. Fields are limited to what appears on the listing card level; full job description bodies, application URLs, and posting dates are not included in the current response shape.
The We Work Remotely API is a managed, monitored endpoint for weworkremotely.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when weworkremotely.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official weworkremotely.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate remote job listings by role keyword (e.g., 'python developer') into an internal talent-tracking dashboard
- Monitor when new companies appear in WWR search results for a specific skill or tool
- Build a niche job board that filters WWR listings by location tag or company headquarters region
- Track how many remote listings exist for a given job category keyword over time
- Cross-reference company_name and company_headquarters fields against a CRM to identify hiring activity at known accounts
- Populate a Slack bot that surfaces fresh remote listings for a team's chosen keywords each morning
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does We Work Remotely have an official developer API?+
What does the `location` field contain — is it always 'Worldwide'?+
location field reflects the remote region tag attached to each listing, which can be a broad tag like 'Worldwide', a continent, a specific country, or a US time zone range depending on how the employer posted the role. It is distinct from company_headquarters, which reflects where the company is based.Does the API return full job description text or application links?+
description field drawn from the listing card, which is typically a short summary rather than the full job post body. Application URLs and full posting details are not included in the response. You can fork this API on Parse and revise it to add an endpoint that fetches the individual listing page and returns the full description and application link.Can I filter results by job category, date posted, or company size?+
search_jobs endpoint filters solely by the term keyword. Category filtering, date-posted sorting, and company attributes are not exposed as parameters. You can fork this API on Parse and revise it to add category-scoped endpoints that target WWR's per-category listing pages.