Recipes
Scrape a supported site by name: send the page URL and recipe=<name>, and the Scrape API applies a validated set of extract rules and the settings that work on that site. You get JSON without writing a selector.
GET https://api.ujeebu.com/scrape?url=<page>&recipe=<name>
On November 2, 2026 the API served 139 recipes for 113 sites (job boards, news, ecommerce, travel, real estate and more). The list, with the recipe name and the exact call for each page type, is at /scrape/sites.json; every site has a guide at /scrape/sites.
TIP - No recipe for your site?
Recipes are a shortcut, not a limit. Any site works with extract rules: the same JSON output, with selectors you choose. If you would rather not write them, ask for a custom scraper.
Example
curl -G 'https://api.ujeebu.com/scrape' \
-H "ApiKey: YOUR_API_KEY" \
--data-urlencode 'url=https://boards.greenhouse.io/gitlab' \
--data-urlencode 'recipe=greenhouse'
Response headers:
Ujb-Recipe: greenhouse/listing@v1
Ujb-Recipe-Match: example
Ujb-Credits: 5
Response body (a real call on November 2, 2026: 50 jobs, the first 3 shown):
{
"result": {
"jobs": [
{
"location": "Bangalore, India",
"title": "Director, Support (Bengaluru)",
"url": "https://job-boards.greenhouse.io/gitlab/jobs/8629019002"
},
{
"location": "Remote, United Kingdom",
"title": "Intermediate Support Engineer (SHIFT)",
"url": "https://job-boards.greenhouse.io/gitlab/jobs/8684061002"
},
{
"location": "Remote, Canada; Remote, United States",
"title": "Manager, Support Engineering (AMER)",
"url": "https://job-boards.greenhouse.io/gitlab/jobs/8877510002"
}
]
},
"success": true
}
The recipe parameter
| Value | Meaning |
|---|---|
recipe=<name> |
The site's recipes; the API picks the page type from the URL (see below). Example: recipe=greenhouse. |
recipe=<name>/listing |
Forced page type: lists of items (search results, category pages, job boards). |
recipe=<name>/detail |
Forced page type: one item (a product, a job, an article). |
recipe=<name>/page |
Forced page type: a profile or single page of another kind (an app, a company, a Wikipedia article). |
The name is the guide key of the site, as in ujeebu.com/scrape/<name>. Use the forced form when a site has several page types and you know which one your URL is: it skips the choice and is never ambiguous.
How the page type is chosen
With the bare name, the API tries these rules in order and reports the one that decided in the Ujb-Recipe-Match header:
| Ujb-Recipe-Match | Rule |
|---|---|
example |
The URL is one of the pages the recipe was validated on. |
pattern |
Exactly one recipe's URL pattern fits the URL (for example https://news.ycombinator.com/{slug}). |
only |
The site has a single working recipe. |
nearest |
Same host as one recipe's examples, the closest path (depth and shared segments). |
first |
None of the above: the first working type in the order listing, detail, page. |
forced |
You sent <name>/<type>. |
nearest and first are guesses. If the result looks wrong, check Ujb-Recipe and send the forced form.
Response headers
| Header | Example | Meaning |
|---|---|---|
Ujb-Recipe |
greenhouse/listing@v1 |
The recipe applied: name, page type and version. |
Ujb-Recipe-Match |
pattern |
How the page type was chosen (table above). |
Ujb-Credits |
5 |
Credits the call cost, as on every Scrape API call. |
Your parameters always win
- The recipe's
extract_rulesapply unless you sendextract_rules: yours replace them. - Each validated setting of the recipe (
js,proxy_type,proxy_country,wait_for,scroll_down,device,timeout,auto_captcha_solve) fills in only what you did not send. Sendjs=falseand the call runs without JavaScript, even if the recipe uses it. - A recipe with a longer
timeoutthan the default extends the deadline of the call.
So recipe= is safe to combine with anything else in the parameters table: proxy_type, proxy_country, proxy_session and the rest work as usual.
Pricing
A recipe never changes the price. The call is billed as a normal /scrape call with the effective parameters (the recipe's settings plus yours), from the same table:
| Proxy | Without JS | With JS | Screenshot | |
|---|---|---|---|---|
| rotating (default) | 1 | 5 | 5 | 10 |
| advanced | 5 | 10 | 10 | 10 |
| premium | 8 | 25 | 12 | 17 |
| residential, residential_us | 20 | 30 | 30 | 35 |
auto_captcha_solve adds 5 credits. As on every call, only HTTP 200 and 404 answers are billed; errors, timeouts and blocked requests cost nothing.
Worked examples:
| Call | Effective parameters | Credits |
|---|---|---|
recipe=greenhouse |
the recipe's js=true |
5 |
recipe=greenhouse&js=false |
your js=false wins |
1 |
recipe=linkedin |
the recipe's js=true |
5 |
recipe=talabat |
the recipe's js=true, proxy_type=premium, proxy_country=AE |
25 |
recipe=talabat&proxy_type=advanced |
your proxy, the recipe's js=true |
10 |
Most recipes cost 5 credits a page; the ones validated on the premium proxy cost 25. Each guide page shows the cost of its recipes. Recipes that set proxy_country need a paid plan or a top-up pack, like any call with proxy_country.
Errors
| Code | Message | What to do |
|---|---|---|
| 404 | unknown recipe 'x' |
Check the name in /scrape/sites.json. |
| 404 | the recipe has no working version |
The site changed and the recipe failed its checks. Send your own extract_rules until it is fixed. |
| 404 | no such page type |
The message lists the site's page types and their states. Use one of them. |
| 400 | recipe name must be <gkey> or <gkey>/<listing|detail|page> |
Fix the format of the parameter. |
| 503 | the recipe service is loading | Retry after a few seconds. |
These answers are not billed.
How recipes are kept working
- Each recipe was validated through the API on two real pages of the site, and keeps only the fields that came back on both.
- Every recipe is re-checked on real pages every week; one that stops returning its fields is marked broken and stops being served.
- We also call every recipe through the API by name every day and compare the answer with the recipe (header, fields, credits).
- A new or fixed recipe reaches the API within 5 minutes, with a new version in
Ujb-Recipe.
Guides and recipes are separate: the site guides list shows how a site does in our health checks, and a guide can leave the list after several days of blocked checks while its recipe still passes its own checks. The API keeps serving every working recipe, listed or not.
With the SDKs
- Python SDK (ujeebu-python 0.1.5):
client.scrape('https://boards.greenhouse.io/gitlab', params={'recipe': 'greenhouse'})passes the parameter through. - Node SDK (@ujeebu-org/ujeebu-sdk 0.1.2):
client.scrape('https://boards.greenhouse.io/gitlab', { recipe: 'greenhouse' })passes it through. - Go SDK (ujeebu-go v0.1.8):
ScrapeParamshas no recipe field and always sendsjs, which would override the recipe. Call the API over HTTP, or send the recipe'sextract_rulesand settings from its guide.
Spin up an API key in 60 seconds
Free trial: 5,000 credits for 7 days, no card, every endpoint on this page (proxy country needs a paid plan or a top-up pack).