Live

SERP API — google_serp

Google organic results as JSON through the native task API. Asynchronous: create a task, then long-poll it. Same key, balance and error format as the native /v1 API.

POST /v1/tasks

type"google_serp"required
qstring, 1–400 charsthe search query
depth10–100, step 10 (default 10)results to collect = depth/10 Google pages
glISO country, e.g. "GB" (default "US")Google country
hllanguage, e.g. "en" (default "en")interface language
locationGoogle Ads canonical name or nullcity/region, see GET /v1/serp/locations
filterbool (default true)false = &filter=0: similar results not folded
curl -X POST https://api.floweno.com/v1/tasks \
  -H "X-API-Key: flw_live_..." -H "Content-Type: application/json" \
  -d '{"type":"google_serp","q":"emergency plumber","depth":30,
       "gl":"GB","hl":"en","location":"Manchester,England,United Kingdom"}'

# 201
{"task_id":"7f3c2a1e-9b4d-4c6a-8e21-5d0f3b9a7c14","type":"google_serp",
 "status":"queued","units":3,"cost_micro":1500,"charged":false,
 "progress":null,"result":null, ...}

GET /v1/tasks/{task_id}?wait=0..60

While running, progress is {"pages_done": 1, "pages_total": 3}. Pages are fetched one by one at a paced rate: a top-100 can take 10–15 minutes. When done, cost_micro is what was charged (pages actually fetched) and result holds the data. Results stay available for 30 days.

{
  "status": "done", "units": 3, "cost_micro": 1000, "charged": true,
  "result": {
    "schema_version": "1",
    "keyword": "emergency plumber", "gl": "GB", "hl": "en",
    "location": "Manchester,England,United Kingdom", "device": "desktop",
    "pages_requested": 3, "pages_fetched": 2,
    "stop_reason": "end_of_results",   // depth_reached | end_of_results | error
    "fetched_at": "2026-10-09T07:23:35Z",
    "items": [
      {"type": "organic", "rank_group": 1, "rank_absolute": 1, "page": 1,
       "domain": "www.britishgas.co.uk", "title": "...", "description": "...",
       "url": "https://www.britishgas.co.uk/plumbing/services.html",
       "url_resolved": true, "google_url": "https://www.google.com/goto?url=...",
       "breadcrumb": "...", "website_name": "...", "is_video": false}
    ]
  }
}
  • items[].type is an open set: today organic; new types may appear — skip the ones you do not know.
  • url is the real landing URL. Google only exposes /goto links; if one could not be resolved, url_resolved is false and url is that link.
  • Forum-style results may have an empty domain and a website_name.

Billing

One unit = one Google page of 10 results. On create we hold depth/10 pages; on success we charge the pages actually fetched and release the rest; a failed task is never charged.

GET /v1/serp/locations?q=&country=

Google Ads geotargets for the location field (autocomplete). E.g. ?q=manch&country=GB → {"items":[{"canonical_name":"Manchester,Manchester,England,United Kingdom", ...}]}. An unknown location is rejected with ERROR_BAD_PARAMETERS.

SERP errors

On create: ERROR_BAD_PARAMETERS (e.g. unknown location), ERROR_NO_SLOT_AVAILABLE (no capacity right now — retry later), ERROR_ZERO_BALANCE. A failed task has error_code captcha_unsolved, blocked, forbidden or internal; resubmitting is safe and failed tasks are free. SERP is not available on the CapSolver-compatible /createTask.