honesthook

Social data API

One API for public social data from 11 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 a free key — 1,000 credits a month, no card

or get a key with just your email

Free, no card. One key per address — we store your email to attach the key to it and to warn you if something breaks.

GET /api/v1/nichos
$ curl -sS "https://honesthook.com/api/v1/nichos"
{"niches":[{"id":"ai-agents","label":"AI agents","windows_24h":24,
"last_window":"2026-09-23T15:00:00+00:00"},{"id":"devtools",
"label":"Developer tools","windows_24h":24,
"last_window":"2026-09-23T15:00:00+00:00"},{"id":"indie-saas",
"label":"Indie SaaS","windows_24h":24,
"last_window":"2026-09-23T15:00:00+00:00"}]}

No account, no key, no card. Paste it into a terminal right now — this is the real response, measured on 23 September 2026. It is the one route that answers without a key; everything below needs one.

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.

03 — Coverage

11 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

youtube

statistics.subscriberCount

rounded by the platform itself

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 711 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 · ayrshare · bright-data · data365 · ensembledata · exa · firecrawl · hikerapi · crawlbase · serpapi · zenrows · proxy-crawl · rainforestapi · scraping-dog · scraping-robot · zyte · outstand · oxylabs · phantombuster · proxycurl · scrape-do · scrapecreators · scraperapi · scrapfly · scrapingbee · socialcrawl · socialkit · sociavault · supadata · tavily · xpoz

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"