Search Brazilian and German job boards from one endpoint
The Global Jobs API returns job listings from major non-US job boards — Naukri (India), Gupy and Catho (Brazil) and more — as clean JSON.
2 active endpoints. Every call is 1 credit.
- POST/global-jobs/v1/jobs/search
- POST/global-jobs/v1/jobs/detail
What Global Jobs endpoints does ReefAPI ship?
2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Global Jobs API
1 of 2 endpoints, ready to run
One platform, one keyword, one list. The meta carries a completeness percentage that tells you how much of the row shape that platform actually fills.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Global Jobs API works
Global Jobs is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Take the ids from the grid and the facts from the detail
The four boards behind this engine do not publish the same amount on their result pages, and this engine does not pretend they do. The grid is for discovery; the per-job call is where the parity is.
{"platform": "stepstone", "keyword": "python", "location": "Berlin", "max_pages": 5}125 rows came back with zero duplicates skipped — and with meta.completeness_pct at 83.3, which is the engine telling you up front that part of the row shape is empty on this board.
{"platform": "stepstone", "job_url": "<row.source_url>"}The same job came back with an ISO posting date, a salary with a currency, the location broken into city, state and country, the employment type, the skills and the description. Everything the grid had dropped.
A complete record on all three live boards — with the cost stated honestly: on two of them that means one extra call per job.
curl -X POST https://api.reefapi.com/global-jobs/v1/jobs/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"platform":"catho","keyword":"analista","max_pages":1}'{
"ok": true,
"data": { … },
"meta": {
"api": "global-jobs",
"endpoint": "jobs/search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What each board actually returns, measured field by field
The four platforms are four different scrapers behind one response shape, and they do not return the same columns. meta.completeness_pct on every response tells you which case you are in before you inspect a single row. The counts below come from live searches run on the same day.
| platform | Board and country | What a jobs/search row carries |
|---|---|---|
| gupy | Gupy company career pages, Brazil | The full record: company_name, company_logo_url, location_city/state/country, remote, employment_type, description_text, skills[], industry, salary_source and posted_at. completeness_pct 100 on 'desenvolvedor'. |
| stepstone | StepStone, Germany and Europe | job_id, title, company_name, location_raw (often several cities) plus location_city, apply_url and source_url. completeness_pct 83.33. No posted_at and no salary until jobs/detail. |
| catho | Catho, Brazil | job_id, title, apply_url, source_url and source_platform, and nothing else, on 20 of 20 rows. completeness_pct 50. Company, location and salary exist only in jobs/detail. |
| naukri | Naukri, India | Nothing. The call returns ok false with error code TARGET_BLOCKED and retryable false. Do not build a retry loop around it. |
job_id is the board's own id and is not namespaced across boards: catho 38113979, gupy 12282277 and stepstone 14338941 are all bare integers from three unrelated systems. Key your storage on the pair (source_platform, job_id), which is exactly why source_platform rides on every single job object.
Four boards named, three answering, and three very different grids
Measured on 2026-08-28 against all four platforms, with a detail call on each of the ones that answered. Two of these lines go against us.
None of the four sites is read through a login and none of them is tied to an account of yours. Blocked calls are not charged, which matters here because one of the four is currently blocked.
Every search returns meta.completeness_pct together with the exact field list it was scored against — job_id, title, company_name, location_raw, posted_at and apply_url. Gupy scored 100, StepStone 83.3 and Catho 50.0 on the same afternoon. That single number tells you whether the grid is enough for your use case before you inspect a single row, and no other engine in this batch offers it.
A Brazilian Gupy search filled posted_at as an ISO timestamp on 20 of 20 rows, plus description_text, skills, industry, a boolean remote flag, company_description and company logo. Salary appeared on 2 of 20 — and the other 18 carry salary_source: unpublished, which says the employer did not publish it rather than leaving you guessing.
Against us. A 125-row German pull carried title, company, location, apply link and ids — and posted_at was absent on all 125. There is no freshness signal in the grid whatsoever. The detail call has it: the job we opened came back with a posting date to the millisecond. If dating matters, budget a detail call per row on this platform.
Against us, and it is the thinnest grid in the whole batch. A Catho search returned job_id, title, apply_url and source_url — no company, no location, no date, no salary. completeness_pct said 50.0 and it was not exaggerating. The detail call on the same row returned the company, the street address, the state, an ISO date, the employment type, the skills and the description. On Catho the grid is a list of links, and the data is one call further in.
Against us. Two separate calls to the Indian board came back TARGET_BLOCKED, neither charged, while the other three platforms answered normally the same afternoon. Treat this engine as three live boards — Brazil twice over, and Germany — and do not plan India around it.
salary_source is on the row, and it is the field to read before you use the number. On the German detail we opened it said description_eur, and the salary_text next to it explained that the figure is StepStone's own prediction from a large salary database rather than the employer's advertised pay. On Gupy it says unpublished where the employer published nothing. A number without its provenance would have been worse than no number.
There is no cursor: max_pages controls how far the engine walks and max_results caps the total. Five pages of a German query returned 125 unique rows with duplicates_skipped 0 and a stopped_reason of max_pages, so you can tell a deliberate stop from an exhausted board.
The listing and the employer: title, company, location, employment type, description, skills, salary where published, and the apply link. Not candidate profiles, not recruiter details, not applications.
What people build with Global Jobs
The jobs this data is most often used for.
endpoints
credit per call
Global job boards call jobs/search to aggregate listings from India and Brazil in one schema.
Labor-market analysts use jobs/search to measure hiring demand in emerging markets.
Recruiting tools use jobs/detail to enrich a listing sourced from a regional platform.
What Global Jobs data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/global-jobs/v1/jobs/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"platform":"catho","keyword":"analista","max_pages":1}'import requests
r = requests.post(
"https://api.reefapi.com/global-jobs/v1/jobs/search",
headers={"x-api-key": REEF_KEY},
json={
"platform": "catho",
"keyword": "analista",
"max_pages": 1
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Global Jobs.
Get a free key →Why does a Catho search return only a title and a link?▾
Because Catho's result page carries nothing else. A measured search for 'analista' returned 20 rows, every one of them exactly job_id, title, apply_url, source_url and source_platform, with meta.completeness_pct 50. The rest is one call away: jobs/detail with platform catho and that row's job_url returned company_name 'LIFE RECURSOS HUMANOS', location Parana/PR/Brasil, employment_type 'CLT (Efetivo)', a 1124-character description and a salary band. Search to shortlist, detail to enrich.
Is salary normalized across countries?▾
No, and nothing is converted. salary_min and salary_max are the board's own numbers in whatever salary_currency says: a Catho posting returned 2001 and 3000 with salary_currency BRL and salary_text '2001-3000 BRL', while a StepStone posting returned salary_currency EUR with both bounds null. salary_source tells you why: 'detail_ld' means it was read from the posting's own structured data, 'unpublished' means the board shows no pay at all. There is no FX layer anywhere in this API.
What format is posted_at, and which platform has it in search results?▾
ISO-8601 in UTC with a Z suffix, at a fractional-second precision that varies by board: gupy '2026-08-26T21:27:20.632Z', stepstone '2026-08-13T15:03:19.66Z', catho '2026-08-25T23:59:59Z'. Catho stamps end-of-day rather than a real posting time, so do not use it to order postings within a day. Only Gupy carries posted_at on search rows; on Catho and StepStone it appears in jobs/detail.
Which identifier does jobs/detail need for each board?▾
It differs by platform, which is why both parameters are optional. Gupy accepts job_id: platform gupy with job_id 12282277 returned the full posting. Catho and StepStone need job_url, the full posting link. The simplest rule that works everywhere is to keep apply_url from the search row and pass it back as job_url, since every working board returns one.
Does an English keyword work on the Brazilian boards?▾
Poorly. The listings are in Portuguese, so 'desenvolvedor' finds far more than 'developer'. Gupy also matches the phrase against the job title literally, so a multi-word query can match nothing where a single word matches plenty. The engine retries such a query with its most distinctive single word, which is why 'python' and 'python developer' both reported source_total 37 on the same run.
How do paging and deduplication work?▾
max_pages (default 10) times page_size (default 20), with max_results as an optional hard cap on the total. The response reports what actually happened: total_unique, duplicates_skipped and stopped_reason. A measured Catho search with max_pages 1 returned total_unique 20, duplicates_skipped 0 and stopped_reason 'max_pages'; the same settings on StepStone returned 25 rows, because StepStone's own page is larger than the page_size we ask for.
What does TARGET_BLOCKED on Naukri mean for my code?▾
It means Naukri refuses automated clients outright, and the response says so: retryable false, record_count 0. The other three platforms are unaffected. If you fan out across boards, treat naukri as a permanently degraded source rather than a transient failure, and do not let it fail the whole batch.
What is the Global Jobs API?▾
Global Jobs API is a ReefAPI endpoint group for job listings aggregated across many sources. It returns live JSON through POST requests under /global-jobs/v1.
Is the Global Jobs API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Global Jobs calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Global Jobs login or account?▾
No login to Global Jobs is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Global Jobs data?▾
The page example is captured from a live jobs/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Global Jobs API use?▾
Global Jobs actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Global Jobs from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call global-jobs actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Global Jobs API a Global Jobs scraper?▾
It is the managed alternative to a DIY Global Jobs scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same job listings aggregated across many sources back as clean JSON.
15 Jobs & Hiring APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Global Jobs, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.