DOCS

Get your first result

Choose an endpoint, see what it returns, and try it with your data.

Quickstart

Prefer no code? Open the dashboard to run requests and download results.

Using the API? Get your API key and replace key_live_xxxx below. You get $6 of free usage each month, no card required.

Refresh current details for a LinkedIn profile URL.

Request
curl "https://crustapi.com/v1/linkedin?type=refresh&url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fdharmesh" \
  -H "x-api-key: key_live_xxxx"
Example response (excerpt)
{
  "publicIdentifier": "dharmesh",
  "accessible": true,
  "profileState": "accessible",
  "firstName": "Dharmesh",
  "lastName": "Shah",
  "headline": "Founder and CTO at HubSpot. Helping millions grow better.",
  "currentTitle": "Founder and CTO",
  "titleSource": "headline",
  "currentCompany": {
    "name": "HubSpot",
    "slug": "hubspot",
    "linkedInUrl": "https://www.linkedin.com/company/hubspot",
    "linkedInId": "68529"
  },
  "currentSchool": {
    "name": "Massachusetts Institute of Technology",
    "slug": "mit",
    "linkedInUrl": "https://www.linkedin.com/school/mit",
    "linkedInId": "1503"
  }
}

Selected fields from recorded responses. Long text is shortened and phone numbers are masked. Live results can differ. Full field references are below.

Response fields
Pricing and billing

Your account uses a prepaid USD balance. Every eligible account gets $6 of free usage each month, including accounts with paid funds. Paid deposits never expire. Free usage resets on the date shown in Billing.

Each deposit qualifies separately and keeps its saved prices until spent. Deposits do not accumulate into a permanent account tier. Free funds are spent first, then the paid funds with the lowest applicable endpoint rate, oldest first when rates tie.

Google Search, LinkedIn Person, Company, Posts, People and Jobs are billed per successful request. Maps is billed per business returned. People with enrich=true uses the LinkedIn read rate per full profile returned. Refresh uses the LinkedIn search rate per accessible profile. Work email lookup is included. Empty and failed responses cost zero.

Wallet responses add billing.chargedUsd and billing.remainingUsd as decimal strings. GET /v1/balance returns wallet.availableUsd, available funds and saved prices. Existing numeric credits, charged and creditsRemaining fields remain numeric; for a wallet, the remaining-credit compatibility value is an affordable-unit count, not dollars. It can differ by endpoint. Use the explicit USD fields for accounting.

Dashboard estimates use your current available funds and saved prices. Actual charges depend on successful results and funds available when the request completes. Concurrent requests or a free-allowance reset can change the next applicable rate. Your activity log records the actual charge.

Existing purchased usage is preserved at the better of its old and applicable new endpoint prices. An account still showing credits keeps its current terms until it is converted. The separate x402 agent-credit path below retains its stated credit terms.

LinkedIn

Refresh people records, read profiles and companies, or search people, posts and jobs. All LinkedIn data comes from public, logged-out sources.

People database refresh

Send the LinkedIn URLs you already have. Refresh returns available current employers, company and school IDs, names, headline/title data, photo and profile status. Compare the response with your stored record to identify changes.

Refresh fields are at the response root. Use batch requests for a list, or try Refresh in the app. For employment history and other profile sections, use type=person.

Refresh response fields

Choose a LinkedIn operation

Fields vary by profile and operation. Null values and empty sections mean the information was not returned; they do not prove it does not exist. The OpenAPI reference describes the response structures.

Person response fields

Employment rows can include title, employer name/URL/ID, location, description, dates, logo and provenance. Education rows can include school name/URL/ID, degree, field of study, dates, description and logo. experienceAvailability counts returned rows only.

Company response fields
Jobs, posts and people search

Jobs can return title, company name/URL, location, description, seniority, employment type, functions, industries, salary and status. jobPoster contains a published contact’s name, headline and URL. Optional fields include datePosted, validThrough, educationRequirements, experienceRequirements, jobLocation, sourceJobIdentifier and jobMetadataSource. A missing company URL does not remove the company name. validThrough is a published validity date, not confirmed closure.

Posts include available text, date, link, author, images, reactions and comment counts. comments=true adds available comments. People search returns available identity, location, employer, education and audience counts. Inspect source, returned, totalAvailable and totalCapped when present; a total may be capped and results are not guaranteed to cover every match.

Profile status and missing values

Keep existing values when new information is unavailable or uncertain. Missing employer data does not prove someone left a job. Unavailable Profile and Refresh results are not charged.

LinkedIn request parameters

Billing

