Start an asynchronous deep research job (research scope)
Plans 5 (standard) or 8 (max) sub-questions, researches each with the cited-answer pipeline (balanced or deep effort) plus arXiv abstracts for academic angles, and writes one report whose citations are checked against the collected sources. Always returns 202 with the job; read GET /api/v1/jobs/{id} until completed — result.research has outline, findings, sources, report, citationCoverage, completion, costUsd, durationMs. maxCostUsd (0.05-5, default 1) is the upstream budget, settled at the measured cost; runs are capped at 10 minutes. With billing on, the balance must cover US$0.005 + maxCostUsd × 1.5 up front (≈US$1.50 at the default, ≈US$7.50 at 5): on a US$1 balance pass maxCostUsd 0.6 or less.
Plans 5 (standard) or 8 (max) sub-questions, researches each with the cited-answer pipeline (balanced or deep effort) plus arXiv abstracts for academic angles, and writes one report whose citations are checked against the collected sources. Always returns 202 with the job; read GET /api/v1/jobs/{id} until completed — result.research has outline, findings, sources, report, citationCoverage, completion, costUsd, durationMs. maxCostUsd (0.05-5, default 1) is the upstream budget, settled at the measured cost; runs are capped at 10 minutes. With billing on, the balance must cover US$0.005 + maxCostUsd × 1.5 up front (≈US$1.50 at the default, ≈US$7.50 at 5): on a US$1 balance pass maxCostUsd 0.6 or less.
bearerAuthAuthorizationBearer <sc_live_<43 characters>>Organization API key created at /app/api. Scopes: scrape, crawl, search, research. The secret is shown once.
Idempotency-Key?stringReplays the original job instead of creating a second one when the same key and body are retried.
^[A-Za-z0-9._~-]{1,128}$length <= 128application/json- body
query*string1 <= length <= 400depth?string"standard""standard""max"language?string2 <= length <= 10country?string2 <= length <= 2maxCostUsd?number0.05 <= value <= 50.5webhook?Queued research job
application/json- response
job?replayed?booleancurl -X POST 'https://sparkcrawl.com/api/v1/research' \ -H 'Content-Type: application/json' \ -d '{ "query": "string"}'{ "job": { "id": "string", "kind": "scrape", "status": "queued", "url": "http://example.com", "createdAt": 0, "updatedAt": 0, "expiresAt": 0, "pagesCompleted": 0, "pagesFailed": 0, "pagesQueued": 0, "maxPages": 0, "upstreamCostUsd": 0, "reservedCostUsd": 0, "uncertainCostUsd": 0, "customerChargeUsd": 0, "pricingVersion": "string", "result": { "id": "string", "url": "http://example.com", "finalUrl": "http://example.com", "status": "success", "httpStatus": 0, "tierUsed": 0, "htmlSource": "response", "title": "string", "html": "string", "markdown": "string", "json": {}, "structuredJson": null, "jsonLd": [ null ], "screenshotBase64": "string", "pdfBase64": "string", "cacheHit": true, "cacheRevalidated": true, "etag": "string", "cacheControl": "string", "engine": "http", "stage": "http_direct", "verification": "passed", "attempts": [ { "id": "string", "tier": 0, "provider": "string", "proxy": "string", "status": "string", "stage": "string", "engine": "string", "durationMs": 0, "bytes": 0, "upstreamCostUsd": 0, "pricingStatus": "string" } ], "durationMs": 0, "bytes": 0, "links": [ "http://example.com" ], "upstreamCostUsd": 0, "pricingStatus": "known", "customerChargeUsd": 0, "artifacts": { "html": "string", "screenshot": "string", "pdf": "string", "json": "string" }, "error": { "code": "string", "message": "string" } } }, "replayed": true}POST/
mode=answer runs the verified pipeline (citations, completion); mode=results returns the judged SERP without synthesis; mode=fast returns Google AI Mode output via Scrappa with verified=false (third-party generated). Synchronous by default; async=1 or Prefer: respond-async returns 202 with the job. Result fields: query, mode, verified, answer, citations, sources[{id,url,title,snippet?}], completion{status,reason}, costUsd, customerChargeUsd, jobId. A search is billed as one page.
GET/
Requires PostgreSQL and an artifact store; otherwise returns 503 artifact_disabled. Local downloads require the same API authentication and expire with the artifact; optional S3 URLs are signed for 60 seconds. GET with download=1 streams local bytes.