AT Protocol

The AT Protocol (atproto) is an open, federated networking protocol for social applications, originally developed by Bluesky Social PBC and the Bluesky team. It defines a decentralized architecture where user identity and data are portable across providers, anchored in DIDs, signed records, and content-addressed storage. The protocol is composed of independently operable services — Personal Data Servers (PDS), Relays (firehose aggregators), and AppViews (read-side indexers) — that communicate using XRPC and exchange records described by Lexicon schemas. Bluesky (bsky.app) is the reference application built on AT Protocol, but the protocol is designed for any social or social-adjacent application that wants user-owned identity, portable data, and an open federation model. Official and community SDKs exist for TypeScript, Go, Python, Rust, Dart, Swift, C#/.NET, Ruby, PHP, and more, and the full lexicon, network topology, and reference implementations are open source.

AT Protocol publishes 2 APIs on the APIs.io network: XRPC API and Relay & Firehose. Tagged areas include AT Protocol, atproto, Bluesky, Federation, and Decentralized Social.

The AT Protocol catalog on APIs.io includes 1 event-driven AsyncAPI specification and 1 Spectral governance ruleset.

AT Protocol’s developer surface includes authentication, documentation, engineering blog, and 11 more developer resources.

43.0/100 thin ▬ flat Agent 54/100 agent ready Full breakdown ↓
scored 2026-07-21 · rubric v0.4
6 APIs 0 Features
AT ProtocolatprotoBlueskyFederationDecentralized SocialSocial NetworkingDIDLexiconXRPCPDSRelayAppViewOpen Protocol

API Rating

API Evangelist API Evangelist Rating How this is scored →
scored 2026-07-21 · rubric v0.4
Composite quality — 43.0/100 · thin
Contract Quality 15.1 / 25
Developer Ergonomics 5.7 / 20
Commercial Clarity 5.8 / 20
Operational Transparency 3.4 / 13
Governance 6.3 / 12
Discoverability 6.8 / 10
Agent readiness — 54/100 · agent ready
Machine-Readable Contract 18 / 18
Agentic Access Contract 15 / 15
MCP Server 0 / 12
Machine-Readable Auth 10 / 10
Idempotency 0 / 9
Stable Error Semantics 0 / 8
Request/Response Examples 0 / 7
Rate-Limit Signaling 7 / 7
Typed Event Surface 6 / 6
Agent Skills 0 / 5
Well-Known Catalog 0 / 4
Consent & Bot Identity 0 / 3
Improve this rating by publishing the missing artifacts — every area above can be raised, and the full rubric is at apis.io/rating/. This rating is computed from github.com/api-evangelist/at-protocol: open an issue to ask a question, or submit a pull request to add artifacts. Want it done for you? Prioritized profiling — $2,500 →

APIs

AT Protocol XRPC API

XRPC is the AT Protocol's HTTP-based remote procedure call layer. All protocol interactions — querying records, writing records, subscribing to streams, resolving identity, mode...

AT Protocol Lexicon Schemas

Lexicon is the schema definition language for AT Protocol. Every record type, XRPC method, and event subscription on the network is described by a Lexicon document, which acts a...

Personal Data Server (PDS) API

The PDS hosts a user's repository of signed records and exposes the com.atproto.* XRPC methods for account creation, authentication, record CRUD, blob upload, and repository syn...

AT Protocol Relay & Firehose

The Relay aggregates the com.atproto.sync.subscribeRepos firehose across PDS hosts and re-broadcasts the combined event stream over WebSocket. AppViews and indexers subscribe to...

Bluesky AppView API

The Bluesky AppView indexes the firehose and exposes the app.bsky.* XRPC methods that the Bluesky client (and any compatible client) uses to render timelines, threads, profiles,...

AT Protocol Identity (DID & Handles)

Identity in AT Protocol is anchored in DIDs (did:plc or did:web), with human-readable handles resolved through DNS TXT records or well-known HTTP endpoints. The protocol specifi...

Collections

Pricing Plans

Rate Limits

At Protocol Rate Limits

2 limits

RATE LIMITS

FinOps

Event Specifications

AT Protocol Firehose & Event Streams

AsyncAPI definition for the AT Protocol event subscription surface. AT Protocol defines streaming endpoints as Lexicon "subscription" types, served over WebSocket using length-p...

ASYNCAPI

API Governance Rules

AT Protocol API Rules

6 rules · 1 errors 5 warnings

