WeWorkRemotely Jobs Scraper [Only $0.99๐Ÿ’ฐ] avatar

WeWorkRemotely Jobs Scraper [Only $0.99๐Ÿ’ฐ]

Pricing

from $0.99 / 1,000 results

Go to Apify Store
WeWorkRemotely Jobs Scraper [Only $0.99๐Ÿ’ฐ]

WeWorkRemotely Jobs Scraper [Only $0.99๐Ÿ’ฐ]

Scrape WeWorkRemotely for remote-job leads at $0.99/1K โ€” recruit cross-border, benchmark salaries, mirror the board into your warehouse. Title, company, salary, employment type, eligible-countries list (200+ per job), external apply URL. Auto-routes any WWR URL. JSON or CSV.

Pricing

from $0.99 / 1,000 results

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

26

Total users

23

Monthly active users

5 days ago

Last modified

Share

WeWorkRemotely Jobs Scraper

How it works

How WeWorkRemotely Jobs Scraper Works

Scrape every remote job on WeWorkRemotely.com โ€” title, company, full description, salary, employment type, applicant country eligibility (200+ countries per job), and the real external apply URL. One actor, JSON or CSV out.

Paste any WeWorkRemotely URL โ€” the main listing, a category, a search, or a direct job link โ€” and get a clean dataset with one row per job. Auto-routes by URL pattern. Pure HTTP (no browser, no CAPTCHA solver).

๐Ÿ’ฐ $1.99 per 1,000 results. Half the price of the next-tier competitor, with a richer schema and the only WWR scraper that surfaces applicantCountries.


โœจ Why use this scraper?

  • Every URL surface, one actor. Main listing (/remote-jobs), category pages (/categories/{slug}), search results (/remote-jobs/search?term=...), and direct job-detail URLs are all accepted. URLs are auto-classified โ€” mix freely in one run.
  • JSON-LD-first parsing. Every WWR detail page exposes a structured JobPosting block. We extract from that, not brittle DOM selectors โ€” your scrapes don't break when WWR redesigns.
  • The applicantCountries differentiator. WeWorkRemotely encodes a per-job country eligibility list (often 200+ countries). No other scraper on the Apify Store exposes this cleanly. It's the field for geo-targeted recruiting.
  • Real external apply URL. The on-page "Apply now" button is locked behind a WWR login on most jobs. We extract the JSON-LD url field, which is the actual company-side apply URL โ€” what your buyers actually want.
  • Salary parsing. salaryMin, salaryMax, salaryCurrency, and unit parsed from JSON-LD baseSalary. (Note: WWR sometimes uses 0/0 as a placeholder when the employer didn't supply a salary โ€” that's surfaced as min: 0, max: 0, not omitted.)
  • Pagination handled. Category and search listings paginate via ?page=N; the actor walks all pages until maxItems is hit.
  • JSON or CSV out. Auto-exported to both formats for every run.

What makes this richer than alternatives

CapabilityThis actorOther WWR scrapers on Apify Store
Pricing$1.99 / 1,000 resultsFree up to $4 / 1K
applicantCountriesโœ… Full country array (200+ entries)โŒ Not exposed by any other scraper
External apply URLโœ… Real company-side URL from JSON-LDโš ๏ธ Often returns WWR's locked "Apply now" link
Salary parsingโœ… min, max, currency, unit from JSON-LDโš ๏ธ Often raw string only
URL surfacesMain + category + search + directMostly main listing or single URL only
PaginationAuto-walks ?page=NMixed (some scrapers stop at page 1)
Output optionsJSON + CSV (auto-exported)JSON only on most
HTTP stackimpit (Firefox/Chrome TLS fingerprints) + retry chainPlain HTTP on some

Supported inputs

The actor has two alternative input paths โ€” pick one:

Paste any weworkremotely.com URL in startUrls. Any WWR page that lists jobs is supported โ€” the actor extracts every /remote-jobs/{slug} anchor from whatever page you paste.

Listing URLs

PatternExampleWhat it does
/remote-jobs/remote-jobsMain remote-jobs listing
/categories/{slug}/categories/remote-front-end-programming-jobs, /categories/remote-customer-support-jobs, etc.Category listings (every WWR category works)
/100-percent-remote-jobs/100-percent-remote-jobsLocation / scope filter pages
/remote-full-time-jobs / /remote-contract-jobssameEmployment-type filters
/remote-jobs/search?term={query}/remote-jobs/search?term=javascriptSearch results

Job detail URLs

PatternWhat it does
/remote-jobs/{company-slug}-{job-slug}Single job โ€” fetched and parsed directly. URL may end with -1/-2/-3 etc. when the company has multiple jobs with similar slugs.

