LIVE PRODUCT

SERP API

Live search results across four engines through one normalized contract.

SERP API removes parser drift, retry handling, and search engine branching from your application code. Send one search job, poll for completion, and work with normalized search modules instead of raw markup.

Endpoint

POST /v1/search

Poll GET /v1/search/:jobId for the final result payload.

Credits

1 credit per successful request

Pagination and retries that become new successful jobs each bill 1 credit.

Output

Structured JSON + optional markdown

Use markdown=true when you need a prompt-ready rendering of the same SERP.

What it's for

  • rank tracking across supported engines and locales
  • SERP features for SEO analytics dashboards
  • search evidence for AI agents and retrieval workflows
  • query monitoring for research and ad intelligence
  • internal tooling that needs stable search response objects

How it works

  1. 1Submit a search job with q, engine preference, location context, and output options.
  2. 2OrbitScraper enqueues the request and resolves the live SERP through the managed search layer.
  3. 3Poll the job endpoint until status is completed, then read the normalized result payload.

Request parameters

These are the fields accepted by the current backend contract for POST /v1/search.

NameTypeRequiredDescription
qstringYesSearch query text. Maximum length 512 characters.
enginestringNoOptional engine preference when using POST /v1/search. Supported values: google, bing, brave, duckduckgo.
locationstringNoLocation context string. Defaults to Global.
glstringNoTwo-letter country code. Defaults to us.
hlstringNoLanguage code such as en or de-DE. Defaults to en.
devicedesktop | mobileNoClient device context. Defaults to desktop.
numintegerNoResults requested per page. Defaults to 10. Range 1-20.
pageintegerNoResults page number. Defaults to 1. Range 1-100.
safeactive | offNoSafe search mode. Defaults to active.
tbmstringNoOptional vertical selector. Supported values: isch, nws, vid, lcl.
time_periodstringNoOptional freshness filter. Supported values: past_day, past_week, past_month, past_year.
markdownbooleanNoReturn a markdown rendering alongside JSON fields when true.

Response fields

These fields describe the completed payload you read from the current public API contract.

NameTypeDescription
search_metadataobjectRequest metadata including id, status, created_at, processing_time_ms, credits_used, source, and resolved engine.
search_parametersobjectNormalized request parameters used to run the search job.
search_informationobjectPagination summary including returned_results, page, and num.
organic_resultsarrayPrimary organic result list with position, title, link, displayed_link, and snippet.
local_resultsarrayLocal result entries when the query triggers a local pack.
knowledge_graphobjectKnowledge graph fields when available for the query.
people_also_askarrayRelated question modules returned by the search engine.
related_searchesarrayRelated query suggestions from the same SERP.
detected_intentstringIntent label derived from query context, for example product or informational.
markdownstringPrompt-ready markdown representation. Present only when markdown=true.

Code examples

Start with cURL, then switch to Python, JavaScript, Java, or PHP for the same SERP API flow.

Start with the raw HTTP request and poll flow.

bash
curl -X POST "https://api.orbitscraper.com/v1/search" \
  -H "x-api-key: ORS_live_1234567890" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "best ai chips 2026",
    "engine": "google",
    "location": "New York",
    "gl": "us",
    "hl": "en",
    "device": "desktop",
    "num": 10,
    "page": 1,
    "safe": "active",
    "markdown": true
  }'

curl -X GET "https://api.orbitscraper.com/v1/search/search_123456" \
  -H "x-api-key: ORS_live_1234567890"

Response examples

This is the shape you get back from the current public API contract for SERP API.

Queued response

The first response confirms the job was accepted and tells you what to poll next.

json
{
  "jobId": "search_123456",
  "status": "queued"
}

Completed response

After polling, this is the final payload shape your app reads.

json
{
  "jobId": "search_123456",
  "status": "completed",
  "result": {
    "search_metadata": {
      "id": "req_9f2b",
      "status": "Success",
      "created_at": "2026-03-27T10:30:00.000Z",
      "processing_time_ms": 322,
      "credits_used": 1,
      "source": "live",
      "engine": "google"
    },
    "search_parameters": {
      "q": "best ai chips 2026",
      "gl": "us",
      "hl": "en",
      "location": "New York",
      "device": "desktop",
      "num": 10,
      "page": 1,
      "safe": "active",
      "markdown": true
    },
    "organic_results": [
      {
        "position": 1,
        "title": "Best AI chips in 2026",
        "link": "https://example.com/ai-chips",
        "displayed_link": "example.com",
        "snippet": "A breakdown of current inference leaders."
      }
    ],
    "related_searches": ["ai accelerator comparison"],
    "markdown": "# Search Results\n..."
  },
  "code": null
}
Use x-api-key for all search endpoints. Bearer auth is rejected by the current backend contract.
POST /v1/:engine is also supported when you want to force a single engine in the path.
A successful completed search job consumes 1 credit.

Ready to build on SERP API?

The current backend contract is already live. Use the docs page for request details and the pricing page for credit planning.

Start scraping faster - ask Orbit AI.