Search API for
AI agents & apps
Search the web, read a page in every format at once, map a site, crawl it and get back only what changed. Built for agents, not browsers.
Paste a URL and press Run
# Get a free API key (one command) curl -X POST https://searchx.dev/api/v1/signup \ -d '{"email":"you@example.com"}' # → {"api_key": "sk-sx-...", "daily_limit": 3000} # Search the web curl https://searchx.dev/api/v1/search \ -H "Authorization: Bearer sk-sx-YOUR_KEY" \ -G -d "q=kubernetes deployment" -d "mode=hybrid" # Read a page in four shapes, one fetch curl https://searchx.dev/api/v1/extract \ -G -d "url=https://react.dev" \ -d "formats=markdown,links,html,screenshot" # → every key you asked for. One that could not be produced # comes back null with the reason in "warnings". # Re-crawl a site, get back only what changed curl -X POST https://searchx.dev/api/v1/crawl \ -H "Authorization: Bearer sk-sx-YOUR_KEY" \ -d '{"url":"https://docs.example.com","track_changes":true,"only_changed":true}'
Nine endpoints, one API key
Everything your agent needs to search, read, and understand the web.
Web Search
Hybrid keyword + semantic search across 1B+ pages. BM25 + vector embeddings with RRF fusion.
Content Extraction
One URL, every format you ask for in one fetch: markdown, html, text, links, images, screenshot, schema, summary.
Site Map
A site's URLs from our index and its own sitemap, merged and deduplicated, without crawling it.
Crawl
A real job API: async, paginated status, cancel, path filters, depth and subdomain scope, sitemap seeding, webhooks, robots.
Batch Scrape
The crawl machinery with the addresses supplied instead of discovered. One document per URL.
AI Answer
Direct answer with its sources. When the model is down the sources still come back, and the response says why.
Image Search
Keyword + semantic image search. 600K+ images indexed. Alt text + vector similarity.
Web Lookup
Search, fetch the top results in parallel, and return only the chunks containing your term. One call instead of four.
MCP Protocol
Native Model Context Protocol. Plug into Claude Desktop, Cursor, or any MCP-compatible agent.
The parts other scraping APIs leave out
Most of an agent's time on the web is spent re-reading pages that did not change and reconciling a response against the request that asked for it. These exist so it does not have to.
#Crawl diff mode
Re-crawl a site and get back only what moved. Every page carries new, same, changed or removed with a git-style diff; the job carries a tally of all four. The tally counts every page the crawl saw, so an empty result is distinguishable from a crawl that fetched nothing.
docs →#Near-duplicate collapsing
One flag folds pages that repeat something already in the results into the page they repeat — the same article under three paths, the same list paginated. You get back what was collapsed and into what, so a deduplicated crawl is never mistaken for a short one.
docs →#A format is never dropped silently
Ask for ten shapes of a page and you get ten keys. One that could not be produced stays in the response as null with the reason beside it in warnings. You never have to diff your request against your response to find out what went missing.
docs →#It tells you what it actually did
Every extraction reports which engine ran, whether a browser was spent, which egress tier actually applied and where the request left from. Ask for a proxy tier we cannot serve and you get a warning saying the request went out directly — not a pretence that it didn't.
docs →#Watch one field, not one page
Hand change tracking a JSON Schema and it diffs the values rather than the prose: changed_fields comes back as dotted paths with the before and after. An unchanged page is never re-extracted, so watching a price costs a fetch, not a model call.
docs →#Map a site without crawling it
Two sources merged in parallel — the pages we have already crawled, which arrive with titles and descriptions, and the site's own sitemaps followed through indexes and .gz files. Bounded by a timeout, so a slow sitemap never holds up the answer.
docs →Why switch to SearchX
| SearchX | Bing API | Firecrawl | SerpAPI | |
|---|---|---|---|---|
| Free tier | 3K/day (90K/mo) | 1K total | 500/mo | 100/mo |
| Search + Extract | Both included | Search only | Extract only | Search only |
| JS rendering | Included | No | $19+ | No |
| Semantic search | Included | No | No | No |
| AI answer | Built-in | No | No | No |
| Image search | Included | $5 add-on | No | $50/mo |
| MCP protocol | Native | No | Yes | No |
Clean JSON that admits what it could not do
Every requested format is a key. A key that could not be filled stays, set to null, with the reason beside it — and the request is still a success.
{
"url": "https://example.com",
"title": "Example Domain",
"markdown": "# Example Domain\n\nThis domain is for use in...",
"links": ["https://iana.org/domains/example"],
"summary": null,
"fetch": {
"engine": "static",
"browser_used": false,
"proxy_tier": "direct"
},
"warnings": ["summary: the language model is unavailable right now"]
}