Mix any combination in startUrls; each URL is auto-classified by shape.

Option B โ€” Configure with Filters ๐ŸŽ›๏ธ

Leave startUrls empty and pick filters instead. The actor builds the matching WWR URL from your selection.

FilterRoutes toNotes
searchKeyword/remote-jobs/search?term=โ€ฆHighest priority โ€” wins over category if both are set
category/categories/{slug}10 official categories supported (Full-Stack Programming, Front-End, Back-End, DevOps, Design, Product, Management & Finance, Sales & Marketing, Customer Support, All Other)
employmentType: full-time/remote-full-time-jobsOnly applied when keyword + category are empty
employmentType: contract/remote-contract-jobsSame
nothing/remote-jobsDefault โ€” all jobs

WWR filters do not combine (a keyword on a category URL is ignored by WWR's server), so the actor picks exactly one URL from your filter inputs in the priority order above. If you need multi-filter behavior, use Option A and paste multiple URLs.

Option A wins when both are set โ€” if startUrls is non-empty, Option B filters are ignored entirely.


๐ŸŽฏ Use cases

TeamTypical use
Recruiters / talent sourcingPull active remote jobs by category (programming, design, marketing, support, etc.) and country eligibility. Filter on applicantCountries to find jobs open to candidates in your region.
Job-board aggregatorsMirror WWR's listings into your own dataset with normalised fields. Schedule daily runs to capture new postings.
Salary benchmarkingBuild a remote-salary dataset from salaryMin / salaryMax / salaryCurrency across categories.
Sales / BDBuild a target list of remote-first companies hiring engineers / designers / etc., with their external website (companyUrl) for outreach.
Market researchTrack which job categories and countries are most heavily represented across WWR over time.

Quick start

// Programming jobs, first 50
{ "startUrls": ["https://weworkremotely.com/categories/remote-programming-jobs"], "maxItems": 50 }
// JavaScript jobs by search keyword
{ "startUrls": ["https://weworkremotely.com/remote-jobs/search?term=javascript"], "maxItems": 100 }
// Multiple categories in one run
{ "startUrls": [
"https://weworkremotely.com/categories/remote-programming-jobs",
"https://weworkremotely.com/categories/remote-customer-support-jobs",
"https://weworkremotely.com/categories/remote-marketing-jobs"
], "maxItems": 200 }
// Single job by direct URL
{ "startUrls": ["https://weworkremotely.com/remote-jobs/codesignal-software-engineer-business-experience-1"] }

Input configuration

FieldTypeRequiredNotes
startUrlsstring[]yes (or use Option B)Listing, category, search, or detail URLs. Mix freely.
categorystringoptional (Option B)One of the 10 WWR categories. Routes to /categories/{slug}.
searchKeywordstringoptional (Option B)Keyword search. Wins over category if both are set.
employmentTypestringoptional (Option B)full-time / contract. Only used when category and searchKeyword are empty.
includeDetailPagesbooleanno (default true)ON โ€” fetch every job's detail page (full 23+ field schema). OFF โ€” emit rows directly from listing cards (~12 fields, ~30ร— faster).
countriesstring[]noPost-filter on applicantCountries[]. ISO-2 codes (e.g. ["US", "GB", "DE"]). Empty = no filter. No effect in listing-only mode.
timeFilterstringno (default any)Post-filter on postedDate. One of "", "24h", "7d", "30d", "90d".
regionsstring[]noPost-filter on listing-card region labels. Case-insensitive substring match against tags[]. WWR uses values like "Anywhere in the World" and "United States of America" (with flag emojis).
jobTypesstring[]noPost-filter on employmentType[]. Multi-select array (e.g. ["Full-Time", "Contract"]). Distinct from Option B's URL-routing employmentType.
minSalaryintegerno (default 0)Post-filter โ€” keep rows where salary.min >= minSalary OR salary is unspecified. Permissive on null/0 to avoid dropping jobs with no posted salary. USD.
includeDescriptionbooleanno (default true)When false, drops description, descriptionHtml, descriptionText from output. Lighter dataset.
cleanHtmlbooleanno (default false)When true, emits only plain-text description (from our descriptionText); drops the HTML variants. Ignored when includeDescription is false.
maxItemsintegerno (default 1000)Hard cap on jobs collected. Non-paying users are capped at 100.
maxConcurrencyintegerno (default 10)Parallel job-detail fetches.
minConcurrencyintegerno (default 1)Min parallel fetches.
maxRequestRetriesintegerno (default 5)Retries per failed request.
proxyobjectno (default RESIDENTIAL)Apify proxy config. WWR blocks datacenter IPs โ€” keep RESIDENTIAL.

Output overview

One row per job. Schema is flat (no nested arrays of rows). Each row uses these fields:

  • Identifiers: jobId, identifier, url
  • Job info: title, description, descriptionHtml, employmentType[], occupationalCategory[], jobLocationType, postedDate, validThrough
  • Company: companyName, companyLogo, companyUrl, companyDescription
  • Geography: applicantCountries[]
  • Compensation: salary (object: currency, min, max, value, unit)
  • Application: applyUrl, applyType, directApply
  • Meta: ogImage, scrapedAt

Output samples

Job row (real smoke-test data, slightly truncated for display)

{
"type": "job",
"jobId": "codesignal-software-engineer-business-experience-1",
"url": "https://weworkremotely.com/remote-jobs/codesignal-software-engineer-business-experience-1",
"title": "Software Engineer, Business Experience",
"companyName": "CodeSignal",
"companyLogo": "https://we-work-remotely.imgix.net/logos/0171/2586/logo.gif?โ€ฆ",
"companyUrl": "https://codesignal.com/",
"description": "<div>We are looking for a Software Engineer who wants to be an impactful part of a small team โ€ฆ",
"jobLocationType": "TELECOMMUTE",
"applicantCountries": ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "โ€ฆ", "(+241 more)"],
"employmentType": ["Full-Time"],
"occupationalCategory": ["Full-Stack Programming"],
"directApply": false,
"salary": { "currency": "USD", "min": 0, "max": 0, "value": null, "unit": "YEAR" },
"postedDate": "2025-11-12 08:56:02 UTC",
"validThrough": "2026-06-10 08:56:02 UTC",
"applyUrl": "https://codesignal.com/",
"applyType": "external",
"scrapedAt": "2026-05-20T05:08:45.358Z"
}

