{"version":1,"resources":["https://stableenrich.dev/api/fullenrich/company-search","https://stableenrich.dev/api/fullenrich/people-search","https://stableenrich.dev/api/companyenrich/org-enrich","https://stableenrich.dev/api/pdl/people-enrich","https://stableenrich.dev/api/clado/contacts-enrich","https://stableenrich.dev/api/exa/search","https://stableenrich.dev/api/exa/find-similar","https://stableenrich.dev/api/exa/contents","https://stableenrich.dev/api/exa/answer","https://stableenrich.dev/api/firecrawl/scrape","https://stableenrich.dev/api/firecrawl/search","https://stableenrich.dev/api/google-maps/text-search/partial","https://stableenrich.dev/api/google-maps/text-search/full","https://stableenrich.dev/api/google-maps/nearby-search/partial","https://stableenrich.dev/api/google-maps/nearby-search/full","https://stableenrich.dev/api/google-maps/place-details/partial","https://stableenrich.dev/api/google-maps/place-details/full","https://stableenrich.dev/api/google-maps/solar/building-insights","https://stableenrich.dev/api/google-maps/solar/data-layers","https://stableenrich.dev/api/google-maps/solar/rgb-image","https://stableenrich.dev/api/google-maps/aerial-view/lookup-video","https://stableenrich.dev/api/google-maps/aerial-view/render-video","https://stableenrich.dev/api/serper/news","https://stableenrich.dev/api/serper/shopping","https://stableenrich.dev/api/serper/images","https://stableenrich.dev/api/serper/people-image-search","https://stableenrich.dev/api/serper/lens","https://stableenrich.dev/api/whitepages/person-search","https://stableenrich.dev/api/whitepages/property-search","https://stableenrich.dev/api/reddit/search","https://stableenrich.dev/api/reddit/post-comments","https://stableenrich.dev/api/hunter/email-verifier","https://stableenrich.dev/api/hunter/email-verifier/jobs/{jobId}","https://stableenrich.dev/api/minerva/resolve","https://stableenrich.dev/api/minerva/enrich","https://stableenrich.dev/api/minerva/validate-emails","https://stableenrich.dev/api/cloudflare/crawl","https://stableenrich.dev/api/cloudflare/jobs"],"mppResources":["https://stableenrich.dev/api/fullenrich/company-search","https://stableenrich.dev/api/fullenrich/people-search","https://stableenrich.dev/api/companyenrich/org-enrich","https://stableenrich.dev/api/pdl/people-enrich","https://stableenrich.dev/api/clado/contacts-enrich","https://stableenrich.dev/api/exa/search","https://stableenrich.dev/api/exa/find-similar","https://stableenrich.dev/api/exa/contents","https://stableenrich.dev/api/exa/answer","https://stableenrich.dev/api/firecrawl/scrape","https://stableenrich.dev/api/firecrawl/search","https://stableenrich.dev/api/google-maps/text-search/partial","https://stableenrich.dev/api/google-maps/text-search/full","https://stableenrich.dev/api/google-maps/nearby-search/partial","https://stableenrich.dev/api/google-maps/nearby-search/full","https://stableenrich.dev/api/google-maps/place-details/partial","https://stableenrich.dev/api/google-maps/place-details/full","https://stableenrich.dev/api/google-maps/solar/building-insights","https://stableenrich.dev/api/google-maps/solar/data-layers","https://stableenrich.dev/api/google-maps/solar/rgb-image","https://stableenrich.dev/api/google-maps/aerial-view/lookup-video","https://stableenrich.dev/api/google-maps/aerial-view/render-video","https://stableenrich.dev/api/serper/news","https://stableenrich.dev/api/serper/shopping","https://stableenrich.dev/api/serper/images","https://stableenrich.dev/api/serper/people-image-search","https://stableenrich.dev/api/serper/lens","https://stableenrich.dev/api/whitepages/person-search","https://stableenrich.dev/api/whitepages/property-search","https://stableenrich.dev/api/reddit/search","https://stableenrich.dev/api/reddit/post-comments","https://stableenrich.dev/api/hunter/email-verifier","https://stableenrich.dev/api/minerva/resolve","https://stableenrich.dev/api/minerva/enrich","https://stableenrich.dev/api/minerva/validate-emails","https://stableenrich.dev/api/cloudflare/crawl"],"description":"Pay-per-request access to FullEnrich, CompanyEnrich, LeadMagic, Clado, Exa, Firecrawl, Google Maps, Serper, and Whitepages APIs. No auth, no subscriptions.","ownershipProofs":["0x0000000000000000000000008e6af8ed94e87b4402d0272c5d6b0d47f0483e7c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000124406f52fd0000000000000000000000002b4e26e1f32c7fbf076563ad49a86b69ae0182160000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000311d29fa0000000000000000000000000000000000000000000000000000000000000002bd71e7ae4046dbcd345631a04e70b360434e724d558d4dbce1a1235e0c5dbe8b7e673ff35925f52d6b485ac8fdd324d9e0ee0163e09e8c3f2b7ea44fc4f72745be445780eeddc4321ff957c7fb8ac80866d1f281f2bdac807ac00d38dc33e8403e21ca5d0d341cc94b8dcc9c79b36f691ce99d74cbf28511a1f3a3e14885eefd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000001efc2614a03c63dd8f71e1d894e51b2bfe0e92bda90057cabac999faf7326518d37bb3db54c216f721045344f47892422bcb223d32b58878bc3589a80508fcd0d000000000000000000000000000000000000000000000000000000000000002506817f31b6ccc1234a424df1fff4840b8ed06f3671ea34bfbfabcb0b04a176ac1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000897b2274797065223a22776562617574686e2e676574222c226368616c6c656e6765223a225148756e486d654632376730765150624a594f71436a726857543943585a655f3366506f7767674a642d77222c226f726967696e223a2268747470733a2f2f7465616d732e73706c6974732e6f7267222c2263726f73734f726967696e223a66616c73657d00000000000000000000000000000000000000000000006492649264926492649264926492649264926492649264926492649264926492"],"instructions":"# StableEnrich API Reference\n## Authentication\n\nAll endpoints require micropayment. Include payment headers as per the HTTP 402 specification. Payments are processed on Base mainnet (eip155:8453), Solana, or Tempo.\n\n## Base URL\n\nhttps://stableenrich.dev\n\nAll endpoints are relative to this base URL.\n\n## Agent Workflow (Progressive)\n\n1. Discover candidate endpoints with `mcp__agentcash__discover_api_endpoints(\"https://stableenrich.dev\")`.\n2. If discovery reports `guidanceAvailable=true` but guidance is omitted, only re-run with `include_guidance=true` when domain-level methodology is needed.\n3. For selected POST/PUT/PATCH endpoints, call `mcp__agentcash__check_endpoint_schema` before first fetch.\n4. Execute with `mcp__agentcash__fetch`.\n\nIf no endpoint matches the user task, stop this origin flow and switch to another origin.\n\n## Schema Discovery\n\nAll endpoints support schema discovery via the `check_endpoint_schema` tool. Use it on the selected endpoint to confirm request schema and pricing before execution.\n\n## Web Scraping\n\nFor web scraping tasks, always start with **Firecrawl `/api/firecrawl/scrape`** ($0.0126/request). It provides comprehensive page content with clean markdown formatting.\n\nIf you need to scrape many URLs and cost is a concern, consider **Exa `/api/exa/contents`** ($0.002/request) as a cheaper alternative for bulk processing.\n\n---\n\n# Research Methodology (Fan-out / Population Tasks)\n\nUse this playbook for ambiguous, broad, or \"find many candidates\" requests (e.g., \"junior hedge fund carry-trade people who might start a company\"):\n\n1. **Detect fan-out**: If the request implies a population or list-building task, avoid single-search answers. Plan for *many* queries and a large candidate pool.\n2. **Clarify constraints**: Restate the target, must-haves, nice-to-haves, geography, seniority, timeframe, and desired output size. If unclear, make explicit assumptions and proceed.\n3. **Broad-to-narrow pipeline**:\n   - **Seed**: Use multiple discovery sources to build an initial pool (Exa `/api/exa/search` with `category: \"people\"` for people discovery, Firecrawl for web lists, Google Maps for local orgs, FullEnrich company-search for company lists).\n   - **Expand**: Generate query variants (synonyms, titles, strategies, regions) and paginate until you reach a healthy pool (aim 50–100 candidates).\n   - **Enrich**: Resolve LinkedIn URLs first (Exa `/api/exa/search` with `category: \"people\"` or FullEnrich people-search), then PDL `/api/pdl/people-enrich` by `profile` — do not default to name+domain. Use Minerva enrich for LinkedIn/demographic data or Clado contacts-enrich for email/phone when PDL is insufficient; dedupe by name + company + profile URL.\n   - **Filter**: Apply the must-haves; keep 30–50 high-confidence matches.\n4. **Tool choreography**: Use **mcp__agentcash__fetch** for all paid endpoints. Verify company domains with `/api/companyenrich/org-enrich` or `/api/fullenrich/company-search` before large people searches to avoid wasted calls.\n5. **Evidence and transparency**: Track sources per candidate; note uncertainty; surface how the list was constructed and where gaps remain.\n\n---\n\n# Google Maps API\n\n## POST /api/google-maps/text-search/full\nSearch for places using a text query with full field details (includes ratings, reviews, contact info, and atmosphere data).\nPrice: $0.08 per request\n\nExample:\n```json\n{\n  \"textQuery\": \"coffee shops in San Francisco\",\n  \"maxResultCount\": 5\n}\n```\n\n---\n\n## POST /api/google-maps/text-search/partial\nSearch for places using a text query with partial field details (basic info only, lower cost).\nPrice: $0.02 per request. Same request body as /text-search/full.\n\n---\n\n## POST /api/google-maps/nearby-search/full\nSearch for places near a geographic location with full details.\nPrice: $0.08 per request\n\nExample:\n```json\n{\n  \"locationRestriction\": {\n    \"circle\": {\n      \"center\": { \"latitude\": 37.7749, \"longitude\": -122.4194 },\n      \"radius\": 1000\n    }\n  },\n  \"maxResultCount\": 5\n}\n```\n\n---\n\n## POST /api/google-maps/nearby-search/partial\nSearch for places near a geographic location with partial details.\nPrice: $0.02 per request. Same request body as /nearby-search/full.\n\n---\n\n## GET /api/google-maps/place-details/full\nGet full details for a specific place by ID.\nPrice: $0.05 per request\n\nExample: GET /api/google-maps/place-details/full?placeId=ChIJN1t_tDeuEmsRUsoyG83frY4\n\n---\n\n## GET /api/google-maps/place-details/partial\nGet partial details for a specific place by ID.\nPrice: $0.02 per request. Same query parameters as /place-details/full.\n\n---\n\n## GET /api/google-maps/solar/building-insights\nGoogle Solar API — closest building insights for a lat/lng. Use this as a cheap probe to confirm Solar coverage for an address and to read the imagery capture date (`imageryDate`) before fetching the full data layers.\nPrice: $0.02 per request\n\nQuery parameters:\n- `latitude` (required) — building latitude\n- `longitude` (required) — building longitude\n- `requiredQuality` (optional, default `HIGH`) — `LOW` | `MEDIUM` | `HIGH`\n\nExample:\nGET /api/google-maps/solar/building-insights?latitude=37.4220&longitude=-122.0841&requiredQuality=LOW\n\nReturns roof segments, sunshine hours, panel capacity estimates, plus `imageryDate` and `imageryProcessedDate`.\n\n---\n\n## GET /api/google-maps/solar/data-layers\nGoogle Solar API — aerial GeoTIFF data layers for a building. Returns signed URLs for the actual aerial RGB photograph (`rgbUrl`), digital surface model (`dsmUrl`), shade/flux maps, and a building mask, along with `imageryDate` (the capture date of the photo).\nPrice: $0.08 per request\n\nQuery parameters:\n- `latitude` (required)\n- `longitude` (required)\n- `radiusMeters` (optional, default `50`, max `175`) — radius around the lat/lng to include\n- `view` (optional, default `FULL_LAYERS`) — `DSM_LAYER` | `IMAGERY_LAYERS` | `IMAGERY_AND_ANNUAL_FLUX_LAYERS` | `IMAGERY_AND_ALL_FLUX_LAYERS` | `FULL_LAYERS`\n- `requiredQuality` (optional, default `HIGH`) — `LOW` | `MEDIUM` | `HIGH`\n- `pixelSizeMeters` (optional, default `0.25`) — must be one of `0.1`, `0.25`, `0.5`, `1.0`\n- `exactQualityRequired` (optional, default `false`)\n\nExample:\nGET /api/google-maps/solar/data-layers?latitude=37.4220&longitude=-122.0841&radiusMeters=50&view=IMAGERY_LAYERS\n\nThe returned URLs are signed and expire — fetch the GeoTIFFs promptly. To convert a GeoTIFF to PNG/JPEG use `gdal_translate` or any image library that reads TIFF.\n\n---\n\n## GET /api/google-maps/aerial-view/lookup-video\nGoogle Aerial View API — look up a previously rendered 3D flyover video for an address (or by `videoId`). Returns video URIs (landscape, portrait, thumbnail) and metadata. Returns `state: PROCESSING` if a video has been requested but not finished rendering.\nPrice: $0.01 per request\n\nQuery parameters (provide one):\n- `address` — street address to look up\n- `videoId` — existing video ID\n\nExample:\nGET /api/google-maps/aerial-view/lookup-video?address=1600+Amphitheatre+Parkway+Mountain+View+CA\n\n---\n\n## POST /api/google-maps/aerial-view/render-video\nGoogle Aerial View API — request rendering of a new flyover video for an address. The render is asynchronous; poll `/api/google-maps/aerial-view/lookup-video` until `state: ACTIVE` to retrieve the finished URIs.\nPrice: $0.01 per request\n\nExample:\n```json\n{\n  \"address\": \"1600 Amphitheatre Parkway, Mountain View, CA\"\n}\n```\n\n---\n\n# B2B Data (FullEnrich, CompanyEnrich, PDL)\n\n## Organization lookup workflow\n\nBefore people searches filtered by company, verify the target domain:\n\n1. Call `/api/fullenrich/company-search` with the company name (use `exact_match: true` when the name is known precisely), or\n2. Call `/api/companyenrich/org-enrich` with the domain to confirm the company profile.\n3. Use the verified domain in `/api/fullenrich/people-search` via `current_company_domains`.\n\nFullEnrich returns unobfuscated names in search (~80%). Email is **not** in search results — use `/api/pdl/people-enrich` for full profile, emails, and phone ($0.20/request). Prefer `email` input when you already have a work address.\n\nIf B2B endpoints do not return needed data, fall back to Minerva (`/api/minerva/resolve` + `/api/minerva/enrich`) or Clado (`/api/clado/contacts-enrich`).\n\n## POST /api/fullenrich/company-search\nSearch for companies by filters.\nPrice: **$0.05 per query** (flat). FullEnrich upstream is **0.25 credits per result returned** ([credit docs](https://docs.fullenrich.com/api/v2/general/credit)) — ~$0.04 upstream at default `limit=3` on Pro-tier credits. Default `limit` is 3.\n\n**`industries` values:** Must be exact FullEnrich enum strings — free-text like `\"Artificial Intelligence\"` returns **400**. There is no AI-specific industry; OpenAI, Anthropic, and similar companies index under `\"Research Services\"`, not a dedicated AI label. Common values:\n\n- `\"Software Development\"`\n- `\"Research Services\"`\n- `\"Financial Services\"`\n- `\"Technology, Information and Internet\"`\n- `\"Venture Capital and Private Equity Principals\"`\n- `\"Medical Equipment Manufacturing\"`\n- `\"Information Technology & Services\"`\n\nFull catalog (490 values): [Company Industry enum](https://docs.fullenrich.com/api/v2/general/enums#company-industry).\n\n**`exact_match`:** `exact_match: true` narrows results but does **not** guarantee a single hit — unrelated companies sharing the same name still appear.\n\n**Legal entity vs brand:** Search by legal entity name, not product or brand name — they often differ (e.g. Cursor AI appears under `\"Anysphere\"`, not `\"Cursor\"`).\n\n**Pagination:** Do **not** use `page` for pagination — it may be ignored on cached responses and return identical results. Use the `search_after` cursor token from response `metadata`.\n\nExample:\n```json\n{\n  \"limit\": 3,\n  \"industries\": [{ \"value\": \"Research Services\" }],\n  \"headquarters_locations\": [{ \"value\": \"United States\" }]\n}\n```\n\nExample (next page via cursor):\n```json\n{\n  \"limit\": 3,\n  \"search_after\": \"<token from metadata.search_after>\",\n  \"industries\": [{ \"value\": \"Research Services\" }]\n}\n```\n\n---\n\n## POST /api/fullenrich/people-search\nSearch for people/contacts matching criteria.\nPrice: **$0.05 per query** (flat). Default `limit` is 3. Upstream bills 0.25 FullEnrich credits per person returned.\n\nExample:\n```json\n{\n  \"limit\": 3,\n  \"current_company_domains\": [{ \"value\": \"stripe.com\" }],\n  \"current_position_seniority_level\": [{ \"value\": \"VP\" }]\n}\n```\n\n**Seniority vs title:** Use `current_position_seniority_level` for population queries (e.g. all VPs at a company). Use `current_position_titles` only when you need an exact title match — it returns far fewer results.\n\n**Zero-result recovery:** Combining **3+ filters** frequently returns zero results. If `people` is empty, remove the most restrictive filter first — `current_position_titles` is usually the cause. Start with **domain + seniority**, then add title only if needed.\n\n**Filter logic:** Filters **AND across categories, OR within a category** ([filtering logic](https://docs.fullenrich.com/api/v2/general/filtering-logic-explained)). Prefer seniority enum values (`C-level`, `VP`, `Head`, `Founder`, etc.) over exact titles. Full list: [Seniority enum](https://docs.fullenrich.com/api/v2/general/enums#seniority). Avoid `\"Director\"` in domain-scoped queries — too common; domain weighting collapses. Use `VP`, `Head`, or `Founder` instead. `person_locations` without `current_company_domains` is very broad — pair location with a company domain when possible.\n\n**Domain coverage:** People search coverage varies by company domain. Some domains (e.g. `figma.com`) return zero results regardless of filters. If a domain-scoped query is empty with minimal filters, the domain may not be indexed.\n\n**`current_company_days_since_last_job_change`:** Days since the person last changed jobs in FullEnrich's graph — **not necessarily** the start date of their current role. Larger ranges (500–1000) are more reliable than tight windows. Compounds aggressively with other filters — use with **one or two other filters max**.\n\nExample (recency + domain, no title):\n```json\n{\n  \"limit\": 3,\n  \"current_company_domains\": [{ \"value\": \"stripe.com\" }],\n  \"current_company_days_since_last_job_change\": [{ \"min\": 500, \"max\": 1000 }]\n}\n```\n\nExample (seniority instead of title):\n```json\n{\n  \"limit\": 3,\n  \"current_company_domains\": [{ \"value\": \"stripe.com\" }],\n  \"current_position_seniority_level\": [{ \"value\": \"C-level\" }]\n}\n```\n\n---\n\n## POST /api/companyenrich/org-enrich\nEnrich a company profile by domain.\nPrice: $0.06 per request\n\n`employees` and `revenue` are **range strings** (e.g. `\"5K-10K\"`, `\"over-1b\"`) — do not numeric-compare them.\n\n**Known issue — `openai.com`:** Resolves to an unrelated third-party ChatGPT fan page (~18 employees, no real funding). There is currently no workaround — the correct OpenAI record is not accessible via this endpoint.\n\n**Domain resolution:** CompanyEnrich may return a different canonical `domain` than your input. Always verify the returned `domain` matches your intent before downstream people searches.\n\n**Domains not indexed:** `x.com` (Twitter/X) returns **404** — the post-rebrand domain is not in the index. Use `twitter.com` instead.\n\n**Funding data:** `total_funding` is independently sourced and may not reflect recent rounds. Prefer the `funding` array for the most current round data — it updates more frequently than the scalar. Funding reflects VC/PE rounds only; **M&A acquisitions are not included** (e.g. GitHub's Microsoft acquisition does not appear).\n\n**`expand: \"workforce\"`:** Only useful if the domain resolves correctly. Before using workforce expansion, verify the returned `domain` matches your input — if CompanyEnrich canonicalized to a different domain, workforce data reflects that company, not yours.\n\nExample:\n```json\n{\n  \"domain\": \"stripe.com\"\n}\n```\n\n---\n\n## POST /api/pdl/people-enrich\nEnrich a person with full career history, emails, and phone from People Data Labs.\nPrice: **$0.20 per request**\n\nSupported inputs (one group required — ranked by reliability):\n1. `email` — **highest reliability**; when you have a known work email, use it as the sole input (often likelihood 9)\n2. `profile` — LinkedIn URL; good hit rate but not better than email when email is known\n3. `first_name` + `last_name` + `company_name` or `company_domain` — fallback; similar coverage to profile, not a substitute when the person is absent from PDL\n\nExample (email — preferred when available):\n```json\n{\n  \"email\": \"patrick@stripe.com\"\n}\n```\n\nExample (LinkedIn):\n```json\n{\n  \"profile\": \"https://www.linkedin.com/in/patrickcollison\"\n}\n```\n\nExample (name + domain — fallback):\n```json\n{\n  \"first_name\": \"Patrick\",\n  \"last_name\": \"Collison\",\n  \"company_domain\": \"stripe.com\"\n}\n```\n\n**404 semantics:** HTTP **404** means the person is not in PDL's dataset (upstream miss, not bad input). Switching from name+domain to LinkedIn URL (or vice versa) will **not** help — neither is a fallback for the other when the record is absent.\n\n**Coverage:** Strong for startup founders and US tech professionals. Some well-known executives (e.g. Dario Amodei, Tobi Lutke, Andrej Karpathy) are absent entirely — no lookup method will find them.\n\n**`is_primary` staleness:** `is_primary: true` marks the most recently updated job in PDL's graph, not necessarily the person's current primary employer. Board seats and advisory roles updated recently rank above older full-time roles. Always verify against the full `experience` array when the top-level `job_title` looks wrong.\n\n**PII:** Responses for public figures may include personal emails, phone numbers, and home addresses. Handle output accordingly.\n\n---\n\n# Exa API (Web Search & Research)\n\n## POST /api/exa/search\nSemantic web search for finding relevant pages.\nPrice: $0.01 per request\n\nSupports an optional `category` parameter to filter results by content type: `\"company\"`, `\"people\"`, `\"research paper\"`, `\"news\"`, `\"pdf\"`, `\"personal site\"`, `\"financial report\"`.\n\n**People/Profile Search Tip**: Prefer `category: \"people\"` for high-level people or profile searches. This is a fast, cheap way to find people before enriching with FullEnrich or Clado.\n\n**X/Twitter Tip**: Exa no longer supports `category: \"tweet\"`. Do not use Exa for complete timelines or reliable tweet retrieval; use a dedicated X/Twitter API for that. If Exa is used for broad web discovery, post-filter returned URLs to `x.com` or `twitter.com`.\n\nExample:\n```json\n{\n  \"query\": \"best practices for building AI agents\",\n  \"numResults\": 5\n}\n```\n\nLinkedIn profile search example:\n```json\n{\n  \"query\": \"hedge fund portfolio manager New York\",\n  \"category\": \"people\",\n  \"numResults\": 10\n}\n```\n\n---\n\n## POST /api/exa/find-similar\nFind pages similar to a given URL.\nPrice: $0.01 per request\n\nExample:\n```json\n{\n  \"url\": \"https://openai.com\",\n  \"numResults\": 5\n}\n```\n\n---\n\n## POST /api/exa/contents\nExtract content from specific URLs.\nPrice: $0.002 per request\n\nExample:\n```json\n{\n  \"urls\": [\"https://example.com\"]\n}\n```\n\n---\n\n## POST /api/exa/answer\nGet an AI-generated answer to a question based on web search.\nPrice: $0.01 per request\n\nExample:\n```json\n{\n  \"query\": \"What is the capital of France?\"\n}\n```\n\n---\n\n# Firecrawl API (Web Scraping)\n\n## POST /api/firecrawl/scrape\nScrape and extract content from a URL.\nPrice: $0.0126 per request\n\nExample:\n```json\n{\n  \"url\": \"https://example.com\"\n}\n```\n\n---\n\n## POST /api/firecrawl/search\nSearch the web and get scraped results.\nPrice: $0.0252 per request\n\nExample:\n```json\n{\n  \"query\": \"best coffee shops\",\n  \"limit\": 5\n}\n```\n\n---\n\n# Clado API (Contact Enrichment)\n\nNote: Clado is useful as a fallback when PDL does not return personal emails or phone numbers. For LinkedIn profile data (experience, education, skills), use Minerva `/api/minerva/enrich` instead.\n\n## POST /api/clado/contacts-enrich\nEnrich contact information from LinkedIn URL, email, or phone number. Must provide exactly one of: linkedin_url, email, or phone.\nPrice: $0.20 per request\n\nExample:\n```json\n{\n  \"linkedin_url\": \"https://www.linkedin.com/in/satyanadella\"\n}\n```\n\n---\n\n# Serper API (Google Search)\n\n## POST /api/serper/news\nGoogle News search via Serper.dev.\nPrice: $0.04 per request\n\nExample:\n```json\n{\n  \"q\": \"OpenAI funding\",\n  \"num\": 10,\n  \"gl\": \"us\",\n  \"hl\": \"en\"\n}\n```\n\n---\n\n## POST /api/serper/shopping\nGoogle Shopping search via Serper.dev.\nPrice: $0.04 per request\n\nExample:\n```json\n{\n  \"q\": \"wireless earbuds\",\n  \"num\": 10,\n  \"gl\": \"us\",\n  \"hl\": \"en\"\n}\n```\n\n---\n\n## POST /api/serper/images\nGoogle Images search via Serper.dev. Generic public image discovery — products, places, screenshots, anything visual. For headshots/profile photos prefer `/api/serper/people-image-search`, which is tuned for that use case.\nPrice: $0.04 per request\n\nExample:\n```json\n{\n  \"q\": \"eiffel tower at night\",\n  \"num\": 10,\n  \"gl\": \"us\",\n  \"hl\": \"en\"\n}\n```\n\n---\n\n## POST /api/serper/people-image-search\nGoogle Images search tuned for finding a specific person — headshot/profile-photo candidates when LinkedIn/profile-photo APIs return null or a default avatar. Same backend as `/api/serper/images` but with calling guidance below.\nPrice: $0.04 per request\n\nHeadshot search guidance:\n- Resolve identity before ranking images when the person is ambiguous. Use FullEnrich, Exa LinkedIn profile search, or Minerva to confirm the profile slug, company, and title; do not rely on name alone.\n- LinkedIn profile photos may be limited to connections, a broader network, or LinkedIn members only. Only public photos are reliably indexable by Google. If a scraper returns `default_avatar: true` or a placeholder, use public non-LinkedIn sources tied to the confirmed identity.\n- If the first image search fails, research the confirmed profile for other disambiguating terms, such as school, city, past employers, projects, or personal sites, then retry Google Images with those terms.\n- Query syntax matters. Start with exact-name and company terms, for example: `\"Ryan Sproule\" \"Merit Systems\" LinkedIn headshot` or `\"Mason Hall\" \"Merit Systems\" profile photo`.\n- Use `num: 5-10`, `gl: \"us\"`, and `hl: \"en\"` for US business profiles unless the user gives another locale.\n- Prefer candidates whose result title/source page matches the person and company, from credible sources such as LinkedIn, the person's own website, company/team pages, RootData, Crunchbase, or news profiles.\n- Prefer square-ish, high-resolution human headshots. Reject obvious logos, default avatars, LinkedIn `videocover`, `feedshare`, cover/banner/background images, and images where the result title points to another person.\n- If no single result is clearly correct, return the top candidates with source URLs and explain the uncertainty.\n\nExample:\n```json\n{\n  \"q\": \"\\\"Ryan Sproule\\\" \\\"Merit Systems\\\" LinkedIn headshot\",\n  \"num\": 10,\n  \"gl\": \"us\",\n  \"hl\": \"en\"\n}\n```\n\n---\n\n## POST /api/serper/lens\nGoogle Lens reverse image search via Serper.dev. Pass a public image URL and get visually similar pages, products, and sources.\nPrice: $0.20 per request\n\nExample:\n```json\n{\n  \"url\": \"https://example.com/photo.jpg\",\n  \"gl\": \"us\",\n  \"hl\": \"en\"\n}\n```\n\n---\n\n# Whitepages API (People & Property Search)\n\n## POST /api/whitepages/person-search\nSearch for people by name, phone number, or address.\nPrice: $0.22 per request\n\nExample:\n```json\n{\n  \"first_name\": \"John\",\n  \"last_name\": \"Smith\",\n  \"state_code\": \"CA\"\n}\n```\n\n---\n\n## POST /api/whitepages/property-search\nGet property ownership, resident, and property details by address.\nPrice: $0.22 per request\n\nIMPORTANT: The state parameter is named `state_code`, NOT `state`. You must use the field name `state_code` with a two-letter state abbreviation (e.g., \"CA\", \"NY\", \"TX\"). Using `state` instead of `state_code` will result in the field being ignored.\n\nExample:\n```json\n{\n  \"street\": \"123 Main St\",\n  \"city\": \"San Francisco\",\n  \"state_code\": \"CA\"\n}\n```\n\nWRONG (will not work):\n```json\n{\n  \"street\": \"123 Main St\",\n  \"city\": \"San Francisco\",\n  \"state\": \"CA\"\n}\n```\n\n---\n\n# Reddit API\n\nIMPORTANT - Two-step pattern for Reddit research:\n1. Use /api/reddit/search to find relevant posts. Responses are lightweight — selftext is truncated to 500 chars.\n   Posts with `selftextTruncated: true` have more content available.\n2. For any post where you need the full text or comments, call /api/reddit/post-comments with the post's permalink.\n   This returns the complete untruncated selftext plus all comments.\n\nThis pattern keeps search results small (< 2KB for 10 posts) while letting you drill into specific posts when needed.\n\n## POST /api/reddit/search\nSearch Reddit posts by query. Returns truncated previews for efficient browsing.\nPrice: $0.02 per request\n\nExample:\n```json\n{\n  \"query\": \"AI agents\",\n  \"sort\": \"top\",\n  \"timeframe\": \"week\",\n  \"maxResults\": 10\n}\n```\n\n---\n\n## POST /api/reddit/post-comments\nGet a Reddit post's full details and comments. Use this to get untruncated selftext and discussion for posts found via search.\nPrice: $0.02 per request\n\nExample:\n```json\n{\n  \"url\": \"https://www.reddit.com/r/AskReddit/comments/abc123/example_post\"\n}\n```\n\n---\n\n# Hunter API (Email Verification)\n\nIMPORTANT - Async pattern for Hunter email verification:\nMost verifications return immediately. If Hunter is still processing, the paid POST returns HTTP 202 with a jobId and pollUrl. Do not repeat the paid POST for that email. Poll the free SIWX endpoint with the same wallet until status is \"completed\" or \"failed\".\n\n## POST /api/hunter/email-verifier\nVerify email deliverability via Hunter.io. Returns either the final verification result or a pending job response.\nPrice: $0.03 per request\n\nExample:\n```json\n{\n  \"email\": \"test@stripe.com\"\n}\n```\n\nPending response:\n```json\n{\n  \"jobId\": \"3c16f7d3-8782-4a47-a033-b12bb0d7a16d\",\n  \"status\": \"pending\",\n  \"pollUrl\": \"https://stableenrich.dev/api/hunter/email-verifier/jobs/3c16f7d3-8782-4a47-a033-b12bb0d7a16d\",\n  \"retryAfterSeconds\": 5\n}\n```\n\n## GET /api/hunter/email-verifier/jobs/{jobId}\nPoll a pending Hunter verification job. This endpoint is free but requires SIWX authentication from the same wallet that paid for the POST.\nPrice: Free (SIWX)\n\nPoll every `retryAfterSeconds` while status is \"pending\". When status is \"completed\", read the final verification object from `result`.\n\n---\n\n# Cloudflare Browser Rendering API (Website Crawling)\n\nIMPORTANT - Two-step async pattern for Cloudflare crawl:\nThe crawl endpoint is long-running (up to ~2 minutes). It uses an async pattern:\n1. POST /api/cloudflare/crawl — pays and starts the crawl, returns a signed JWT token (202 response)\n2. GET /api/cloudflare/jobs?token=<jwt> — SIWX-authenticated (free), poll until job is complete\n\nPoll every 3–5 seconds. The job typically completes in 30–120 seconds depending on site size and render mode.\n\n## POST /api/cloudflare/crawl\nStart a website crawl. Returns a JWT token to poll for results.\nPrice: $0.10 per crawl job\n\nParameters:\n- `url` (string, required) — starting URL to crawl\n- `limit` (number, default 10, max 25) — maximum pages to crawl\n- `depth` (number, default 1, max 3) — maximum link depth from starting URL\n- `formats` (array, default [\"markdown\"]) — response formats: \"html\", \"markdown\", \"json\"\n- `render` (boolean, default false) — execute JavaScript when crawling (slower, costs more)\n- `source` (string, optional) — URL discovery: \"all\", \"sitemaps\", or \"links\"\n- `options` (object, optional) — crawl scope:\n  - `includeExternalLinks` (boolean) — follow links to external domains\n  - `includeSubdomains` (boolean) — follow links to subdomains\n  - `includePatterns` (string[]) — wildcard patterns for URLs to include\n  - `excludePatterns` (string[]) — wildcard patterns for URLs to exclude (higher priority)\n\nExample:\n```json\n{\n  \"url\": \"https://example.com\",\n  \"limit\": 5,\n  \"depth\": 1,\n  \"formats\": [\"markdown\"]\n}\n```\n\nResponse (202):\n```json\n{ \"token\": \"<signed-jwt>\" }\n```\n\n---\n\n## GET /api/cloudflare/jobs?token=<jwt>\nPoll crawl job status. Requires SIWX wallet authentication (same wallet that paid). Free — no x402/MPP payment.\n\nUse `mcp__agentcash__fetch_with_auth` (not `fetch`) for this endpoint.\n\nResponse shape (Cloudflare's result returned directly):\n```json\n{\n  \"id\": \"<jobId>\",\n  \"status\": \"<cf-status-string>\",\n  \"records\": [\n    {\n      \"url\": \"https://example.com/page\",\n      \"status\": \"completed\",\n      \"markdown\": \"...\",\n      \"metadata\": { \"status\": 200, \"url\": \"...\", \"title\": \"...\" }\n    }\n  ],\n  \"total\": 10,\n  \"finished\": 8,\n  \"skipped\": 2,\n  \"browserSecondsUsed\": 45.2,\n  \"cursor\": \"...\"\n}\n```\n\nPage `status` values: `queued` | `completed` | `errored` | `disallowed` | `skipped` | `cancelled`\n\nTo determine completion, check `result.finished + result.skipped >= result.total` or poll until no pages remain `queued`.\n\nFull polling workflow:\n```\n1. token = fetch POST /api/cloudflare/crawl  →  response.token\n2. loop:\n     result = fetch_with_auth GET /api/cloudflare/jobs?token={token}\n     if result.finished + result.skipped >= result.total → done, use result.records\n     else → wait 3-5s, repeat\n```\n\n---\n\n# Minerva API (Person Identity & Enrichment)\n\nMinerva is a consumer identity graph. Use it to resolve person identities to unique Minerva PIDs, enrich profiles with demographics/work/contact data, validate emails, and infer country from contact signals.\n\n**Recommended workflow:**\n1. Use `/api/minerva/resolve` to match a person and get their Minerva PID + LinkedIn URL\n2. Use `/api/minerva/enrich` with the returned PID for instant, comprehensive enrichment\n3. Use `/api/minerva/validate-emails` to pre-screen emails before resolve/enrich\n\n**Minerva vs B2B providers:** Minerva excels at consumer profiles (demographics, income/wealth estimates, address history, life events). FullEnrich/CompanyEnrich/PDL excel at B2B/professional data. Use Minerva when you need personal contact info, financial signals, or household data.\n\n## POST /api/minerva/resolve\nResolve person identity to a Minerva PID and LinkedIn URL. Supports fuzzy matching (name + contact info) and reverse lookup (email or phone only, no name required).\nPrice: $0.02 per request\n\nStandard fuzzy match example:\n```json\n{\n  \"records\": [\n    {\n      \"record_id\": \"user_001\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Smith\",\n      \"emails\": [\"[email protected]\"]\n    }\n  ]\n}\n```\n\nReverse lookup (email only, no name needed):\n```json\n{\n  \"records\": [{ \"record_id\": \"user_002\", \"emails\": [\"[email protected]\"] }]\n}\n```\n\nUse `match_condition_fields: [\"linkedin_url\"]` to only return matches that have a LinkedIn profile.\n\n---\n\n## POST /api/minerva/enrich\nEnrich person records with demographics, work history, education, contact info (emails + phones), address history, financial signals (income/wealth range), relatives, and social profiles.\nPrice: $0.05 per request\n\nThree lookup modes — by Minerva PID (fastest), by LinkedIn URL, or by name/email/phone:\n```json\n{\n  \"records\": [\n    { \"record_id\": \"user_001\", \"minerva_pid\": \"p-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6\" },\n    { \"record_id\": \"user_002\", \"linkedin_url\": \"https://www.linkedin.com/in/janedoe\" },\n    { \"record_id\": \"user_003\", \"first_name\": \"John\", \"last_name\": \"Smith\", \"emails\": [\"[email protected]\"] }\n  ],\n  \"return_fields\": [\"full_name\", \"personal_emails\", \"phones\", \"work_experience\"]\n}\n```\n\nUse `return_fields` to limit response size. Use `match_condition_fields` (e.g., `[\"email\", \"phone\"]`) to only return matches that have specific data.\n\n---\n\n## POST /api/minerva/validate-emails\nCheck if email addresses exist in the Minerva database. Returns validation status and last-seen timestamp. Use before resolve/enrich to pre-screen lists.\nPrice: $0.01 per request\n\n```json\n{\n  \"records\": [\"[email protected]\", \"[email protected]\"]\n}\n```\n\n---\n\n# Common Features\n\n## Field Filtering\nMost endpoints support an `excludeFields` parameter to reduce response size by omitting specific fields. Pass an array of field paths to exclude; nested paths use a colon (`:`) separator, e.g. `[\"email\", \"organization:technologies\"]`. Google Maps endpoints default to excluding \"photos\" - pass an empty array to include them.\n\n## Pagination\n- FullEnrich search endpoints use `limit`, `offset` (people) or `page` (companies), and `search_after` cursor for pages beyond offset 10,000.\n- Google Maps search endpoints support pagination via `pageToken` (returned as `nextPageToken` in responses).\n- Exa search supports `numResults` up to 100.\n\n## Error Handling\nAll endpoints return standard HTTP status codes. Payment-required responses (402) include x402/MPP payment instructions in headers. On server errors (5xx), payments are not settled.\n\n---\n\n# Pricing Summary\n\n| Endpoint | Price |\n|----------|-------|\n| Google Maps Text Search (Full) | $0.08 |\n| Google Maps Text Search (Partial) | $0.02 |\n| Google Maps Nearby Search (Full) | $0.08 |\n| Google Maps Nearby Search (Partial) | $0.02 |\n| Google Maps Place Details (Full) | $0.05 |\n| Google Maps Place Details (Partial) | $0.02 |\n| Google Solar Building Insights | $0.02 |\n| Google Solar Data Layers | $0.08 |\n| Google Aerial View Lookup Video | $0.01 |\n| Google Aerial View Render Video | $0.01 |\n| FullEnrich Company Search | $0.05 |\n| FullEnrich People Search | $0.05 |\n| CompanyEnrich Org Enrich | $0.06 |\n| PDL People Enrich | $0.20 |\n| Exa Search | $0.01 |\n| Exa Find Similar | $0.01 |\n| Exa Contents | $0.002 |\n| Exa Answer | $0.01 |\n| Firecrawl Scrape | $0.0126 |\n| Firecrawl Search | $0.0252 |\n| Clado Contacts Enrich | $0.20 |\n| Serper News | $0.04 |\n| Serper Shopping | $0.04 |\n| Serper Images | $0.04 |\n| Reddit Search | $0.02 |\n| Reddit Post Comments | $0.02 |\n| Whitepages Person Search | $0.22 |\n| Whitepages Property Search | $0.22 |\n| Hunter Email Verifier (start) | $0.03 |\n| Hunter Email Verifier Jobs (poll) | Free (SIWX) |\n| Minerva Resolve | $0.02 |\n| Minerva Enrich | $0.05 |\n| Minerva Validate Emails | $0.01 |\n| Cloudflare Crawl (start) | $0.10 |\n| Cloudflare Jobs (poll) | Free (SIWX) |\n"}