status first, then read data (success) or error (failure).
Features
SmartScraper
Structured JSON from any URL.
Scrape
Raw HTML, cleaned markdown, or PDF, with optional stealth.
SmartBrowse
Replay clicks, typing, and pagination on real Chrome.
Base URL
All endpoints are served from a single base URL:Authentication
Every request needs your API key in theX-API-Key header. Generate one from the dashboard — keys look like wsg_live_<32 base62 chars>.
Response envelope
Every response has a top-levelstatus field. Check it first, then read data (success or queued) or error (failure).
completed
Synchronous success. Read
data, credits_used, credits_remaining.queued
Async dispatch (SmartBrowse). Read
data.run_id and poll.error
Branch on
error.code (stable). Log error.message, which can change.request_id as the X-Request-ID response header. Include it when you contact support.
Status codes
| Code | When | error.code |
|---|---|---|
200 OK | Synchronous success | n/a |
202 Accepted | Async dispatch (SmartBrowse) | n/a |
400 Bad Request | Malformed request | invalid_request |
401 Unauthorized | Missing or revoked API key | unauthorized |
402 Payment Required | Out of credits or unverified email | insufficient_credits / email_verification_required |
403 Forbidden | Authenticated but not allowed | forbidden |
404 Not Found | Resource doesn’t exist | not_found |
409 Conflict | Resource state disallows action | conflict / account_deletion_pending |
422 Unprocessable Entity | Schema validation failed | validation_failed |
429 Too Many Requests | Rate limited. Back off | rate_limited |
500 / 502 | Internal failure. Safe to retry | internal_error / service_unavailable |
Conventions
- Headers:
Content-Type: application/jsonon every request with a body.X-API-Key: wsg_live_...for auth. - Timestamps: ISO 8601 UTC, e.g.
2026-05-21T17:42:01Z. - IDs: SmartBrowse runs and recipes use opaque string IDs (~11 base62 chars, e.g.
k7Xb9dRmQ2p). Treat them as opaque — don’t parse them, sort them, or assume a fixed length. - Async results: dispatch with
POST, poll the matchingGET, or subscribe via webhooks. - Stealth mode: a per-request flag (
"stealth": true) on the endpoints that support it. See Stealth mode.
OpenAPI spec
The full spec lives at/openapi.yaml. Drop it into Postman, OpenAPI Generator, or anything else that speaks OpenAPI 3.1.