DOCS

Call CrustAPI in 60 seconds

Google and LinkedIn data behind one simple API. Get a key, send a request, get clean JSON back. Point an AI assistant at it over MCP, or let an agent pay for itself with x402. It's all on this page.

Quickstart

Grab a free key from your dashboard. You get 3,000 credits a month, no card. Send the key as an x-api-key header and hit one endpoint.

curl "https://crustapi.com/v1/search?type=web&q=best serp api 2026" \ -H "x-api-key: key_live_xxxx"

Here is what actually comes back. Pick an endpoint and see a real, recent response (phones shown masked, the API returns them in full):

Response for

You pay one credit per successful search, however many results come back. Maps is the one exception, it bills one credit per business returned. Empty searches are free, and the credits you buy never expire. Every response is the same stable JSON shape, and it matches serper's, so you can point existing code at us without rewriting your parser.

Packs continue up to 250 million credits for $100,000, which is $0.40 per 1,000. Prices ex-tax.

Google

One endpoint, one parameter that picks the Google surface. Change type, keep everything else the same.

GET https://crustapi.com/v1/search?type=<surface>&q=<query>

The surfaces you can ask for:

Common parameters

The full machine-readable spec lives at /v1/openapi.json. Point your tooling or your agent at it.

LinkedIn

Public, logged-out LinkedIn data through a second endpoint with the same clean shape. Pick what you want with type, pass a profile or company URL (or keywords), and get JSON back in about a second.

curl "https://crustapi.com/v1/linkedin?type=profile&url=https://www.linkedin.com/in/williamhgates" \ -H "x-api-key: key_live_xxxx"

The types you can ask for:

One rule for the names: singular gets the one you point at, plural finds many. person takes a URL and returns that person; people takes keywords and returns a list. Same for job and jobs. Older names (profile, search) still work exactly as before and always will.

Parameters

Credits

One credit per successful call, the same as the rest of the API. The one exception is an enriched people search (type=search&enrich=true): because each result comes back as a complete profile, it bills one credit per profile returned, exactly what you would pay to fetch those profiles directly. Private or restricted pages return an empty result and are free.

Bulk lists and webhooks

When you have a list of profiles instead of one URL, send the whole list in a single request. Every row is fetched in parallel on our side, results come back in the same order you sent them, and one dead profile never fails the rest. Billing stays the same: you pay per row that returns real data, and rows that come back empty or not accessible are free.

curl "https://crustapi.com/v1/linkedin/batch" \ -H "x-api-key: key_live_xxxx" -H "content-type: application/json" \ -d '{"type": "refresh", "urls": ["https://www.linkedin.com/in/williamhgates", "https://www.linkedin.com/in/satyanadella"]}'

Up to 100 URLs run like this, in one round trip. The response is an array in your input order, each row carrying either data or its own error.

Async with a webhook, up to 10,000 rows

For bigger lists, add a webhook URL. We answer immediately with a job id, do the work in the background, and POST the full results to your webhook when the batch finishes. We keep only the counts, never your results.

curl "https://crustapi.com/v1/linkedin/batch" \ -H "x-api-key: key_live_xxxx" -H "content-type: application/json" \ -d '{"type": "refresh", "urls": ["...up to 10,000..."], "webhook": "https://your-app.com/hooks/crustapi"}'

You get back 202 with a jobId right away. When the batch completes, your webhook receives one POST with the same payload a sync call returns, plus the jobId. The header X-Crustapi-Job carries the job id so you can match deliveries. If your endpoint is down we retry once, and you can always check progress yourself:

curl "https://crustapi.com/v1/linkedin/batch?id=jb_YOUR_JOB_ID" -H "x-api-key: key_live_xxxx"

The status call returns counts only: how many rows, how many succeeded, how many were charged, and whether the webhook was delivered. Your data lives at your webhook, not with us.

The details that matter

CLI

Prefer the terminal? Install the CLI and get the same data from your shell, as JSON or CSV.

