Skip to content

Instantly share code, notes, and snippets.

@pojntfx
Last active December 18, 2024 20:39
Show Gist options
  • Save pojntfx/72403066a96593c1ba8fd5df2b531f2d to your computer and use it in GitHub Desktop.
Save pojntfx/72403066a96593c1ba8fd5df2b531f2d to your computer and use it in GitHub Desktop.
Bluesky/AT Protocol: cURL API Interaction Cheatsheet
#!/bin/bash
# This script resolves a DID, retrieves an API key, fetches a user's feed,
# and posts a "Hello, world" message to the user's feed.
# Resolve DID for handle
HANDLE='felicitas.pojtinger.com'
DID_URL="https://bsky.social/xrpc/com.atproto.identity.resolveHandle"
export DID=$(curl -G \
--data-urlencode "handle=$HANDLE" \
"$DID_URL" | jq -r .did)
# Get an app password from here: https://staging.bsky.app/settings/app-passwords
export APP_PASSWORD=myapppassword
# Get API key with the app password
API_KEY_URL='https://bsky.social/xrpc/com.atproto.server.createSession'
POST_DATA="{ \"identifier\": \"${DID}\", \"password\": \"${APP_PASSWORD}\" }"
export API_KEY=$(curl -X POST \
-H 'Content-Type: application/json' \
-d "$POST_DATA" \
"$API_KEY_URL" | jq -r .accessJwt)
# Get a user's feed
ACTOR='felicitas.pojtinger.com'
LIMIT=4
FEED_URL="https://bsky.social/xrpc/app.bsky.feed.getAuthorFeed"
curl -G \
-H "Authorization: Bearer ${API_KEY}" \
--data-urlencode "actor=$ACTOR" \
--data-urlencode "limit=$LIMIT" \
"$FEED_URL" | jq -r .feed # Or if you want to return only a user's own posts: jq '.feed | .[] | select((.post.record."$type" == "app.bsky.feed.post") and (.post.record.reply.parent? | not) and (.reason? | not)) | {text: .post.record.text, createdAt: .post.record.createdAt, replyCount: .post.replyCount, repostCount: .post.repostCount, likeCount: .post.likeCount, author: {handle: .post.author.handle, displayName: .post.author.displayName, avatar: .post.author.avatar}}'
# Post "Hello, world" to your feed
POST_FEED_URL='https://bsky.social/xrpc/com.atproto.repo.createRecord'
POST_RECORD="{ \"collection\": \"app.bsky.feed.post\", \"repo\": \"${DID}\", \"record\": { \"text\": \"Hello, world\", \"createdAt\": \"$(date +%Y-%m-%dT%H:%M:%S.%3NZ)\", \"\$type\": \"app.bsky.feed.post\" } }"
curl -X POST \
-H "Authorization: Bearer ${API_KEY}" \
-H 'Content-Type: application/json' \
-d "$POST_RECORD" \
"$POST_FEED_URL" | jq -r
@viglioni
Copy link

Thanks, your examples were very helpful :)

@St3ph-fr
Copy link

Hi

Thank you for your Gist, I used it to make this article on how to authenticate and publish a message with Google Apps Script : https://medium.com/@stephane.giron/post-and-get-messages-with-bluesky-social-api-and-google-apps-script-1cf76cd9c4cd

Stéphane

@noctrnal
Copy link

noctrnal commented Dec 1, 2024

thanks a ton for this!

@katef
Copy link

katef commented Dec 15, 2024

Thank you, this helped me too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment