Social — entry 004 of 38
Bluesky
Bluesky is the decentralized social network built on the AT Protocol, where posts, follows, and identity live on portable Personal Data Servers instead of one company's database. Its public AppView at public.api.bsky.app exposes keyless, read-only XRPC methods such as app.bsky.actor.getProfile and app.bsky.feed.getAuthorFeed, so any client can pull public profiles and feeds without registering an app. Posting, following, or reading a signed-in user's private data instead requires an authenticated session against a Personal Data Server via an app password or OAuth, not a single global API key.
Bluesky's public AppView, public.api.bsky.app, exposes a partial keyless slice of its XRPC surface: profile, author-feed, thread, and follower lookups answer with no credentials at all, while others (timeline, search) require auth or are blocked outright. A live GET this run against app.bsky.actor.getProfile?actor=bsky.app returned genuine profile JSON for Bluesky's own account with no key of any kind.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required for the keyless subset — a live GET this run confirmed
getProfile,getAuthorFeed,getPostThread,getFollowers, andresolveHandleall return 200 with zero credentials. Posting, following, or reading a signed-in user's private data instead needs an authenticated session against a Personal Data Server (app password or OAuth), which this keyless quickstart does not cover.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Endpoints
app.bsky.actor7
GET/xrpc/app.bsky.actor.getPreferences
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.actor.getProfile
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | app.bsky.actor.defs.profileViewDetailed |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.actor.getProfiles
| Name | In | Required | Type |
|---|---|---|---|
actors | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.actor.getSuggestions
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.actor.putPreferences
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.actor.searchActors
| Name | In | Required | Type |
|---|---|---|---|
q | query | no | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.actor.searchActorsTypeahead
| Name | In | Required | Type |
|---|---|---|---|
q | query | no | string |
limit | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.ageassurance3
POST/xrpc/app.bsky.ageassurance.begin
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | app.bsky.ageassurance.defs.state |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.ageassurance.getConfig
| Status | Description | Schema |
|---|---|---|
200 | OK | app.bsky.ageassurance.defs.config |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.ageassurance.getState
| Name | In | Required | Type |
|---|---|---|---|
regionCode | query | no | string |
countryCode | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.bookmark3
POST/xrpc/app.bsky.bookmark.createBookmark
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.bookmark.deleteBookmark
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.bookmark.getBookmarks
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.contact8
POST/xrpc/app.bsky.contact.dismissMatch
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.contact.getMatches
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.contact.getSyncStatus
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.contact.importContacts
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.contact.removeData
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.contact.sendNotification
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.contact.startPhoneVerification
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.contact.verifyPhone
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.draft4
POST/xrpc/app.bsky.draft.createDraft
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.draft.deleteDraft
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.draft.getDrafts
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.draft.updateDraft
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.feed18
GET/xrpc/app.bsky.feed.describeFeedGenerator
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getActorFeeds
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getActorLikes
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getAuthorFeed
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
filter | query | no | string |
includePins | query | no | boolean |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getFeed
| Name | In | Required | Type |
|---|---|---|---|
feed | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getFeedGenerator
| Name | In | Required | Type |
|---|---|---|---|
feed | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getFeedGenerators
| Name | In | Required | Type |
|---|---|---|---|
feeds | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getFeedSkeleton
| Name | In | Required | Type |
|---|---|---|---|
feed | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getLikes
| Name | In | Required | Type |
|---|---|---|---|
cid | query | no | string |
uri | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getListFeed
| Name | In | Required | Type |
|---|---|---|---|
list | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getPostThread
| Name | In | Required | Type |
|---|---|---|---|
uri | query | yes | string |
depth | query | no | integer |
parentHeight | query | no | integer |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getPosts
| Name | In | Required | Type |
|---|---|---|---|
uris | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getQuotes
| Name | In | Required | Type |
|---|---|---|---|
cid | query | no | string |
uri | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getRepostedBy
| Name | In | Required | Type |
|---|---|---|---|
cid | query | no | string |
uri | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getSuggestedFeeds
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.getTimeline
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
algorithm | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.feed.searchPosts
| Name | In | Required | Type |
|---|---|---|---|
q | query | yes | string |
tag | query | no | array |
url | query | no | string |
lang | query | no | string |
sort | query | no | string |
limit | query | no | integer |
since | query | no | string |
until | query | no | string |
author | query | no | string |
cursor | query | no | string |
domain | query | no | string |
mentions | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.feed.sendInteractions
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.graph23
GET/xrpc/app.bsky.graph.getActorStarterPacks
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getBlocks
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getFollowers
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getFollows
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getKnownFollowers
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getList
| Name | In | Required | Type |
|---|---|---|---|
list | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getListBlocks
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getListMutes
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getLists
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
purposes | query | no | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getListsWithMembership
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
purposes | query | no | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getMutes
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getRelationships
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
others | query | no | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getStarterPack
| Name | In | Required | Type |
|---|---|---|---|
starterPack | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getStarterPacks
| Name | In | Required | Type |
|---|---|---|---|
uris | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getStarterPacksWithMembership
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.getSuggestedFollowsByActor
| Name | In | Required | Type |
|---|---|---|---|
actor | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.muteActor
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.muteActorList
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.muteThread
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.graph.searchStarterPacks
| Name | In | Required | Type |
|---|---|---|---|
q | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.unmuteActor
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.unmuteActorList
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.graph.unmuteThread
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.labeler1
GET/xrpc/app.bsky.labeler.getServices
| Name | In | Required | Type |
|---|---|---|---|
dids | query | yes | array |
detailed | query | no | boolean |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.notification10
GET/xrpc/app.bsky.notification.getPreferences
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.notification.getUnreadCount
| Name | In | Required | Type |
|---|---|---|---|
seenAt | query | no | string |
priority | query | no | boolean |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.notification.listActivitySubscriptions
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.notification.listNotifications
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
seenAt | query | no | string |
reasons | query | no | array |
priority | query | no | boolean |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.putActivitySubscription
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.putPreferences
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.putPreferencesV2
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.registerPush
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.unregisterPush
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.notification.updateSeen
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
app.bsky.video3
GET/xrpc/app.bsky.video.getJobStatus
| Name | In | Required | Type |
|---|---|---|---|
jobId | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/app.bsky.video.getUploadLimits
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/app.bsky.video.uploadVideo
video/mp4 (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.admin15
POST/xrpc/com.atproto.admin.deleteAccount
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.disableAccountInvites
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.disableInviteCodes
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.enableAccountInvites
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.admin.getAccountInfo
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | com.atproto.admin.defs.accountView |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.admin.getAccountInfos
| Name | In | Required | Type |
|---|---|---|---|
dids | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.admin.getInviteCodes
| Name | In | Required | Type |
|---|---|---|---|
sort | query | no | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.admin.getSubjectStatus
| Name | In | Required | Type |
|---|---|---|---|
did | query | no | string |
uri | query | no | string |
blob | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.admin.searchAccounts
| Name | In | Required | Type |
|---|---|---|---|
email | query | no | string |
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.sendEmail
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.updateAccountEmail
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.updateAccountHandle
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.updateAccountPassword
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.updateAccountSigningKey
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.admin.updateSubjectStatus
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.identity7
GET/xrpc/com.atproto.identity.getRecommendedDidCredentials
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.identity.refreshIdentity
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | com.atproto.identity.defs.identityInfo |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.identity.requestPlcOperationSignature
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.identity.resolveHandle
| Name | In | Required | Type |
|---|---|---|---|
handle | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.identity.signPlcOperation
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.identity.submitPlcOperation
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.identity.updateHandle
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.label1
GET/xrpc/com.atproto.label.queryLabels
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
sources | query | no | array |
uriPatterns | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.moderation1
POST/xrpc/com.atproto.moderation.createReport
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.repo10
POST/xrpc/com.atproto.repo.applyWrites
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.repo.createRecord
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.repo.deleteRecord
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.repo.describeRepo
| Name | In | Required | Type |
|---|---|---|---|
repo | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.repo.getRecord
| Name | In | Required | Type |
|---|---|---|---|
cid | query | no | string |
repo | query | yes | string |
rkey | query | yes | string |
collection | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.repo.importRepo
application/vnd.ipld.car (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.repo.listMissingBlobs
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.repo.listRecords
| Name | In | Required | Type |
|---|---|---|---|
repo | query | yes | string |
limit | query | no | integer |
cursor | query | no | string |
reverse | query | no | boolean |
collection | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.repo.putRecord
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.repo.uploadBlob
*/* (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.server25
POST/xrpc/com.atproto.server.activateAccount
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.checkAccountStatus
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.confirmEmail
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.createAccount
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.createAppPassword
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | com.atproto.server.createAppPassword.appPassword |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.createInviteCode
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.createInviteCodes
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.createSession
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.deactivateAccount
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.deleteAccount
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.deleteSession
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.describeServer
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.getAccountInviteCodes
| Name | In | Required | Type |
|---|---|---|---|
includeUsed | query | no | boolean |
createAvailable | query | no | boolean |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.getServiceAuth
| Name | In | Required | Type |
|---|---|---|---|
aud | query | yes | string |
exp | query | no | integer |
lxm | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.getSession
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.server.listAppPasswords
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.refreshSession
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.requestAccountDelete
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.requestEmailConfirmation
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.requestEmailUpdate
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.requestPasswordReset
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.reserveSigningKey
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.resetPassword
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.revokeAppPassword
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.server.updateEmail
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
com.atproto.sync13
GET/xrpc/com.atproto.sync.getBlob
| Name | In | Required | Type |
|---|---|---|---|
cid | query | yes | string |
did | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getBlocks
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
cids | query | yes | array |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getHostStatus
| Name | In | Required | Type |
|---|---|---|---|
hostname | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getLatestCommit
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getRecord
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
rkey | query | yes | string |
collection | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getRepo
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
since | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.getRepoStatus
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.listBlobs
| Name | In | Required | Type |
|---|---|---|---|
did | query | yes | string |
limit | query | no | integer |
since | query | no | string |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.listHosts
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.listRepos
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
GET/xrpc/com.atproto.sync.listReposByCollection
| Name | In | Required | Type |
|---|---|---|---|
limit | query | no | integer |
cursor | query | no | string |
collection | query | yes | string |
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.sync.notifyOfUpdate
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
POST/xrpc/com.atproto.sync.requestCrawl
application/json (required)
| Status | Description | Schema |
|---|---|---|
200 | OK | — |
400 | Bad Request | — |
401 | Unauthorized | — |
Try it
Developer reference
https://public.api.bsky.app/xrpc3,000 requests per 5 minutes per IP overall; content-creation additionally capped at 5,000 points/hour and 35,000 points/day per account
- GET/xrpc/app.bsky.actor.getProfile
- GET/xrpc/app.bsky.feed.getAuthorFeed
- GET/xrpc/app.bsky.feed.getPostThread
Gotchas & limits
app.bsky.feed.searchPosts— deliberately left out of this API'sheroEndpointsfor exactly this reason — returns HTTP 403 with an HTML error page, not XRPC JSON: a live GET this run against?q=testreturnedcontent-type: text/htmland a body opening<html><head><title>403 Forbidden</title>...(a CDN edge block page). A client that assumes every XRPC failure is parseable JSON breaks here.app.bsky.feed.getTimelinerequires an authenticated session and is not keyless — a live GET this run returnedHTTP 401with genuine XRPC JSON{"error":"AuthMissing","message":"Authentication Required"}. Contrast withsearchPosts's HTML 403 above: two different failure shapes for two different kinds of "you can't do this here".- Errors are not RESTful: an unknown handle is 400, not 404 — a live GET this run against
getProfile?actor=a nonexistent handle returnedHTTP 400{"error":"InvalidRequest","message":"Profile not found"}. A missing required param is also 400 and names the key: a live GET with noactorat all returned{"error":"InvalidRequest","message":"Invalid app.bsky.actor.getProfile params: Missing required key \"actor\""}. limitover the max is a 400 that names the ceiling — a live GET this run againstgetAuthorFeed?actor=bsky.app&limit=101returnedHTTP 400{"error":"InvalidRequest","message":"Invalid app.bsky.feed.getAuthorFeed params: integer too big (maximum 100, got 101)"}.getAuthorFeeditems are not all authored by the requested actor — a live GET this run againstgetAuthorFeed?actor=bsky.appreturned a first feed item whosepost.author.handlewasparetooptimizer.bsky.social, notbsky.app, carrying a siblingreason.$type: "app.bsky.feed.defs#reasonRepost". Readingfeed[].post.authoras "the requested actor" is wrong wheneverreasonis present — it means a repost.- An unimplemented XRPC method returns HTTP 501
{"error":"MethodNotImplemented","message":"Method Not Implemented"}— a live GET this run against a made-up method name confirmed it, distinct from the 400s above (bad params) and the 403/401s above (blocked/unauthenticated).
Availability
Changelog
- gained an OpenAPI spec