1. Blog
  2. Without a browser

Fetch social data without a browser

A profile is a GET with a key. You do not open the site or solve a challenge.

Two searches show up next to each other: Instagram's rate limit, and TikTok's slider captcha. Both are what happens when a script drives the website. The website expects a person. It slows the session down, or it asks the session to solve a puzzle.

This API is the other path. You do not launch a browser, you do not store the site's cookies, and you do not solve the puzzle. You send HTTPS to api.socialscrape.dev and you get JSON for an object the product already knows how to read.

If the platform will not show that object, the endpoint says so. It does not hand the problem back as a captcha.

The key goes in x-api-key. See authentication.

A profile, as HTTP

A TikTok profile is GET /v1/tiktok/profile with handle. The recorded call:

1curl -G "https://api.socialscrape.dev/v1/tiktok/profile" \2  -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3  --data-urlencode "handle=khaby.lame"

An Instagram profile is GET /v1/instagram/profile with handle. The recorded call uses nasa.

1curl -G "https://api.socialscrape.dev/v1/instagram/profile" \2  -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3  --data-urlencode "handle=nasa"

Both return a profile: handle, name, bio, avatar_url, verified, is_private, external_url, links and stats (followers, following, posts, likes, views). Nulls are values the platform did not send.

Instagram's profile leaves stats.posts null on purpose. The reference says to use GET /v1/instagram/profile/post-count for that number. Do not treat the null as zero posts.

You did not set a user agent, a cookie jar or a puzzle token. The request is the header and the query. That is the whole client.

The limit you still have

You stop hitting the website's browser checks. Packs and plans have no rate limits here, and free accounts have a lower limit. It is per team, not per key, so more keys do not raise it. The rate limits page has the detail.

When a free account passes its limit the status is 429, the code is rate_limited, retryable is true, and credits_charged is 0. The retry-after header is the number of seconds to wait. Wait, then send the same request. Refused requests are free.

That is a different limit from Instagram's. Calling this API does not tell you Instagram's current threshold, and it does not raise it. Your code should branch on error.code, not on a captcha page you will not receive.

Cache, so you call less

max_age_days from 0 to 30 asks for a cached copy. A hit costs 0 credits, sets cached true, and sets cached_at to when the data was first fetched. These profile endpoints keep results 30 days.

Nothing is served from the cache unless you ask. The cache key is the endpoint plus its parameters. trim and raw do not split the key. A different handle does.

If you poll the same profile every minute, send max_age_days and you will not spend a credit on a fresh fetch each time. A miss still fetches and still costs a credit. See caching.

Failed requests cost 0 credits as well. not_found, invalid_params and unsupported_url are failures. Stop retrying them. upstream_blocked and rate_limited are in the errors list. Read retryable on the one you got.

What stays impossible on purpose

Gaps are documented per endpoint, and they are not a puzzle to bypass.

Instagram comments return about 14 comments and has_more false. Replies are not available. include_replies is ignored. TikTok profile videos return about 10 videos and has_more false, with likes null, because the embed page does not have them.

LinkedIn company posts stop at one block, up to 10, and the cursor stays null. A private account stays private.

region on some routes is a country code for results that vary by country. On TikTok search the reference calls it a region hint, not a proxy country. There is no parameter for a residential proxy, a TLS fingerprint or a solved captcha token.

Do not add one. The request will reject unknown parameters as invalid_params.

Batching does not dodge the team limit. A batch of up to 100 requests runs on our side and saves round trips. Each item still counts toward the minute allowance.

Cost

A successful profile is 1 credit. The signup grant is 100 credits, once, with no card, which is 100 successful reads if every one misses the cache and none fail. Packs start at $13 for 1,000 credits.

Monthly Starter is $27 for 18,000 credits. Those figures are pricing. Spend order and refunds are in credits.

Next

Build the client from the quickstart and the errors page. Profile examples: TikTok profile, Instagram profile API, how to scrape an Instagram profile. When the same handle is fetched often, caching matters more than concurrency. The feature note is free cached results.

Related

Questions

Will this solve a TikTok slider captcha for me?

No. There is no captcha parameter and no browser fingerprint to set. You request JSON. If a field is not available, the endpoint returns null or an error. It does not ask you to drag a puzzle.

Does this remove Instagram's rate limit?

It removes your browser from that conversation. This API has no rate limits on packs or plans, and free accounts have a lower limit. A 429 is free and tells you how long to wait.

Can I pass a proxy or a country and get a different Instagram?

Some endpoints accept region as a two-letter country code when the platform's own results vary by country. That is not a proxy setting. The TikTok search reference says region is TikTok's region hint, not a proxy country.

What if the account is private?

You get the fields the profile shows. Instagram sets is_private. A private TikTok video list answers private. A hidden LinkedIn profile answers upstream_blocked, the same as a refused request. There is no login parameter.