Introducing the Instagram APIRead more →

Bluesky Post Search API. Posts matching your search.

Posts by keyword, hashtag, author or link. We handle the proxies, blocks and platform changes.

Bluesky Post Search API at a glance

Returns public Bluesky posts that match your words, newest or top first, filtered by date, language, author, mention, hashtag or site. Each post has its link, publish time, full text with hashtags, mentions and full link URLs, images and video, link card, quote and reply, and exact like, reply, repost, quote and bookmark counts. Page back through the newest-first results with the cursor.

GET /v1/bluesky/search_posts

Read the API reference
  • 1 credit per page, $0.75–$1.97 per 1,000 pages
  • 22 typed fields null when unknown
  • 100 posts per page, newest first, by the time each post states, to the second
  • query is all it needs, e.g. climate change

Send one request. Get up to 100 posts back.

Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.

$ npm install socialtap
query = climate change
GET /v1/bluesky/search_postsTry in
const params = new URLSearchParams({
  query: "bitcoin",
  sort: "newest",
});
const res = await fetch(`https://socialtap.dev/v1/bluesky/search_posts?${params}`, {
  headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, page, meta } = body;
console.log(data, meta.credits_charged);
200 OK · GET https://socialtap.dev/v1/bluesky/search_postsLong arrays and strings are shortened here. Real responses are complete.Docs

One schema on 21 platforms.

The response reference lists every field, its type and when it is null. See the full schema.

  • Null means unknown

    A field Bluesky doesn't show is null, never zero or an empty string, so a real zero always means zero.

  • What it accepts

    Words to find posts by, as Bluesky's search reads them: a topic, a phrase in quotes, a #hashtag or an @handle, and a leading - leaves a word out (climate change, "coffee roaster" -bean, #atproto).

  • Write one parser

    Bluesky, TikTok, Instagram and 18 more platforms answer in these fields, so the code that reads one reads them all.

platformstring
Platform ID (tiktok, youtube, …).
idstring
Platform-native post ID (string; Instagram shortcode, Reddit with its t3_ prefix).
urlstring
Canonical post URL.
typestring
Normalized content shape. New values may be added; treat unknown values as other.
platform_typestring
The platform's own product label, lowercase (reel, short, story, live, tweet, …).
titlestring
Headline (YouTube title, Reddit title); null on caption-only platforms.
textstring
Caption, description or body as plain text.
languagestring
BCP-47 language of text, when the platform states it.

What teams build with the Bluesky Post Search API.

  • Track what people say about a brand

  • Collect posts with a hashtag or mention

  • Search one account's posts for a subject

  • Find who links to a site or page

  • Study a subject by language and date

Good to know before you build.

  • Results come from Bluesky's own search, read without a login. Bluesky's app offers search only to signed-in people, so Bluesky could close this route, and the endpoint would then answer from the web search fallback below.
  • When Bluesky's search doesn't answer, the first page comes from a public web search's index instead, with each post it finds read from Bluesky, so its fields stay full. A partial_data warning names the sort and filters it couldn't fully apply. That list holds only what the index has, often a small part of what Bluesky has and very little on rare words, non-Latin text or recent dates, in the engine's ranking rather than the order you asked for.
  • If Bluesky's other routes are down too, the posts are what the index shows of them: id names the author as the link does, type reads text, text is the index's copy and can be cut short, the time comes from the post's record key, and the warning lists the fields left null. Repeat the request later for the full answer.
  • A next_cursor continues the list it came from. If Bluesky's search stops answering partway through a walk, that page fails with a retryable error rather than continue on a different list. Start without the cursor for the fallback's list.
  • A post whose author chose to be seen only by signed-in people is left out, as everywhere on Bluesky without a login, so a page can hold fewer posts than its limit, or none, and still have a next_cursor. On some searches that is a large share of the results, above all in Japanese. Bluesky's search also hides a few posts of its own.
  • sort=newest goes by the time each post states, to the second, as Bluesky's search does, so a post imported from elsewhere or with a wrong clock can sit out of order by published_at. since and until filter by that time and then by published_at, so an imported post whose published_at lies outside them is left out.
  • When more posts share one second than a page holds, the walk goes on past that second without the rest, and that page says so with an items_omitted warning.
  • sort=popular serves one page, because Bluesky doesn't serve its Top ranking further, and the page ends with platform_limit.
  • An author, mention or tag nobody has returns an empty page, not an error, as Bluesky's search does. mentions matches posts that really link the account, and an @handle in the query is read the same way.
  • Case does not matter. The query's own site: operators are removed, and intitle:, inurl:, in: and operators like them are read as the plain words they name.

1 credit per page. Failed requests are free.

Buy credits once and spend them on any endpoint, on any platform.

SourcePrice per successful pagePer 1,000 pages
Any source1 credit$0.75–$1.97
  • Cache hits are free.
  • Credits from packs and top-ups never expire.
  • A monthly plan's credits are spent first, and what is left of them ends at each renewal.
  • Prices exclude tax: sales tax is added at checkout where it applies.
  • Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.

Questions about the Bluesky Post Search API.

More in the API reference.

Can I search by hashtag, author or link?
Yes. Send tag, author, mentions, domain or links_to, or write Bluesky's own operators (from:, mentions:, lang:, since:) in the query, which are read as those params.
How much does the Bluesky Post Search API cost?
A page of up to 100 posts costs 1 credit. Every successful page is charged, empty pages included. SocialTap credits cost $0.75–$1.97 per 1,000, depending on the plan or pack.
How do I get the next page?
Repeat the same request with cursor set to page.next_cursor from the previous response, keeping the other parameters. When page.has_more is false there are no more pages. Cursors expire after 24 hours.

Try it with your own search.

Type it in the playground, or copy the request into your code.

100free credits
  • No credit card
  • Failed requests are free
  • Works on all 218 endpoints
Start for free Read the docs