Person, Company, Posts, People and Jobs each use their endpoint’s rate per successful request. People with enrich=true bills per full profile returned. Refresh bills per accessible profile. Work email lookup is included; a successful profile is billable even if no email is found. See current prices.

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:

Google Maps response fields

For type=maps, businesses are returned in places. Field availability varies by listing, category and country. A missing phone or website stays empty.

Maps field reference

Common parameters

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

Freshness

Every search is fetched when you ask for it. We never return an older result in place of a failed fetch: if we cannot complete your search, you get an error, it is free, and you can retry. The one exception is small and always disclosed. If you send the same search again within 60 seconds, you may get the answer from the first one, and when that happens the response says so with "cached": true and "cacheAgeSeconds". Add &fresh=1 to force a new fetch every time.

Rate limits

Some search types take longer to fetch than others, so each key has a limit on how many of them can be in flight at the same time. Send up to the limit, wait for the responses, then send more. Requests over the limit get a 429 with a Retry-After header. If we are briefly at capacity, your request may wait a few seconds before it is served or returned as a 429. Rate-limited calls are never charged.

Maps, places, reviews, autocomplete, patents, webpage and the LinkedIn endpoints have no in-flight limit. If your project needs more than the paid limit, talk to us and we will set it up.

Bulk lists and webhooks

Send up to 100 URLs to POST /v1/linkedin/batch. Supported types are refresh, person (alias profile), company and posts. Results stay in input order, with a separate success or error for each row.

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/dharmesh", "https://www.linkedin.com/in/williamhgates"]}'

The response contains a results array. Each row includes url, ok, and data or error. data contains the operation’s payload without the single-request billing/timing envelope. Inaccessible rows are uncharged; inspect data.accessible or notAccessible when present.

Async delivery, up to 10,000 URLs

Add a public HTTPS webhook URL. The API returns HTTP 202 with a jobId, then POSTs the completed batch to your webhook. The X-Crustapi-Job header identifies the delivery.

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/dharmesh", "https://www.linkedin.com/in/williamhgates"], "webhook": "https://your-app.com/hooks/crustapi"}'

Large result sets may be delivered as resultsUrl with resultsBytes and resultsExpireAt. Download the JSON before that expiry; the temporary file is then deleted. Save inline webhook results in your own system.

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

The status endpoint returns job status, counts and delivery information, not result rows. Use the same account’s API key. Webhooks must have no embedded credentials; redirects are not followed and a failed delivery is retried once.

Options: member: true for Refresh and comments: true for posts. Batch does not support employees=true. Each successfully delivered row uses the chosen endpoint’s rate; unavailable results and malformed URLs are uncharged.

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 linkedin https://www.linkedin.com/in/dharmesh 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 Google and public LinkedIn data. With Node.js installed, 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" } } } }

Four 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. The fourth, linkedin, is the LinkedIn menu: profiles, companies, jobs, posts and people search.

For People Refresh, call /v1/linkedin?type=refresh through your agent’s HTTP tool. The published MCP package currently exposes profile, company, posts, jobs and people search.

Integrations

Use CrustAPI from any tool that supports HTTP requests and custom headers.

Connect with HTTP requests

Add an HTTP request step in your tool. Choose GET, enter the endpoint and query parameters below, and add your API key in the x-api-key header. Replace the values in {{braces}} with fields from your workflow.

Refresh a person

GET https://crustapi.com/v1/linkedin Query: type=refresh, url={{LinkedIn URL}} Header: x-api-key: key_live_xxxx

Pass a LinkedIn profile URL as url. Map currentCompany.name, currentCompany.linkedInId, currentTitle, titleSource and profileState into your workflow or spreadsheet. Compare against your saved employer/title and preserve existing values when the result is unavailable.

Find a local business

GET https://crustapi.com/v1/search Query: type=maps, q={{Business name}} {{Location}}, limit=1 Header: x-api-key: key_live_xxxx

Map places[0].website, places[0].phone, places[0].address, places[0].totalScore and places[0].reviewsCount. Check the returned name, address and website before accepting a match. This is a business search; the first result is not a guaranteed domain-to-company match.

Keep API keys in your tool’s credential settings. Use the returned JSON fields in the next step of your workflow.

AI agents

Use the MCP server for its supported tools, or the HTTP API for Refresh and other endpoint options. Give your agent llms.txt for usage guidance and the OpenAPI specification for request and response schemas.

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.
  • This keyless x402 path uses its own credit packs and creates a separate agent key. It does not add USD funds to an existing dashboard wallet. Its returned pack price and credit quantity remain authoritative. 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.