SPECTRAL

Resources

Documentation 4

Reference material describing how the API behaves

Agent Surfaces 1

MCP servers, agent skills, and machine-readable catalogs

Build 2

SDKs, sample code, and the tooling you integrate with

Access & Security 2

Authentication, authorization, and security posture

Learn 1

Tutorials, courses, talks, and written guidance

Company 3

The organization behind the API

Other 1

Properties that don't map to a standard resource type

Source (apis.yml)

apis.yml Raw ↑
opencollection: 1.0.0
info:
  name: AT Protocol XRPC API
  version: '1.0'
items:
- info:
    name: Server
    type: folder
  items:
  - info:
      name: Create a new authentication session
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.createSession
      body:
        type: json
        data: '{}'
    docs: Create a new authentication session
  - info:
      name: Refresh a session using the refresh JWT
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.refreshSession
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: Refresh a session using the refresh JWT
  - info:
      name: Terminate the current session
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.deleteSession
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: Terminate the current session
  - info:
      name: Register a new account
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.createAccount
      body:
        type: json
        data: '{}'
    docs: Register a new account
  - info:
      name: Initiate a password reset
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.requestPasswordReset
      body:
        type: json
        data: '{}'
    docs: Initiate a password reset
  - info:
      name: Complete a password reset
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.server.resetPassword
      body:
        type: json
        data: '{}'
    docs: Complete a password reset
- info:
    name: Identity
    type: folder
  items:
  - info:
      name: Resolve a handle to a DID
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/com.atproto.identity.resolveHandle
      params:
      - name: handle
        value: ''
        type: query
    docs: Resolve a handle to a DID
- info:
    name: Repo
    type: folder
  items:
  - info:
      name: Create a new record in a repository
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.repo.createRecord
      body:
        type: json
        data: '{}'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: Create a new record in a repository
  - info:
      name: Get a specific record
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/com.atproto.repo.getRecord
      params:
      - name: repo
        value: ''
        type: query
      - name: collection
        value: ''
        type: query
      - name: rkey
        value: ''
        type: query
      - name: cid
        value: ''
        type: query
    docs: Get a specific record
  - info:
      name: List records in a collection
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/com.atproto.repo.listRecords
      params:
      - name: repo
        value: ''
        type: query
      - name: collection
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
      - name: reverse
        value: ''
        type: query
    docs: List records in a collection
  - info:
      name: Upload a blob to be referenced by future records
      type: http
    http:
      method: POST
      url: https://bsky.social/xrpc/com.atproto.repo.uploadBlob
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: Upload a blob to be referenced by future records
- info:
    name: Actor
    type: folder
  items:
  - info:
      name: Get a Bluesky profile
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.actor.getProfile
      params:
      - name: actor
        value: ''
        type: query
    docs: Get a Bluesky profile
  - info:
      name: Get multiple Bluesky profiles
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.actor.getProfiles
      params:
      - name: actors
        value: ''
        type: query
    docs: Get multiple Bluesky profiles
  - info:
      name: Search for actors
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.actor.searchActors
      params:
      - name: q
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
    docs: Search for actors
- info:
    name: Feed
    type: folder
  items:
  - info:
      name: Get the authenticated user's home feed
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.feed.getTimeline
      params:
      - name: algorithm
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: Get the authenticated user's home feed
  - info:
      name: Get an actor's posts
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.feed.getAuthorFeed
      params:
      - name: actor
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
      - name: filter
        value: ''
        type: query
    docs: Get an actor's posts
  - info:
      name: Get a post and its thread
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.feed.getPostThread
      params:
      - name: uri
        value: ''
        type: query
      - name: depth
        value: ''
        type: query
      - name: parentHeight
        value: ''
        type: query
    docs: Get a post and its thread
  - info:
      name: Full-text search posts
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.feed.searchPosts
      params:
      - name: q
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
    docs: Full-text search posts
- info:
    name: Graph
    type: folder
  items:
  - info:
      name: List an actor's followers
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.graph.getFollowers
      params:
      - name: actor
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
    docs: List an actor's followers
  - info:
      name: List who an actor follows
      type: http
    http:
      method: GET
      url: https://bsky.social/xrpc/app.bsky.graph.getFollows
      params:
      - name: actor
        value: ''
        type: query
      - name: limit
        value: ''
        type: query
      - name: cursor
        value: ''
        type: query
    docs: List who an actor follows
bundled: true