DEV Community

Devil Scrapes
Devil Scrapes

Posted on

Remotive's Salary Field Mixes Two Different Comma Conventions

Quick answer

Somewhere in Remotive's live feed right now sits a job with "salary": "$31,2k- $52k". Read that fast and it looks like a typo for $312k. It isn't — it's $31.2k, written with a European decimal comma sitting inside an otherwise American-formatted dollar string, in the same array as "$20k -$35k" and "$120 - $170 /hour". There is no field anywhere in the payload that tells you which convention a given string uses. A parser that does the obviously-correct-looking thing — strip commas as thousands separators, then cast to a number — will silently turn a $31,200 offer into a $312,000 one.

Confirming it against the live feed 💰

curl -s "https://remotive.com/api/remote-jobs" | \
  python3 -c "
import json, sys
jobs = json.load(sys.stdin)['jobs']
for j in jobs:
    if j.get('salary') and ',' in j['salary']:
        print(j['id'], repr(j['salary']), '—', j['title'])
"
Enter fullscreen mode Exit fullscreen mode
1680495 '$31,2k- $52k' — Remote Office Assistant
Enter fullscreen mode Exit fullscreen mode

That's one real posting, live, right now — sitting in a 17-job snapshot where the other eight non-empty salary strings ($50-$75 /hour, $20k -$35k, $14/hour, $150k - $230k, Pay per task, and so on) all use commas the ordinary American way, as thousands separators, or don't use them at all. salary is Remotive's own free-text field — nobody is normalizing it upstream, and the format genuinely varies posting to posting because the format is whatever the employer typed into a text box.

That's exactly why we pass salary through as a string rather than parsing it into a number ourselves: any parser we shipped would have to guess which convention a given string uses, and a wrong guess here isn't a rounding error, it's off by a factor of ten. We'd rather hand you the honest, unparsed text and let you decide the rule for your own dataset than ship a number that's silently wrong 1-in-however-many times.

The filter parameters that don't filter anything

Remotive documents category, search, company_name, and limit as server-side query parameters on this endpoint. A live probe on 2026-09-10 — eight different combinations of those parameters against the same endpoint — returned the identical payload every time. The feed has no working server-side filter right now, documentation notwithstanding.

So this Actor never sends those parameters at all. It fetches the full current feed once per run and filters categories, search, company_name, and job_types entirely in Python against what actually came back. That means your results are correct today, and they stay correct if Remotive ever ships a working filter upstream — because nothing here depends on the server doing anything it currently doesn't.

What else the feed's own metadata tells you

The response envelope isn't just jobs — it also carries a 0-legal-notice field, and it's worth reading once: Remotive asks that you link back to the original posting URL and credit Remotive as the source, warns that "jobs displayed are delayed by 24 hours" precisely so third-party listings don't scoop their own attribution, and states plainly that they'll cut off free API access for high-frequency polling ("typically... a couple of times a day... max. 4 times a day"). None of that is enforced by an HTTP status code — it's a text field in the JSON body, which means it's exactly the kind of constraint a scraper that only looks at response.json()["jobs"] will never see.

Output

{
  "job_id": "1680495",
  "title": "Remote Office Assistant",
  "company_name": "Coalition Technologies",
  "category": "Marketing",
  "tags": ["excel", "wordpress", "startup", "responsive", "insurance"],
  "job_type": "full_time",
  "candidate_required_location": "Worldwide",
  "salary": "$31,2k- $52k",
  "description": "Coalition Technologies is seeking a reliable, detail-oriented, and highly organized Remote Office Assistant to support administrative, bookkeeping, billing, reporting, data entry, and internal operations tasks...",
  "publication_date": "2026-08-11T20:18:02",
  "url": "https://remotive.com/remote-jobs/marketing/remote-office-assistant-1680495"
}
Enter fullscreen mode Exit fullscreen mode
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("DevilScrapes/remotive-remote-jobs-scraper").call(
    run_input={"categories": ["Customer Service"], "maxItems": 100}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "", item["salary"])
Enter fullscreen mode Exit fullscreen mode

Pricing: $0.20 per run plus $0.0015 per row — $1.70 per 1,000 results. A filter that matches nothing is a successful run costing only the start fee, not a failure.

Remotive Remote Jobs Scraper on Apify


Built by Devil Scrapes. We rotate Chrome/Firefox TLS fingerprints and retry with backoff on every fetch, and we don't trust a documented filter parameter until we've watched it actually change a response — Remotive's currently doesn't, so we filter client-side instead.

Top comments (0)