Riken ScraperDocs

Submit a job and wait for it

POSThttps://scraper.riken.me/v1/search
Cost: 1 credit per unit attempted (keyword or handle)LiveErrors are free

Try it

Paste your key under Authorization and send a live request to https://scraper.riken.me. The key stays in this browser tab only (session storage, cleared when the tab closes) and is sent nowhere else. A live request spends credits like any other.

POST
/v1/search

The same body as POST /v1/jobs, run ahead of queued work and held open until it finishes or the server's synchronous cap (CS_SEARCH_TIMEOUT, default 30 s) passes. Finished: 200 with the job and the first page of results. Still running: 202 with poll_url; the job is queued and paid for, so poll rather than resubmit. At most CS_SEARCH_MAX_UNITS units (default 200). priority is not settable here (400).

Headers

NameTypeRequiredDescriptionExample
x-api-keystringone of the auth headersYour API key. If both headers are sent, `x-api-key` wins.sk_...
Authorizationstringone of the auth headers`Authorization: Bearer <key>`, the same key.Bearer sk_...
Idempotency-KeystringnoAny string up to 255 characters. Makes a retry safe for 24 hours; bound to this API key and the request's parameters.profile-dagestantrainingcamp-2026-11-01

Query parameters

NameTypeRequiredDescriptionExample
limitintegernoRows per list in the finished answer.

Request Body

application/json
  1. body
kind*JobKind

tiktok.search keywords; tiktok.screen handles (profile and first videos); tiktok.walk handles (newest posts, about 24 per creator); tiktok.audience handles (US+CA audience share); instagram.search keywords; instagram.fetch handles (profile and feed).

Value in"tiktok.search""tiktok.screen""tiktok.walk""tiktok.audience""instagram.search""instagram.fetch"
keywords?array<string>

For tiktok.search and instagram.search. Trimmed, deduplicated; no control characters, no leading #.

Itemsitems <= 50000
handles?array<string>

For the other kinds. A leading @ is removed.

Itemsitems <= 50000
options?

Passed to the scraper. Validated at submit for tiktok.walk (max_videos, walk_timeout_s, min_days, early_stop), tiktok.search (region) and tiktok.audience (us_ca_share_min); other keys are passed through.

priority?integer

Lower runs first. 0 or absent takes the kind's default band. Not settable on POST /v1/search.

Range0 <= value
chunk_size?integer

Operator tuning; leave it out.

Range1 <= value <= 1000

Status codes

StatusChargedMeaning
200ChargedThe finished job with the first page of each list. Units already billed at submit.
202DependsStill running past the synchronous cap. Poll poll_url; do not resubmit.
400FreeA malformed body, parameter or cursor. Free.
401FreeMissing, unknown or revoked key. Free.
402FreeThe key cannot cover the job's hold. Micro fields are the exact integers; the credit strings are the same amounts for people. Free.
409FreeThis Idempotency-Key was already used for a different request. Free.
429FreeThe key's request rate (rate_limited) or its cap on queued plus running jobs (concurrency_limit, Retry-After 10). Free.
500FreeOur fault. Free.

Response Body

The finished job with the first page of each list. Units already billed at submit.

application/json
  1. response
id*integer
Formatint64
kind*JobKind

tiktok.search keywords; tiktok.screen handles (profile and first videos); tiktok.walk handles (newest posts, about 24 per creator); tiktok.audience handles (US+CA audience share); instagram.search keywords; instagram.fetch handles (profile and feed).

Value in"tiktok.search""tiktok.screen""tiktok.walk""tiktok.audience""instagram.search""instagram.fetch"
state*JobState
Value in"queued""running""done""failed""canceled"
priority*integer
idempotency_key?string
progress*
credits*

Money as exact micro-credit integers and as decimal strings. Never a JSON number of credits.

error?string
created_at*string
Formatdate-time
started_at?string
Formatdate-time
finished_at?string

Set once nothing is still writing to the job; export needs it.

Formatdate-time
chunks?array<>
results?

Example request

# A call can be held open up to 180 s (audience: 300 s). Set a client timeout above that.curl -X POST 'https://scraper.riken.me/v1/search' \  -H 'Idempotency-Key: profile-dagestantrainingcamp-2026-11-01' \  -H 'Content-Type: application/json' \  -d '{  "kind": "tiktok.search",  "keywords": [    "protein"  ]}'
Example Response
{  "id": 701,  "kind": "tiktok.search",  "state": "done",  "priority": 10,  "progress": {    "units_done": 1,    "units_total": 1,    "chunks": {      "queued": 0,      "running": 0,      "done": 1,      "failed": 0    },    "units_fetched": 1,    "last_progress_at": "2026-11-06T09:00:12Z"  },  "credits": {    "held_micro": 0,    "spent_micro": 1000000,    "held": "0.000000",    "spent": "1.000000"  },  "created_at": "2026-11-06T09:00:00Z",  "started_at": "2026-11-06T09:00:01Z",  "finished_at": "2026-11-06T09:00:12Z",  "results": {    "creators": [      {        "id": 42,        "platform": "tiktok",        "handle": "example.creator",        "followers": 120000,        "first_seen": "2026-09-18T10:00:00Z",        "last_seen": "2026-11-06T09:00:12Z"      }    ],    "media": [      {        "external_id": "7334621391758642478",        "creator_handle": "example.creator",        "caption": "leg day #gym",        "plays": 141567,        "posted_at": "2024-02-13T16:00:00Z",        "keyword": "protein",        "region": "US"      }    ],    "units": [      {        "unit": "protein",        "outcome": "answered",        "region": "US",        "tries": 1,        "billed": true      }    ]  }}