Key output fields

Identifiers

FieldDescription
jobIdStable slug pulled from JSON-LD identifier.value. Unique per job. Example: codesignal-software-engineer-business-experience-1.
identifierFull { "@type":"PropertyValue", "name":"{company}", "value":"{slug}" } object from JSON-LD.
urlCanonical WWR job-detail URL.

Job information

FieldDescription
titleJob title.
descriptionFull job description (HTML preserved).
descriptionHtmlSame content but with double-encoded HTML entities normalised.
employmentType[]"Full-Time", "Part-Time", "Contract", "Freelance", etc.
occupationalCategory[]WWR category labels (e.g. "Full-Stack Programming", "Customer Support").
jobLocationTypeTypically "TELECOMMUTE" (WWR is remote-only).
postedDateUTC posted timestamp.
validThroughWhen the posting expires.

Company

FieldDescription
companyNameHiring organisation display name.
companyLogoURL to WWR-hosted small logo.
companyUrlCompany's own website (when WWR provides it).
companyDescriptionSometimes provided; often null.
companyIdWWR company-profile URL, e.g. https://weworkremotely.com/company/walter. Populated when the URL was discovered via a listing card.
locationCompany HQ as a free-form string ("Brooklyn, NY", "Colombo, 1, Sri Lanka", "NYC and TLV"). Distinct from applicantCountries โ€” that's where remote workers can apply from; this is where the company itself is based.

Geography (the unique field)

FieldDescription
applicantCountries[]Array of country codes (often 200+ entries) the employer says they'll consider applicants from. Pulled from JSON-LD applicantLocationRequirements. No other Apify WWR scraper exposes this.

Compensation

