ScrapeField

Reference

Documentation

Eighteen endpoints over four platforms, each returning that platform’s data in its own documented shape, and one credit table. Every page here is generated from the same definition the API runs on, so it cannot be out of date.

Start here

Every read is a GET with query parameters, authenticated with a bearer token. Your first call is a curl you paste into a terminal.

curl -H "Authorization: Bearer $SCRAPEFIELD_KEY" \
  "https://api.scrapefield.com/v1/tiktok/profile?username=nasa"

That is the whole of it. No SDK is required and none ever will be — if you cannot find one, plain fetch works identically.

The envelope

Every successful response has the same two keys.

{
  "data": { /* one object, or an array */ },
  "meta": {
    "request_id": "req_7f3ac1e94b2d40f8a1c6e5d2",
    "credits_charged": 3,
    "credits_remaining": 74218,
    "cached": false,
    "fetched_at": "2026-09-20T09:12:03Z",
    "next_cursor": null
  }
}
  • credits_charged is the endpoint’s published cost, and 0 for any call we failed.
  • cached says whether we fetched it or already had it — it does not change the price, but fetched_at tells you how old the answer is.
  • next_cursor is null on the last page.
  • request_id is what to quote if you email us.

Errors

Branch on code: it is stable and documented. message is written for a human and says what to do next, and it may change.

{
  "error": {
    "type": "not_found",
    "code": "profile_not_found",
    "message": "No TikTok account with that username. Usernames are case-insensitive and exclude the leading @.",
    "docs": "https://scrapefield.com/docs/errors#profile_not_found",
    "request_id": "req_7f3ac1e94b2d40f8a1c6e5d2"
  }
}

Pagination

Cursor only. Pass meta.next_cursor back as cursor. There are no offsets, because on a live surface an offset lies.

let cursor = null;
const all = [];

do {
  const url = new URL("https://api.scrapefield.com/v1/tiktok/videos");
  url.searchParams.set("username", "nasa");
  url.searchParams.set("limit", "30");
  if (cursor) url.searchParams.set("cursor", cursor);

  const res = await fetch(url, { headers: { Authorization: `Bearer ${key}` } });
  const { data, meta } = await res.json();

  all.push(...data);
  cursor = meta.next_cursor;   // null on the last page
} while (cursor);

Endpoints