Skip to content

Instantly share code, notes, and snippets.

@pojntfx
Last active March 19, 2024 03:03
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • 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

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