Google search results, structured.
Google SERPs in clean JSON. Organic, ads, featured snippets, knowledge panels, people-also-ask, related searches, all parsed, all geo-targetable. No CAPTCHAs ever reach your code.
GET /serp
?q=best+linen+arc+lamp
&geo=us-ca
&num=20
→ 200 OK · 25 credits · 450ms
{
"engine": "google",
"query": "best linen arc lamp",
"organic": [
{ "rank": 1, "title": "Linen Arc Lamp Review",
"url": "https://...", "snippet": "..." },
...
],
"ads": [...],
"featured_snippet": {...},
"people_also_ask": [...],
"related_searches": [...],
"total_results": 143000
}
See it work, before you sign up.
Drop in a URL, run a real call against the live API, and watch the JSON come back in about a second. No API key required.
Organic, ads, featured snippets, knowledge panels, people-also-ask, image carousels, news, Twitter cards, local packs, shopping: every block returned as typed JSON.
geo=de-be&hl=de returns Berlin's German-language Google. Country, region, and city-level targeting, critical for SEO tracking and locale-specific market research.
We solve them upstream. Your code never sees one. If a query is genuinely uncrawlable from a region, you get a clean error, not a blank result.
Pass start=0,10,20… or use cursor to walk a result set without re-querying. Built-in dedup across pages.
Concurrency limits scale with your plan tier: higher tiers run 100 SERP requests in parallel, perfect for nightly rank-tracking jobs.
When Google ships a new SERP feature, we map it into the same shape within days. Your parser keeps working; new fields just appear.
Copy. Paste. Ship.
import { Ujeebu } from "ujeebu";
const uj = new Ujeebu(process.env.UJEEBU_KEY);
const { data } = await uj.serp({
q: "best linen arc lamp",
geo: "us-ca",
num: 20,
});
data.organic.slice(0,5).forEach(r =>
console.log(r.rank, r.title)
);
from ujeebu import Ujeebu
uj = Ujeebu(api_key=os.environ["UJEEBU_KEY"])
results = uj.serp(
q="best linen arc lamp",
geo="us-ca", num=20,
)
for r in results["organic"][:5]:
print(r["rank"], r["title"])
curl -G https://api.ujeebu.com/serp \
-H "Authorization: Bearer $UJEEBU_KEY" \
-d "q=best+linen+arc+lamp&geo=us-ca&num=20"
// Track a keyword across 12 geos
const geos = ["us-ca","us-ny","gb","de","fr","es",
"it","au","ca","jp","br","mx"];
const ranks = await Promise.all(
geos.map(geo => uj.serp({
q: "your-brand", geo
}))
);
Real things real teams shipped this quarter.
Daily rank for 5k keywords across 12 geos. Cron + concurrent SERP calls + Postgres. No proxy management, no CAPTCHA hell.
Pull every ad your competitor runs against your brand keyword. Detect new ad copy, landing pages, and bid changes within the hour.
Query "people-also-ask" and "related-searches" for your target keywords. Build the topic cluster your content team is missing.
Power a Q&A product. Hit SERP, take featured-snippets + top-3 organics, pass through an LLM with citations. Sub-second response.
25 credits per SERP call. Here's what that buys.
One credit pool covers every endpoint. Failed calls cost 0. No per-feature upcharges, no premium-proxy tax. See full pricing →
Ship SERP tonight.
5,000 credits free. No card. Real residential proxies on the free tier.