We Work Remotely Job Listings & Salary Extractor
Reads We Work Remotely category pages or keyword search results and follows each listing for salary range, employment type, skills, applicant region requirements, and company details.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape. browse reads category feeds, search filters the full current inventory, byUrls accepts We Work Remotely links. |
categories | array | optional | One or more categories. Leave empty to collect every category (recommended for the full inventory). |
searchTerm | string | optional | Words to match in the title, company, category or description. All words must match. Required in search mode. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape. browse reads category feeds, search filters the full current inventory, byUrls accepts We Work Remotely links. |
categories | array | optional | One or more categories. Leave empty to collect every category (recommended for the full inventory). |
searchTerm | string | optional | Words to match in the title, company, category or description. All words must match. Required in search mode. |
startUrls | array | optional | Job, category, search, company or listing URLs. Mix freely. (mode=byUrls) |
employmentTypes | array | optional | Employment types to keep. Leave empty for all. We Work Remotely publishes Full-Time and Contract roles. |
regions | array | optional | Keep jobs open to one or more regions. Jobs open worldwide always match. Leave empty for all. |
countries | array | optional | Keep jobs open to one or more countries (ISO-2 codes). Jobs open worldwide always match. Leave empty for all. |
postedWithin | string | optional | Keep jobs listed within this window. The listing date is the current (renewed) date, not the original post date. |
minSalary | integer | optional | Minimum annualized salary in USD. Jobs without a disclosed salary are kept unless requireSalary is on. Published currencies are not converted. |
maxSalary | integer | optional | Maximum annualized salary in USD. Jobs without a disclosed salary are kept unless requireSalary is on. Published currencies are not converted. |
requireSalary | boolean | optional | Only keep jobs with a confidently parsed salary range. Off by default so jobs that do not disclose pay are not lost. |
includeDescription | boolean | optional | Include the full description HTML and text. Salary is parsed even when this is off. |
cleanHtml | boolean | optional | Remove scripts, tracking pixels and unsafe attributes from descriptionHtml. |
includeDetails | boolean | optional | Also fetch each job's HTML page for extra structured fields. The public job XML (apply URL/email, company bio, exact dates) is always read. Off by default; adds one HTML request per job. |
includeCompanyProfile | boolean | optional | Fetch the company profile for each emitted job (website, logo, about, open-job count). On by default; adds one request per company. |
incremental | boolean | optional | Only return jobs that are new or renewed since the previous run of the same search. State is stored automatically. |
stateKey | string | optional | Optional name for an incremental campaign. Leave empty to derive it from the search filters. |
maxItems | integer | optional | Maximum jobs to return (1-5000). |
Download the published input schema
View complete JSON
{
"description": "Collect We Work Remotely jobs from the board's 12 official category RSS feeds, with salary parsing, region/country eligibility, full descriptions and company profiles.",
"properties": {
"categories": {
"default": [],
"description": "One or more categories. Leave empty to collect every category (recommended for the full inventory).",
"editor": "select",
"items": {
"enum": [
"remote-full-stack-programming-jobs",
"remote-front-end-programming-jobs",
"remote-back-end-programming-jobs",
"remote-customer-support-jobs",
"remote-design-jobs",
"remote-product-design-jobs",
"remote-ux-ui-design-jobs",
"remote-devops-sysadmin-jobs",
"remote-management-and-finance-jobs",
"remote-product-jobs",
"remote-sales-and-marketing-jobs",
"all-other-remote-jobs"
],
"enumTitles": [
"Full-Stack Programming",
"Front-End Programming",
"Back-End Programming",
"Customer Support",
"Design",
"Product Design",
"UX/UI Design",
"DevOps and Sysadmin",
"Management and Finance",
"Product",
"Sales and Marketing",
"All Other Remote"
],
"type": "string"
},
"prefill": [
"remote-full-stack-programming-jobs"
],
"title": "Job categories",
"type": "array",
"uniqueItems": true
},
"cleanHtml": {
"default": true,
"description": "Remove scripts, tracking pixels and unsafe attributes from descriptionHtml.",
"prefill": true,
"title": "Clean description HTML",
"type": "boolean"
},
"countries": {
"default": [],
"description": "Keep jobs open to one or more countries (ISO-2 codes). Jobs open worldwide always match. Leave empty for all.",
"editor": "select",
"items": {
"enum": [
"AD",
"AE",
"AF",
"AG",
"AI",
"AL",
"AM",
"AO",
"AQ",
"AR",
"AS",
"AT",
"AU",
"AW",
"AX",
"AZ",
"BA",
"BB",
"BD",
"BE",
"BF",
"BG",
"BH",
"BI",
"BJ",
"BL",
"BM",
"BN",
"BO",
"BQ",
"BR",
"BS",
"BT",
"BV",
"BW",
"BY",
"BZ",
"CA",
"CC",
"CD",
"CF",
"CG",
"CH",
"CI",
"CK",
"CL",
"CM",
"CN",
"CO",
"CR",
"CU",
"CV",
"CW",
"CX",
"CY",
"CZ",
"DE",
"DJ",
"DK",
"DM",
"DO",
"DZ",
"EC",
"EE",
"EG",
"EH",
"ER",
"ES",
"ET",
"FI",
"FJ",
"FK",
"FM",
"FO",
"FR",
"GA",
"GB",
"GD",
"GE",
"GF",
"GG",
"GH",
"GI",
"GL",
"GM",
"GN",
"GP",
"GQ",
"GR",
"GS",
"GT",
"GU",
"GW",
"GY",
"HK",
"HM",
"HN",
"HR",
"HT",
"HU",
"ID",
"IE",
"IL",
"IM",
"IN",
"IO",
"IQ",
"IR",
"IS",
"IT",
"JE",
"JM",
"JO",
"JP",
"KE",
"KG",
"KH",
"KI",
"KM",
"KN",
"KP",
"KR",
"KW",
"KY",
"KZ",
"LA",
"LB",
"LC",
"LI",
"LK",
"LR",
"LS",
"LT",
"LU",
"LV",
"LY",
"MA",
"MC",
"MD",
"ME",
"MF",
"MG",
"MH",
"MK",
"ML",
"MM",
"MN",
"MO",
"MP",
"MQ",
"MR",
"MS",
"MT",
"MU",
"MV",
"MW",
"MX",
"MY",
"MZ",
"NA",
"NC",
"NE",
"NF",
"NG",
"NI",
"NL",
"NO",
"NP",
"NR",
"NU",
"NZ",
"OM",
"PA",
"PE",
"PF",
"PG",
"PH",
"PK",
"PL",
"PM",
"PN",
"PR",
"PS",
"PT",
"PW",
"PY",
"QA",
"RE",
"RO",
"RS",
"RU",
"RW",
"SA",
"SB",
"SC",
"SD",
"SE",
"SG",
"SH",
"SI",
"SJ",
"SK",
"SL",
"SM",
"SN",
"SO",
"SR",
"SS",
"ST",
"SV",
"SX",
"SY",
"SZ",
"TC",
"TD",
"TF",
"TG",
"TH",
"TJ",
"TK",
"TL",
"TM",
"TN",
"TO",
"TR",
"TT",
"TV",
"TW",
"TZ",
"UA",
"UG",
"UM",
"US",
"UY",
"UZ",
"VA",
"VC",
"VE",
"VG",
"VI",
"VN",
"VU",
"WF",
"WS",
"YE",
"YT",
"ZA",
"ZM",
"ZW"
],
"enumTitles": [
"Andorra",
"United Arab Emirates",
"Afghanistan",
"Antigua and Barbuda",
"Anguilla",
"Albania",
"Armenia",
"Angola",
"Antarctica",
"Argentina",
"American Samoa",
"Austria",
"Australia",
"Aruba",
"Åland Islands",
"Azerbaijan",
"Bosnia and Herzegovina",
"Barbados",
"Bangladesh",
"Belgium",
"Burkina Faso",
"Bulgaria",
"Bahrain",
"Burundi",
"Benin",
"Saint Barthélemy",
"Bermuda",
"Brunei Darussalam",
"Bolivia (Plurinational State of)",
"Bonaire, Sint Eustatius and Saba",
"Brazil",
"Bahamas",
"Bhutan",
"Bouvet Island",
"Botswana",
"Belarus",
"Belize",
"Canada",
"Cocos (Keeling) Islands",
"Congo (Democratic Republic of the)",
"Central African Republic",
"Congo",
"Switzerland",
"Côte d'Ivoire",
"Cook Islands",
"Chile",
"Cameroon",
"China",
"Colombia",
"Costa Rica",
"Cuba",
"Cabo Verde",
"Curaçao",
"Christmas Island",
"Cyprus",
"Czechia",
"Germany",
"Djibouti",
"Denmark",
"Dominica",
"Dominican Republic",
"Algeria",
"Ecuador",
"Estonia",
"Egypt",
"Western Sahara",
"Eritrea",
"Spain",
"Ethiopia",
"Finland",
"Fiji",
"Falkland Islands (Malvinas)",
"Micronesia (Federated States of)",
"Faroe Islands",
"France",
"Gabon",
"United Kingdom of Great Britain and Northern Ireland",
"Grenada",
"Georgia",
"French Guiana",
"Guernsey",
"Ghana",
"Gibraltar",
"Greenland",
"Gambia",
"Guinea",
"Guadeloupe",
"Equatorial Guinea",
"Greece",
"South Georgia and the South Sandwich Islands",
"Guatemala",
"Guam",
"Guinea-Bissau",
"Guyana",
"Hong Kong",
"Heard Island and McDonald Islands",
"Honduras",
"Croatia",
"Haiti",
"Hungary",
"Indonesia",
"Ireland",
"Israel",
"Isle of Man",
"India",
"British Indian Ocean Territory",
"Iraq",
"Iran (Islamic Republic of)",
"Iceland",
"Italy",
"Jersey",
"Jamaica",
"Jordan",
"Japan",
"Kenya",
"Kyrgyzstan",
"Cambodia",
"Kiribati",
"Comoros",
"Saint Kitts and Nevis",
"Korea (Democratic People's Republic of)",
"Korea (Republic of)",
"Kuwait",
"Cayman Islands",
"Kazakhstan",
"Lao People's Democratic Republic",
"Lebanon",
"Saint Lucia",
"Liechtenstein",
"Sri Lanka",
"Liberia",
"Lesotho",
"Lithuania",
"Luxembourg",
"Latvia",
"Libya",
"Morocco",
"Monaco",
"Moldova (Republic of)",
"Montenegro",
"Saint Martin (French part)",
"Madagascar",
"Marshall Islands",
"North Macedonia",
"Mali",
"Myanmar",
"Mongolia",
"Macao",
"Northern Mariana Islands",
"Martinique",
"Mauritania",
"Montserrat",
"Malta",
"Mauritius",
"Maldives",
"Malawi",
"Mexico",
"Malaysia",
"Mozambique",
"Namibia",
"New Caledonia",
"Niger",
"Norfolk Island",
"Nigeria",
"Nicaragua",
"Netherlands",
"Norway",
"Nepal",
"Nauru",
"Niue",
"New Zealand",
"Oman",
"Panama",
"Peru",
"French Polynesia",
"Papua New Guinea",
"Philippines",
"Pakistan",
"Poland",
"Saint Pierre and Miquelon",
"Pitcairn",
"Puerto Rico",
"Palestine, State of",
"Portugal",
"Palau",
"Paraguay",
"Qatar",
"Réunion",
"Romania",
"Serbia",
"Russian Federation",
"Rwanda",
"Saudi Arabia",
"Solomon Islands",
"Seychelles",
"Sudan",
"Sweden",
"Singapore",
"Saint Helena, Ascension and Tristan da Cunha",
"Slovenia",
"Svalbard and Jan Mayen",
"Slovakia",
"Sierra Leone",
"San Marino",
"Senegal",
"Somalia",
"Suriname",
"South Sudan",
"Sao Tome and Principe",
"El Salvador",
"Sint Maarten (Dutch part)",
"Syrian Arab Republic",
"Eswatini",
"Turks and Caicos Islands",
"Chad",
"French Southern Territories",
"Togo",
"Thailand",
"Tajikistan",
"Tokelau",
"Timor-Leste",
"Turkmenistan",
"Tunisia",
"Tonga",
"Türkiye",
"Trinidad and Tobago",
"Tuvalu",
"Taiwan, Province of China",
"Tanzania, United Republic of",
"Ukraine",
"Uganda",
"United States Minor Outlying Islands",
"United States of America",
"Uruguay",
"Uzbekistan",
"Holy See",
"Saint Vincent and the Grenadines",
"Venezuela (Bolivarian Republic of)",
"Virgin Islands (British)",
"Virgin Islands (U.S.)",
"Viet Nam",
"Vanuatu",
"Wallis and Futuna",
"Samoa",
"Yemen",
"Mayotte",
"South Africa",
"Zambia",
"Zimbabwe"
],
"type": "string"
},
"prefill": [],
"title": "Applicant countries",
"type": "array",
"uniqueItems": true
},
"employmentTypes": {
"default": [],
"description": "Employment types to keep. Leave empty for all. We Work Remotely publishes Full-Time and Contract roles.",
"editor": "select",
"items": {
"enum": [
"Full-Time",
"Contract"
],
"enumTitles": [
"Full-Time",
"Contract"
],
"type": "string"
},
"prefill": [],
"title": "Employment types",
"type": "array",
"uniqueItems": true
},
"includeCompanyProfile": {
"default": true,
"description": "Fetch the company profile for each emitted job (website, logo, about, open-job count). On by default; adds one request per company.",
"prefill": false,
"title": "Fetch company profiles",
"type": "boolean"
},
"includeDescription": {
"default": true,
"description": "Include the full description HTML and text. Salary is parsed even when this is off.",
"prefill": true,
"title": "Include full description",
"type": "boolean"
},
"includeDetails": {
"default": false,
"description": "Also fetch each job's HTML page for extra structured fields. The public job XML (apply URL/email, company bio, exact dates) is always read. Off by default; adds one HTML request per job.",
"prefill": false,
"title": "Fetch detail pages",
"type": "boolean"
},
"incremental": {
"default": false,
"description": "Only return jobs that are new or renewed since the previous run of the same search. State is stored automatically.",
"prefill": false,
"title": "New jobs only",
"type": "boolean"
},
"maxItems": {
"default": 200,
"description": "Maximum jobs to return (1-5000).",
"editor": "number",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max jobs",
"type": "integer"
},
"maxSalary": {
"description": "Maximum annualized salary in USD. Jobs without a disclosed salary are kept unless requireSalary is on. Published currencies are not converted.",
"editor": "number",
"maximum": 2000000,
"minimum": 0,
"title": "Maximum salary (USD)",
"type": "integer"
},
"minSalary": {
"description": "Minimum annualized salary in USD. Jobs without a disclosed salary are kept unless requireSalary is on. Published currencies are not converted.",
"editor": "number",
"maximum": 2000000,
"minimum": 0,
"title": "Minimum salary (USD)",
"type": "integer"
},
"mode": {
"default": "browse",
"description": "What to scrape. browse reads category feeds, search filters the full current inventory, byUrls accepts We Work Remotely links.",
"editor": "select",
"enum": [
"browse",
"search",
"byUrls"
],
"enumTitles": [
"Browse categories",
"Search by keyword",
"Scrape specific URLs"
],
"prefill": "browse",
"title": "Mode",
"type": "string"
},
"postedWithin": {
"default": "any",
"description": "Keep jobs listed within this window. The listing date is the current (renewed) date, not the original post date.",
"editor": "select",
"enum": [
"any",
"1",
"3",
"7",
"14",
"30"
],
"enumTitles": [
"Any time",
"Last 24 hours",
"Last 3 days",
"Last 7 days",
"Last 14 days",
"Last 30 days"
],
"prefill": "any",
"title": "Listed within",
"type": "string"
},
"regions": {
"default": [],
"description": "Keep jobs open to one or more regions. Jobs open worldwide always match. Leave empty for all.",
"editor": "select",
"items": {
"enum": [
"Anywhere in the World",
"USA Only",
"USA",
"North America Only",
"North America",
"Latin America Only",
"Latin America",
"Americas Only",
"Americas",
"Europe",
"Europe Only",
"UK Only",
"UK",
"Canada Only",
"Canada",
"EMEA",
"EMEA Only",
"Asia Only",
"Asia",
"Africa Only",
"Africa",
"Oceania Only",
"Oceania",
"Other"
],
"enumTitles": [
"Anywhere in the World",
"USA Only",
"USA (same as USA Only)",
"North America Only",
"North America (same as North America Only)",
"Latin America Only",
"Latin America (same as Latin America Only)",
"Americas Only",
"Americas (same as Americas Only)",
"Europe",
"Europe (same as Europe)",
"UK Only",
"UK (same as UK Only)",
"Canada Only",
"Canada (same as Canada Only)",
"EMEA",
"EMEA (same as EMEA)",
"Asia Only",
"Asia (same as Asia Only)",
"Africa Only",
"Africa (same as Africa Only)",
"Oceania Only",
"Oceania (same as Oceania Only)",
"Other / unspecified region"
],
"type": "string"
},
"prefill": [],
"title": "Regions",
"type": "array",
"uniqueItems": true
},
"requireSalary": {
"default": false,
"description": "Only keep jobs with a confidently parsed salary range. Off by default so jobs that do not disclose pay are not lost.",
"prefill": false,
"title": "Only jobs with salary",
"type": "boolean"
},
"searchTerm": {
"description": "Words to match in the title, company, category or description. All words must match. Required in search mode.",
"editor": "textfield",
"title": "Search words",
"type": "string"
},
"startUrls": {
"default": [],
"description": "Job, category, search, company or listing URLs. Mix freely. (mode=byUrls)",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Start URLs",
"type": "array"
},
"stateKey": {
"description": "Optional name for an incremental campaign. Leave empty to derive it from the search filters.",
"editor": "textfield",
"title": "Incremental state name",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "We Work Remotely Job Listings & Salary Extractor Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
jobs | string | optional | Dataset containing every scraped We Work Remotely job listing. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Dataset of live We Work Remotely jobs with title, company, category, applicant regions and countries, parsed salary range, skills, full description, company profile, application URL or email, listing and expiry dates.",
"properties": {
"jobs": {
"description": "Dataset containing every scraped We Work Remotely job listing.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Job listings",
"type": "string"
}
},
"title": "We Work Remotely Job Listings & Salary Extractor Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "We Work Remotely jobs",
"transformation": {
"fields": [
"title",
"company",
"category",
"salary",
"postedAt",
"url"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
We Work Remotely Job Listings & Salary Extractor
Collect every live posting on We Work Remotely from the board's 12 official category RSS feeds, enriched by the public job XML. Get titles, companies, categories, employment types, applicant regions and countries, full descriptions, skills, salary ranges parsed from the posting text, company profiles, real application links or emails, and current listing and expiry dates. No login, cookies, API key, or proxy is required.
What this actor does
- Full live inventory: reads all 12 category feeds in one run (447 unique openings on 2026-10-20), deduplicated by job URL.
- Three ways to work: browse categories, search the whole board by keyword, or paste job, category, search, company and listing URLs.
- Useful filters: category, employment type, applicant region, applicant country, listing window, minimum/maximum salary, and salary-only.
- Salary extraction: parses min/max, currency and pay period when a posting states a range; keeps the original salary text; never invents a number.
- Location eligibility: separates jobs open worldwide from jobs restricted to specific countries, and exposes ISO country codes.
- Complete job content: full description HTML and plain text, source-provided skills, company website, logo and profile.
- Application details: the public job XML carries the employer's application URL or email for almost every posting, including roles whose on-page apply button is behind a We Work Remotely account.
- Correct dates: current listing date, original first-post date and expiry date, with a renewal flag for reposted roles.
- Monitoring: optional incremental mode returns only new or renewed jobs since the previous run.
- Empty fields are omitted from each record.
Output per job
Identity
type— alwaysjob_wwrurl— canonical We Work Remotely job pageid,slug— job slug from the URLtitle,role— job titlecompany,companySlug,companyProfileUrl— employer and its We Work Remotely company pagecategory,subcategory— We Work Remotely category and the Product Design / UX-UI subcategory when applicablefeedSlugs— category feeds where the job appeared
Employment and location
employmentType,employmentTypeNormalized— e.g.Full-Timeandfull-timejobLocationType—TELECOMMUTEregion— the board's region label, e.g.Anywhere in the World,USA Only,Europecountry,countryCodes— applicant countries named in the posting, plus ISO-2 codesisWorldwide— true when no country restriction is publishedlocationText— readable location restrictionapplicantCountries,applicantLocationRequirements— applicant country names
Dates
postedAt— current listing date (renewed listings get a fresh date)firstPostedAt— original first-post datepostedAgeDays— days since the current listing dateisRenewed— true when the current listing is newer than the original postexpiresAt,applyBefore,validThrough— listing expiryscrapedAt— collection timestamp
Salary
salary— the salary text found in the postingsalaryDetails—{min, max, currency, unit}objectsalaryMin,salaryMax,salaryCurrency,salaryUnit— flattened values (salaryUnitisYEAR,MONTH,WEEK,DAYorHOUR)salaryPeriod,salaryType— lowercase period andbase,ote,total-comporhourlysalaryAnnualMin,salaryAnnualMax— annualized values used by the salary filterssalarySource—descriptionordetail
Description and skills
skills,skillsRaw— tags supplied by the employer, when presentdescriptionHtml,descriptionText— full posting content;cleanHtmlremoves scripts and tracking pixels
Company profile
companyHq,companyWebsite,companyLogo,companyLogoFullcompanyBio,companyStatement,companyJobsCount,companyTop100,companyFoundedYearhiringOrganizationSameAs— additional company links from the job page, when present
Application and monitoring
applyUrl,applyEmail,applyUrlSource— the employer's real application URL or email from the public job XMLdirectApply— whether the posting advertises direct applicationnewSinceLastRun,firstSeenAt— incremental mode onlysourceUrl— the feed URL the record came from
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | browse |
browse, search or byUrls |
categories |
array | all | One or more of the 12 category feeds |
searchTerm |
string | – | Words to match in title, company, category or description; all words must match. Required in search mode |
startUrls |
array | – | Job, category, search, company or listing URLs (byUrls mode) |
employmentTypes |
array | all | Full-Time, Contract |
regions |
array | all | Region labels such as Anywhere in the World, USA Only, Europe |
countries |
array | all | Applicant countries as ISO-2 codes (e.g. US, DE, IN) |
postedWithin |
string | any |
any, 1, 3, 7, 14 or 30 days |
minSalary |
integer | – | Minimum annualized salary in USD |
maxSalary |
integer | – | Maximum annualized salary in USD |
requireSalary |
boolean | false |
Only keep jobs with a confidently parsed salary |
includeDescription |
boolean | true |
Include full description HTML and text |
cleanHtml |
boolean | true |
Remove scripts, tracking pixels and unsafe attributes |
includeDetails |
boolean | false |
Also fetch each job's HTML page for extra structured fields; the public job XML (apply URL/email, company bio, exact dates) is always read |
includeCompanyProfile |
boolean | true |
Fetch company website, logo, about text and open-job count |
incremental |
boolean | false |
Return only new or renewed jobs since the last run |
stateKey |
string | – | Optional name for an incremental campaign |
maxItems |
integer | 200 |
Maximum jobs to return (1-5000) |
Example: every programming job
{
"mode": "browse",
"categories": [
"remote-full-stack-programming-jobs",
"remote-front-end-programming-jobs",
"remote-back-end-programming-jobs"
],
"maxItems": 200
}
Example: Python roles open to Pakistan, above $60k
{
"mode": "search",
"searchTerm": "python",
"countries": ["PK"],
"minSalary": 60000,
"postedWithin": "14",
"maxItems": 50
}
Example: paste a company and a job URL
{
"mode": "byUrls",
"startUrls": [
"https://weworkremotely.com/company/stripe",
"https://weworkremotely.com/remote-jobs/stripe-abuse-research-engineer"
]
}
Example: daily new-job monitor
{
"mode": "search",
"searchTerm": "product manager",
"incremental": true,
"stateKey": "product-manager-monitor",
"maxItems": 100
}
Use cases
- Recruiters and sourcers — monitor new remote roles by category, country eligibility and salary.
- Job boards and newsletters — sync the full We Work Remotely inventory with full descriptions and company profiles.
- Salary research — compare disclosed remote pay by role, company and region.
- Market analysis — track which categories and countries are hiring remotely.
- Lead generation — identify remote-first companies, their websites and open-role counts.
- Job alerts — run incremental searches and push only new or renewed postings into a workflow.
Limitations
- We Work Remotely does not publish salary for every job. The actor parses a range only when the posting states one (about six in ten postings), so salary fields are absent on non-disclosing jobs.
- Almost every public job XML carries an application URL or email; a small minority only exposes the We Work Remotely account wall, in which case both are omitted and
urlopens the posting. - Skills are optional on the source and appear on a minority of postings. They are returned as published and are not used for keyword matching.
- Company bios are available for about half of postings; where the board has no profile text the field is omitted.
- Salary filters compare the published annualized numbers; the actor does not convert between currencies.
FAQ
Where does the data come from?
The 12 public category RSS feeds published by We Work Remotely, plus job and company pages when detail or company enrichment is enabled. Links back to We Work Remotely are preserved in every record. No affiliation with We Work Remotely.
Do I need a proxy, login or API key?
No. The public feeds and pages used here work without credentials or proxy setup.
Why is salary missing on some jobs?
About six in ten postings state a numeric range. The actor returns a salary only when it can parse one confidently and never substitutes a guess. Use requireSalary to keep only disclosing jobs.
Why is applyUrl missing on most jobs?
The public job XML exposes the employer's application link or email for almost every posting, even when the on-page apply button is locked. The actor returns applyUrl for web links and applyEmail for email applications. If neither exists, use url to open the posting.
What is the difference between postedAt and firstPostedAt?
We Work Remotely renews listings, so the visible "Posted" date can be newer than the original publication date. postedAt is the current listing date used by postedWithin; firstPostedAt is the original post date. isRenewed marks the difference.
How do region and country filters work?
A job open worldwide matches any selected region or country because it is eligible everywhere. A restricted job matches only when its published region or applicant-country list overlaps your selection. The applicant-country list takes precedence over the broader region label.
Are all skills returned?
No. We Work Remotely's skill tags are optional and appear on a minority of jobs. They are returned when present, exactly as published.
How do I get only new jobs?
Set incremental to true and give the campaign a stateKey. The next run of the same search returns only jobs that were not seen before, plus renewed listings. Use a different stateKey for a different search.
How fresh is the data?
The feeds are read live at run time and update continuously. Schedule the actor as often as you need; incremental mode keeps follow-up runs small.
Is this affiliated with We Work Remotely?
No. This is a third-party actor that reads publicly available We Work Remotely feeds and pages.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build eb6rHgNVPPgCCl1qp. Documentation is regenerated from the default published build; private drafts are not included.