# Bluesky User Posts API (https://www.socialcrawl.dev/platforms/bluesky/user-posts) > Returns a feed of posts for a Bluesky user: uri, record text, author info, embeds, replyCount, repostCount, likeCount, quoteCount, and indexedAt. Pass either `handle` or `user_id` (Bluesky calls user IDs `did`). TL;DR: `GET /v1/bluesky/user/posts` costs 1 credit per call and returns SocialCrawl's unified JSON schema. Single x-api-key auth, 100 free credits on signup. ## Parameters | Parameter | Required | Description | | --- | --- | --- | | `handle` | no | Bluesky handle. | | `user_id` | no | Bluesky `did` (Bluesky's internal user ID format, e.g. `did:plc:x7d6j54pm22ufehkes6jo4jf`). | | `since` | no | Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off each page. This list is not in date order, so the walk does not stop at the date: keep following `next_cursor`, and each page costs what a page costs even when every row on it is filtered out. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`. | | `until` | no | Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`. | ## Code example ```bash curl -G "https://www.socialcrawl.dev/v1/bluesky/user/posts" \ --data-urlencode "handle=espn.com" \ -H "x-api-key: sc_YOUR_API_KEY" ``` ## FAQ ### How do I list a Bluesky user's posts with an API? Send a GET request to /v1/bluesky/user/posts with either a handle (espn.com) or a user_id, Bluesky's DID format, like did:plc:x7d6j54pm22ufehkes6jo4jf. SocialCrawl returns the user's post feed with text, embeds, and engagement counts in one JSON response. ### What fields does the Bluesky User Posts API return? Each post includes its uri, record text, author info, embeds (images, links, quoted posts), replyCount, repostCount, likeCount, quoteCount, and indexedAt timestamp, normalized into the unified PostList schema shared across SocialCrawl platforms. ### Can I pass a DID instead of a handle? Yes. The endpoint accepts either handle or user_id. Use the DID (did:plc:...) when you track accounts long-term. DIDs are permanent identifiers that survive handle changes, so your pipeline won't break when a user renames. ### How much does the Bluesky User Posts API cost? Each request costs 1 credit on the standard tier. New accounts get 100 free credits with no credit card required, enough to pull 100 post feeds while you validate the response shape. ### Can I use this for brand monitoring or research on Bluesky? Yes. The feed returns engagement counts per post, so you can rank a brand account's content by likes or reposts, archive academic research samples, or feed social listening dashboards, without running an AT Protocol firehose consumer. See the full Bluesky API: https://www.socialcrawl.dev/platforms/bluesky ## Pricing - Standard endpoints: 1 credit per call - Advanced endpoints: 5 credits per call - Premium endpoints: 10 credits per call - 100 free credits on signup, no credit card required. Cached responses cost 0 credits. Credit packs never expire. - Full pricing: https://www.socialcrawl.dev/pricing ## Explore with AI Questions this API answers, phrased for an AI assistant: - How to list a Bluesky user's posts with the SocialCrawl API - What does the SocialCrawl Bluesky User Posts API return?