Submit a job and wait for it
https://scraper.riken.me/v1/searchTry 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.
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
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
x-api-key | string | one of the auth headers | Your API key. If both headers are sent, `x-api-key` wins. | sk_... |
Authorization | string | one of the auth headers | `Authorization: Bearer <key>`, the same key. | Bearer sk_... |
Idempotency-Key | string | no | Any 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
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
limit | integer | no | Rows per list in the finished answer. |
application/json- body
kind*JobKindtiktok.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).
"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 #.
items <= 50000handles?array<string>For the other kinds. A leading @ is removed.
items <= 50000options?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?integerLower runs first. 0 or absent takes the kind's default band. Not settable on POST /v1/search.
0 <= valuechunk_size?integerOperator tuning; leave it out.
1 <= value <= 1000Status codes
| Status | Charged | Meaning |
|---|---|---|
| 200 | Charged | The finished job with the first page of each list. Units already billed at submit. |
| 202 | Depends | Still running past the synchronous cap. Poll poll_url; do not resubmit. |
| 400 | Free | A malformed body, parameter or cursor. Free. |
| 401 | Free | Missing, unknown or revoked key. Free. |
| 402 | Free | The key cannot cover the job's hold. Micro fields are the exact integers; the credit strings are the same amounts for people. Free. |
| 409 | Free | This Idempotency-Key was already used for a different request. Free. |
| 429 | Free | The key's request rate (rate_limited) or its cap on queued plus running jobs (concurrency_limit, Retry-After 10). Free. |
| 500 | Free | Our fault. Free. |
The finished job with the first page of each list. Units already billed at submit.
application/json- response
id*integerint64kind*JobKindtiktok.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).
"tiktok.search""tiktok.screen""tiktok.walk""tiktok.audience""instagram.search""instagram.fetch"state*JobState"queued""running""done""failed""canceled"priority*integeridempotency_key?stringprogress*credits*Money as exact micro-credit integers and as decimal strings. Never a JSON number of credits.
error?stringcreated_at*stringdate-timestarted_at?stringdate-timefinished_at?stringSet once nothing is still writing to the job; export needs it.
date-timechunks?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" ]}'{ "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 } ] }}