Bluesky · Guide

How to get Bluesky user posts

TL;DR
To get Bluesky user posts, sign up for a free Captapi key, then send one GET request to /v1/bluesky/user-posts with your input. You get clean JSON back in seconds for ~3 credits (0.1/result) per call — no OAuth, scraping or platform SDKs. List Bluesky user posts with full metadata per item and cursor pagination (nextCursor + hasMore).

How to get Bluesky user posts (step by step)

  1. 1

    Get a free API key

    Create a free Captapi account (100 credits, no card) and generate an API key from the dashboard.

  2. 2

    Call the Bluesky User Posts API

    Send an authenticated GET request to /v1/bluesky/user-posts with your input. No OAuth, no scraping setup.

  3. 3

    Read the JSON response

    Parse the clean JSON response. Pass cache=true for a free 24h cache hit; default is always fresh.

Code example

curl "https://api.captapi.com/v1/bluesky/user-posts?url=https%3A%2F%2Fbsky.app%2Fprofile%2Fbsky.app" \
  -H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."

What the response looks like

{
  "success": true,
  "data": {
    "handle": "jay.bsky.team",
    "totalReturned": 5,
    "nextCursor": "2026-06-26T14:25:33.024Z",
    "hasMore": true,
    "posts": [
      {
        "platform": "bluesky",
        "uri": "at://did:plc:fpruhuo22xkm5o7ttr2ktxdo/app.bsky.feed.post/3mqjnjafz2s2k",
        "url": "https://bsky.app/profile/danabra.mov/post/3mqjnjafz2s2k",
        "cid": "bafyreib46qdetrzwrcu35fqynwkiw6tscptkvlxcujk5f745jmzqox5jz4",
        "text": "i want to do a little ✨ ama about atproto ✨ in this thread. no question is too simple\n\nif you’ve been curious about atproto but don’t know much (anything?) about it, ask any question and i’ll try to explain it in my own words.\n\n(+ would love to hear from friends who aren’t very active on bsky)",
        "publishedAt": "2026-07-13T12:02:47.424Z",
        "indexedAt": "2026-07-13T12:02:47.867Z",
        "author": {
          "handle": "danabra.mov",
          "displayName": "dan",
          "did": "did:plc:fpruhuo22xkm5o7ttr2ktxdo",
          "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:fpruhuo22xkm5o7ttr2ktxdo/bafkreif43mhqajnbnl62u3ezf37g6x22nd762im54thxbil4ga46eugcga"
        },
        "engagement": {
          "likes": 340,
          "reposts": 82,
          "replies": 104,
          "quotes": 9
        },
        "embed": null
      },
      {
        "platform": "bluesky",
        "uri": "at://did:plc:xtg6uhgsy2j7k2a6qtcood2w/app.bsky.feed.post/3mqsnmkorxc2l",
        "url": "https://bsky.app/profile/karlbode.com/post/3mqsnmkorxc2l",
        "cid": "bafyreih62va7pjdlbcij4nwp55hatyr73glrjr52eocvxkxwdd72i5phea",
        "text": "meanwhile...",
        "publishedAt": "2026-07-17T01:58:36.505Z",
        "indexedAt": "2026-07-17T01:58:38.070Z",
        "author": {
          "handle": "karlbode.com",
          "displayName": "Karl Bode",
          "did": "did:plc:xtg6uhgsy2j7k2a6qtcood2w",
          "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:xtg6uhgsy2j7k2a6qtcood2w/bafkreigf276i3ejipydii2glvywuymqwj4usu5noz4rw7lirgxrtbbcibi"
        },
        "engagement": {
          "likes": 973,
          "reposts": 216,
          "replies": 41,
          "quotes": 107
        },
        "embed": {
          "type": "external",
          "url": "https://www.seattletimes.com/seattle-news/meet-jimothy-seattles-internet-famous-raccoon/?fbclid=Iwb21leATGa4ljbGNrBMZrgWV4dG4DYWVtAjExAHNydGMGYXBwX2lkDDM1MDY4NTUzMTcyOAABHnlF6kiFK1hm4n5G5_BMmAcqRVTUV6qoBX4qZCw1rworU3stQwUoZZFw3yXL_aem_eUBpvFSYXBAwVjchn5qVyA",
          "title": "Meet ‘Jimothy,’ Seattle’s internet-famous raccoon",
          "description": "The tiny beast has been spotted twice in Ballard this summer and appears to be doing well, despite a likely congenital deformity, an animal expert said.",
          "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:xtg6uhgsy2j7k2a6qtcood2w/bafkreidmxsn5szs7i4vpq7kpjbwh44kwnkwu5b2n44vjhtye4hfpqfhzxq"
        }
      },
      {
        "platform": "bluesky",
        "uri": "at://did:plc:oky5czdrnfjpqslsw2a5iclo/app.bsky.feed.post/3mqunv4oepk2y",
        "url": "https://bsky.app/profile/jay.bsky.team/post/3mqunv4oepk2y",
        "cid": "bafyreic4yrxocxxcvnya2gchfhidq46do7reuxtwjekpnbfzrnljattu5m",
        "text": "once upon a time in the land of gnomes…",
        "publishedAt": "2026-07-17T21:08:43.276Z",
        "indexedAt": "2026-07-17T21:08:48.864Z",
        "author": {
          "handle": "jay.bsky.team",
          "displayName": "Jay 🦋",
          "did": "did:plc:oky5czdrnfjpqslsw2a5iclo",
          "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreihxtnc37g7jqdcgidtkknwuswtjiijcdnc6cx4imc4oq33cnsc5da"
        },
        "engagement": {
          "likes": 178,
          "reposts": 7,
          "replies": 17,
          "quotes": 2
        },
        "embed": {
          "type": "images",
          "images": [
            {
              "url": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreigdszebo7yhsvzp43vbtzr7hxq2iyw3dkdwg6hgeeewzkrvqs3y6i",
              "alt": "collectively written gnome story on typewriter"
            }
          ]
        }
      },
      {
        "platform": "bluesky",
        "uri": "at://did:plc:oky5czdrnfjpqslsw2a5iclo/app.bsky.feed.post/3mqcwx2ddok2r",
        "url": "https://bsky.app/profile/jay.bsky.team/post/3mqcwx2ddok2r",
        "cid": "bafyreifhr757k3xlszwuo7dihhpbporh42nrzwaiiywqn77n3h4ytnspma",
        "text": "I’m thrilled Toni is staying to lead us into this next chapter. He’s spent the past four months proving it, leading with curiosity and courage. Welcome (again) Toni!",
        "publishedAt": "2026-07-10T20:02:56.314Z",
        "indexedAt": "2026-07-10T20:02:56.964Z",
        "author": {
          "handle": "jay.bsky.team",
          "displayName": "Jay 🦋",
          "did": "did:plc:oky5czdrnfjpqslsw2a5iclo",
          "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreihxtnc37g7jqdcgidtkknwuswtjiijcdnc6cx4imc4oq33cnsc5da"
        },
        "engagement": {
          "likes": 335,
          "reposts": 23,
          "replies": 17,
          "quotes": 2
        },
        "embed": {
          "type": "app.bsky.embed.record#view"
        }
      },
      {
        "platform": "bluesky",
        "uri": "at://did:plc:oky5czdrnfjpqslsw2a5iclo/app.bsky.feed.post/3mp75kuens22h",
        "url": "https://bsky.app/profile/jay.bsky.team/post/3mp75kuens22h",
        "cid": "bafyreiheoivsjwscc5duma6373lcrwycerg4mzcjpvgopozhipayaib5qy",
        "text": "It really is. I hear Baltic reserve is a real thing, but the people I met were wonderfully warm and welcoming",
        "publishedAt": "2026-06-26T14:25:33.024Z",
        "indexedAt": "2026-06-26T14:25:34.266Z",
        "author": {
          "handle": "jay.bsky.team",
          "displayName": "Jay 🦋",
          "did": "did:plc:oky5czdrnfjpqslsw2a5iclo",
          "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:oky5czdrnfjpqslsw2a5iclo/bafkreihxtnc37g7jqdcgidtkknwuswtjiijcdnc6cx4imc4oq33cnsc5da"
        },
        "engagement": {
          "likes": 13,
          "reposts": 0,
          "replies": 1,
          "quotes": 0
        },
        "embed": null
      }
    ]
  }
}

Billing metadata (credits charged, cache hit/miss) is returned in the X-Captapi-Credits and X-Captapi-Cache response headers.

Request parameters

NameTypeRequiredDescription
urlstring YesBluesky profile URL, @handle, or handle. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble.
limitintegerNoMax items to return (default 25, max 100). Billed per result.
cursorstringNoPagination cursor. Leave empty for the first page; then pass the nextCursor value returned in the previous response.
cachebooleanNoSet true to serve from the 24h response cache. Default false — always fetch fresh data.

Frequently asked questions

What does the Bluesky User Posts API do?

The Bluesky User Posts API lets you list items in bulk with metadata from a public Bluesky post using one GET request to /v1/bluesky/user-posts. It returns clean JSON — no OAuth or infrastructure setup required.

How many credits does the Bluesky User Posts API cost?

At the default limit this endpoint costs 3 credits (0.1 per result). Billing scales with how many results you request. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh. Failed or empty results are never charged.

Do I need a Bluesky API key or OAuth?

No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.

Is the Bluesky User Posts API suitable for production use?

Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh. Use it for analytics, monitoring, and content automation.

Ready to get Bluesky user posts?

Start free with 100 credits — no credit card required.

Get your free API key