Core
Search

POST /v1/search

Firecrawl-compatible web search. Returns SERP results with optional full-page markdown and an optional LLM-generated answer.

Provider cascade: DataForSEO SERP API → DuckDuckGo HTML → Bing HTML. The first provider that returns results is used; the source field in the response tells you which one fired.

When include_answer is true, the top-5 results are summarised by the LLM router (DeepSeek/Claude/Llama by tier). If the LLM is unavailable or no keys are configured the answer field is simply omitted, the search result is never failed because of the answer step.

Request

POST /v1/search
Content-Type: application/json
x-api-key: YOUR_KEY

Body

FieldTypeRequiredDefaultDescription
querystringYesSearch query string.
limitnumberNo10Max results. Clamped by plan (free max 20).
scrapeResultsbooleanNofalseFully scrape each result URL to markdown. Does not add per-URL scrape credits today � only the search unit charge (2 per 10 results). Full page content is included when available.
countrystringNo"us"Two-letter country code for geo-localised results (e.g. "mx", "br").
include_answerbooleanNofalseGenerate an LLM answer citing the top results (Tavily/Exa pattern). Gracefully omitted if llm-router is unavailable.
includeDomainsstring[]NoRestrict results to these domains. Translated to site: operators. Up to 20, normalized to bare hosts.
excludeDomainsstring[]NoExclude these domains. Translated to -site: operators. Up to 20.
categoriesstring | string[]NoContent categories, translated to operators: githubsite:github.com, research → arxiv/scholar, pdffiletype:pdf.
sourcesstring | string[]NoAccepted and echoed back; only web is currently honored (news/images degrade to web).
tbsstringNoGoogle time filter, e.g. qdr:d (past day), qdr:w, qdr:m, qdr:y.

Operators you type in query (e.g. site:, filetype:) pass through verbatim. The response echoes what actually ran in a search object (effectiveQuery plus the applied categories/sources/tbs/includeDomains/excludeDomains).

Example request, basic search

curl -X POST https://api.superscraper.dev/v1/search \
  -H "x-api-key: ss_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "best plumbers Austin TX",
    "limit": 5,
    "country": "us"
  }'

Example request, with answer

curl -X POST https://api.superscraper.dev/v1/search \
  -H "x-api-key: ss_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "how to get a contractor license in Texas",
    "limit": 10,
    "include_answer": true
  }'

Response

HTTP 200 when a backend completed (even if zero hits).
HTTP 503 search_unavailable when every backend failed — never invents a vendor name.

Body

FieldTypeDescription
querystringThe original query (operators applied are in search.effectiveQuery)
resultsarraySearch result items (see below)
sourcestring | nullBackend that produced rows or completed empty: "dataforseo", "duckduckgo", "bing". null only when no backend completed
totalnumberNumber of results returned
errorstring | undefinedOn empty success: "no_results". Total failure is HTTP 503, not this field
answerstring | undefinedLLM-generated answer (only present when include_answer: true and results exist)
searchobjectWhat actually ran: effectiveQuery plus the applied categories/sources/tbs/includeDomains/excludeDomains
CreditsheadersSuccessful hits bill 2 credits per 10 results (X-Credits-Consumed / X-Credits-Remaining)

Result item

FieldTypeDescription
urlstringResult URL
titlestringPage title
snippetstringShort text snippet from the SERP
positionnumberRank position (1-based)
markdownstring | nullFull page markdown, only populated when scrapeResults: true

Example response

{
  "query": "best plumbers Austin TX",
  "results": [
    {
      "url": "https://www.yelp.com/search?find_desc=plumbers&find_loc=Austin%2C+TX",
      "title": "Best Plumbers in Austin, TX - Yelp",
      "snippet": "Top 10 Best Plumbers in Austin, TX, Acme Plumbing, Longhorn Pipes & More...",
      "position": 1,
      "markdown": null
    },
    {
      "url": "https://www.angi.com/companylist/us/tx/austin/plumbers.htm",
      "title": "Top Rated Plumbers in Austin TX | Angi",
      "snippet": "Hire a local Austin plumber, read verified reviews and get free quotes.",
      "position": 2,
      "markdown": null
    }
  ],
  "source": "duckduckgo",
  "total": 5
}

Example response, with answer

{
  "query": "how to get a contractor license in Texas",
  "results": [ ... ],
  "source": "duckduckgo",
  "total": 10,
  "answer": "In Texas, contractor licensing requirements vary by trade. Electricians and plumbers must be licensed by TDLR [1]. General contractors are regulated at the city or county level rather than the state level [2]. To apply, visit the TDLR website, complete the appropriate application, and pass a trade exam [1]."
}

Errors

StatusErrorCause
400`query` is requiredquery field missing or empty
400Invalid JSON bodyMalformed request body
401API key requiredMissing x-api-key header
401Invalid or revoked API key.Key not found or deactivated
429Rate limit exceededToo many requests in the sliding window

Notes

  • scrapeResults: true fires one /v1/scrape call per result URL and counts toward your scrape quota.
  • The answer field cites sources by [number] referencing the result array positions.
  • All requests are logged to usage_logs (endpoint /v1/search) regardless of whether results were found.