npm install -g crustapi-cli export CRUSTAPI_API_KEY=key_live_xxxx
crust "dentists in miami" crust search coffee --type maps --location "Austin, TX" --limit 20 crust search openai --type news | jq '.news[0]' crust search plumbers --type maps --csv > leads.csv crust scrape https://example.com/pricing --markdown

Output is JSON by default and pipes cleanly, the status line goes to stderr so your pipes stay clean. Pass --csv for CSV. It's on npm as crustapi-cli.

MCP for AI assistants

Give Claude Desktop, Cursor, Cline, or any MCP client live Google data. There's nothing to install, npx runs it. Add this to your client config and restart it.

{ "mcpServers": { "crustapi": { "command": "npx", "args": ["-y", "crustapi-mcp"], "env": { "CRUSTAPI_API_KEY": "key_live_xxxx" } } } }

Three tools appear. search is the whole menu behind one call, scrape_webpage turns any URL into clean text you can feed straight to an AI (RAG), and get_reviews pulls Google reviews for a business. The package is on npm as crustapi-mcp.

Integrations

CrustAPI is one HTTP endpoint, so it drops into any tool that can call a URL. Below is the copy-paste setup for the platforms people ask about most.

Clay

Enrich any Clay table with live Google data. Add an HTTP API enrichment column and point it here.

# Method GET # URL https://crustapi.com/v1/search?type=maps&q={{Company}}&limit=1 # Headers x-api-key: key_live_xxxx

Map a table column into {{Company}} (or any query), then pull fields like places[0].website, places[0].phone, and places[0].reviewsCount into columns. Swap type=maps for web, news, or reviews to enrich with anything Google knows.

Any HTTP node (n8n, Make, Zapier, Retool)

Same idea everywhere: a GET request to /v1/search with your key in the x-api-key header returns clean JSON you can map to fields. No SDK required.

GET https://crustapi.com/v1/search?type=web&q=YOUR%20QUERY Header x-api-key: key_live_xxxx

AI agent frameworks

LangChain, CrewAI, Haystack, and LlamaIndex all load an MCP server natively, so the MCP setup above makes CrustAPI a tool in any of them. Native packages already shipped: langchain-crustapi on PyPI and n8n-nodes-crustapi on npm. For anything else, email support@crustapi.com.

Agent payments (x402)

Your agent doesn't need a signup, a card, or a key to start. It can buy its own credits with x402, the open HTTP payment standard. If your agent framework already speaks x402, this works with no extra code from you.

Here's the whole handshake.

  1. Your agent calls POST /v1/x402/topup?pack=agent with no key.
  2. We answer 402 Payment Required with the amount, where to pay, and the USDC contract on Base.
  3. The agent's wallet signs a gasless USDC authorization (EIP-3009) and sends the request again with the signature.
  4. We verify and settle it on-chain, then hand back a real API key that's already loaded with credits.

From there the key works like any other. The agent calls /v1/search and spends the credits it just bought.

The 402 challenge

Call the top-up endpoint with no key and you get back the payment terms.

# ask to top up, no key curl -X POST "https://crustapi.com/v1/x402/topup?pack=agent"
402 Payment Required { "error": "Payment Required", "x402Version": 2, "accepts": [ { "scheme": "exact", "network": "eip155:8453", "asset": "0x8335…2913" } ], "pack": "agent", "priceUsd": 5, "credits": 2500 }

After payment

Your x402 client signs the authorization and retries. We settle it and return a key that's ready to use.

200 OK { "apiKey": "key_live_…", "credits": 2500, "packId": "agent", "txHash": "0x…" }

A few things worth knowing:

  • Payment is USDC on Base, and it's gasless. Your agent signs an authorization, so it doesn't need ETH to pay for gas.
  • The agent pack is a $5 first deposit for 2,500 credits. The bigger packs work the same way, just pass a different pack as you scale up.
  • Credits from an x402 payment are identical to credits bought with a card. One credit per successful search, and empty results are free.

Ask your AI

Still have questions? Copy this md file with detailed product description to ask your agent about it.

Agents can fetch it directly at crustapi.com/llms.txt.

Stuck on something that isn't here? Email support@crustapi.com and a human will answer.