honesthook

Social data API

One API for public social data from 10 platforms.

Profiles and posts, one key, one response format. We handle the rate limits, retries and platform changes so you don’t have to. Clean JSON, ready for your app or your AI agent. 1,000 free credits a month, no card.

Reads the exact field each platform publishes — and returns null when none exists, never an invented number. TikTok ships 1,600,000 and 1,585,971 for @nasa in the same payload; the rounded one comes first. Captured 2026-09-07.

GET /api/v1/instagram/profile
$ curl -H "Authorization: Bearer $HH_KEY" \
  "https://honesthook.com/api/v1/instagram/profile?handle=nasa"
{
  "success": true,
  "platform": "instagram",
  "endpoint": "instagram/profile",
  "data": {
    "author": {
      "handle": "nasa",
      "followers": 104395849,
      "following": 91,
      "posts_count": 4913,
      "verified": true
    }
  }
}

Real response, replayed from a recorded capture of instagram.com/nasa on 2026-09-07, through the same normalizer the live route uses. Live calls return today’s number.

01 — One shape, ten platforms

The same call, everywhere. You change the platform in the URL.

/v1/tiktok/profile · /v1/bluesky/profile · /v1/threads/posts — same key, same envelope, same field names. What is different underneath is ours to absorb, and these are two of the cases we absorb by name.

Threads

plain curl — field missing

268,028

Chrome TLS — field present

960,862

Same URL, same IP, two different pages. A plain curl gets 268,028 bytes without the follower field; a client that impersonates Chrome’s TLS handshake gets 960,862 characters with it. Measured 2026-09-09. It is not about the address you call from — it is about the signature of the client. That is a thing to discover, and then to keep working.

Bluesky

from a datacenter IP

0 / 5

through a residential proxy

8 / 15

Measured 2026-09-09. From a datacenter address the 403 arrives on the first call, in 190 ms — and spacing requests 0, 2, 5 and 10 seconds apart still failed all twenty. It is not rate limiting, it is the address you call from. Through a residential proxy it passes 8 times in 15, in no order you can predict. There is no Retry-After to obey and no backoff that fixes it.

Pinterest

first follower_count found

a board’s followers

ld+json · interactionStatistic.userInteractionCount

the account’s followers

Measured on pinterest.com/nasa, 2026-09-08: one profile page carries follower_count 42 times, with different values. One belongs to the account; the neighbours are boards, and a board’s count looks just as plausible. So we do not pattern-match at all — we read the ProfilePage block the page publishes as structured data.

02 — Status, including the red

When a source fails, it says so here.

Full status page →
cratesiolast capture 0 h agocollecting · 30/30 runs 24 h
devtolast capture 0 h agocollecting · 30/30 runs 24 h
githublast capture 0 h agocollecting · 30/30 runs 24 h
hackernewslast capture 0 h agocollecting · 30/30 runs 24 h
lemmylast capture 0 h agocollecting · 30/30 runs 24 h
lobsterslast capture 0 h agocollecting · 30/30 runs 24 h
npmlast capture 0 h agocollecting · 30/30 runs 24 h
vscodelast capture 0 h agocollecting · 30/30 runs 24 h
youtubelast capture 0 h agocollecting · 30/30 runs 24 h

Live from the same function /status reads, 9 sources. 4 more are switched off by decision and are not listed: a red label next to a choice is an accusation, not a state.

03 — Coverage

10 platforms. These are all of them.

Each one lists the field we resolve and return as the count. If a platform is not on this list, we do not read it. The list is the live one: it comes from the same table the OpenAPI spec is built from, so a route that is switched off disappears from both.

Bluesky

followersCount

app.bsky.actor.getProfile

GitHub

followers

user object

Instagram

follower_count

single anchor in the page

Linktree

— no follower count

no follower field exists

Mastodon

followers_count

the account's own instance

medium

socialStats.followerCount

not the rounded text

Pinterest

mainEntity.interactionStatistic.userInteractionCount

ld+json, not follower_count

soundcloud

followers_count

not followings_count

Threads

follower_count

one occurrence in 960 KB

TikTok

statsV2.followerCount

not stats, which is rounded

04 — The archive

A number you cannot compute today, only remember.

3 niches, captured every hour since 5 September 2026. The most recent window holds 742 observations, and there were 24 windows in the last 24 hours.

05 — Price

The smallest ticket in, not the cheapest credit.

Per credit we are ordinary. The difference is what it costs to find out — a key with 1,000 credits a month, issued on the page, with no card and no call.

Free

US$ 0

1,000 credits / month

No card. One key per address, renewed on the 1st.

per month

US$ 9

5,000 credits / month

US$ 1.80 per thousand credits.

per year

US$ 79

60,000 credits / year

US$ 1.32 per thousand credits.

Entry price elsewhere. Each comparison page below carries the vendor’s cheapest paid plan as listed on their own pricing page, with the date it was checked. They are not repeated here on purpose: a price copied into a second place goes stale without anyone editing it.

apify · bright-data · ensembledata · scrapecreators · socialcrawl

06 — Start

Three steps, and no card in any of them.

  1. 01

    Type your email

    No card, no call. One key per address.

  2. 02

    Copy the key

    Issued on the page, in the response. 1,000 credits a month.

  3. 03

    Send the request

    curl -H "Authorization: Bearer $HH_KEY" \
      "https://honesthook.com/api/v1/instagram/profile?handle=nasa"