FieldDescription
salary.currencyISO currency code ("USD", "EUR", etc.).
salary.min / salary.maxParsed numeric range. 0/0 when the employer didn't specify.
salary.valueSingle numeric value (when a range isn't given).
salary.unit"YEAR", "MONTH", "HOUR", etc.

Application

FieldDescription
applyUrlThe external company-side apply URL from JSON-LD. This is the differentiator โ€” competitors return WWR's locked button instead.
applyType"external" when an apply URL was found, otherwise "unknown".
directApplyReal boolean (WWR's own claim about whether the apply flow is direct).

โ“ FAQ

What URLs can I paste? Any weworkremotely.com URL. Listing pages (/remote-jobs, /categories/..., /remote-jobs/search?term=...) and direct job-detail URLs (/remote-jobs/{slug}-{numeric}) are both auto-classified.

Why does salary.min / salary.max sometimes read 0? WeWorkRemotely uses 0 as a placeholder when the employer chose not to supply a salary range. The field is left as 0 (not omitted) so you can distinguish "no salary published" (0/0) from a real 0 (rare).

Does the actor need a proxy? WWR blocks Apify's datacenter IPs but works fine through RESIDENTIAL proxies (the default). Direct HTTP also works for small runs.

How does pagination work? Category listings and search results paginate via ?page=N. The actor walks every page until maxItems is hit. The main /remote-jobs index is a single-page view (no pagination).

Is the applyUrl always external? WWR's JSON-LD url field is the external apply URL on most jobs. A small number of jobs route apply through WWR itself โ€” those return https://weworkremotely.com/... as the apply URL. We surface whatever WWR provides.

Why does the JSON-LD url field hold the apply URL, not the job URL? Quirk of WeWorkRemotely's schema.org implementation. The canonical job URL is in our url field; the JSON-LD's url is what they treat as the "where to apply" link.

How fresh is the data? Each run hits WWR live โ€” no caching. scrapedAt is the per-row timestamp.

What's the difference between detail mode and listing-only mode?

  • Detail mode (includeDetailPages: true, the default) fetches every job's detail page and returns the full 23+ field schema, including applicantCountries[], parsed salary, real external applyUrl, full description, validThrough, etc.
  • Listing-only mode (includeDetailPages: false) emits rows directly from the listing card โ€” no detail fetch. Returns ~12 fields: title, companyName, companyLogo, companyId, location, tags, isFeatured, isBoosted, postedAge, url, scrapedFrom. About 30ร— faster when you just need a list of jobs + headlines. The applicantCountries, salary, description, applyUrl fields are absent.
  • A listingOnly: true marker is on every listing-only row so downstream consumers can tell them apart.

How do the countries and timeFilter filters work? Both are post-filters applied client-side after scraping (WWR doesn't accept these as URL params). countries matches rows where applicantCountries[] contains any of the supplied ISO-2 codes (case-insensitive). timeFilter keeps rows where postedDate is within the selected window. Filtered rows are silently dropped โ€” the run stats show how many.

Can I combine filters? Yes. Country + time filters are post-applied to all rows. Option B filters (category / keyword / employment type) determine which URL gets scraped; the post-filters then narrow down the results.

Can I get only new jobs in scheduled runs? Not built-in (the JSON-LD doesn't carry a stable created-at the way some boards do โ€” postedDate is what we have). For deduping across scheduled runs, store seen jobIds in a downstream system.


Support

  • File an issue or feature request via the Apify Console Issues tab.
  • For custom output shapes, additional filters, or scheduled feeds into a warehouse, open an issue describing the use case.

Additional Services

Need a remote-jobs dataset shaped to your pipeline? Custom integrations available:

  • Custom output schemas โ€” alternative field names, flattened structures, filtered subsets for warehouse loaders (Postgres, BigQuery, Snowflake).
  • Webhook delivery โ€” push new WWR jobs to Slack, Discord, your CRM, or any HTTP endpoint.
  • Scheduled feeds โ€” daily/weekly runs into S3, Google Sheets, or your DB.
  • Multi-source bundles โ€” combine WWR with other remote job boards (RemoteOK, JustRemote, Remotive) for full-coverage remote-job intelligence.

Reach out via the Apify Issues tab or contact memo23 on Apify.


Explore More Scrapers

Looking for related remote-work, jobs, or recruiting data? Other actors by the same maintainer:


โš ๏ธ Disclaimer

This Actor accesses publicly available data on WeWorkRemotely.com for legitimate research, market intelligence, recruiting, and business-analysis purposes. Use of this Actor must comply with WeWorkRemotely's Terms of Service and all applicable laws, including data protection regulations (GDPR, CCPA, etc.). "WeWorkRemotely" and "We Work Remotely" are trademarks of We Work Remotely, Inc. This Actor is not affiliated with, endorsed by, or sponsored by WeWorkRemotely. The Actor's authors are not responsible for any misuse. Users must:

  • Respect rate limits and avoid overloading WeWorkRemotely's infrastructure
  • Not use scraped data to violate user privacy or any platform terms
  • Use the data in compliance with applicable jurisdictions
  • Not republish scraped content in violation of copyright

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.


SEO Keywords

weworkremotely scraper, we work remotely scraper, weworkremotely jobs scraper, remote jobs scraper, remote work scraper, weworkremotely api alternative, remote programming jobs scraper, remote developer jobs scraper, remote marketing jobs scraper, remote customer support jobs scraper, telecommute jobs scraper, work-from-home jobs scraper, remote job listings api, remote job feed, job aggregator, remote recruiter tool, job board scraper, weworkremotely json export, weworkremotely csv export, apify weworkremotely scraper, remote job lead generation, applicant country eligibility, salary benchmarking remote, remote-first companies database


License

ISC. See package.json.