@atproto/xrpc package is a low-level TypeScript client library for making XRPC (Cross-organizational RPC) calls to AT Protocol services. It handles request/response encoding, Lexicon validation, and error handling.
Installation
Overview
XRPC is the RPC protocol used by AT Protocol. It defines how clients and servers communicate over HTTP, with schema validation powered by Lexicons. Key features:- Schema-based request/response validation
- Automatic encoding/decoding of request bodies
- Built-in error handling
- Support for custom fetch handlers
- Type-safe method calls
Most applications should use @atproto/api which provides a higher-level interface. Use
@atproto/xrpc directly when you need low-level control or are working with custom Lexicons.Quick Start
XrpcClient
The main class for making XRPC calls.Constructor
FetchHandler | FetchHandlerObject | FetchHandlerOptions
required
Fetch handler configuration. Can be:
- A string URL (base service URL)
- A custom fetch function
- An object with
serviceURL and optionalfetchfunction - A
FetchHandlerfunction
Lexicons | Iterable<LexiconDoc>
required
Lexicon definitions for schema validation. Can be:
- A
Lexiconsinstance - An array of
LexiconDocobjects
Simple URL Constructor
Custom Fetch Constructor
Object Constructor
Making XRPC Calls
call Method
string
required
The NSID (Namespaced Identifier) of the method to call (e.g.,
com.atproto.repo.getRecord)QueryParams
Query parameters for the request
unknown
Request body data (for procedures)
CallOptions
Additional options:
encoding- Content-Type for the request bodysignal- AbortSignal for request cancellationheaders- Additional headers
Query Example
Procedure Example
Header Management
Setting Headers
(key: string, value: string | (() => string | null)) => void
Set a header that will be included in all requests. The value can be a string or a function that returns a string or null.
Removing Headers
(key: string) => void
Remove a previously set header
Clearing All Headers
() => void
Remove all custom headers
Response Types
XRPCResponse
true
Always
true for successful responsesany
The response body, parsed according to the content type
HeadersMap
Response headers as a key-value object
Error Handling
XRPCError
All XRPC errors are instances ofXRPCError:
false
Always
false for errorsResponseType
Numeric response type enum value
string | undefined
Error code from the server (e.g.,
InvalidRequest, RateLimitExceeded)string
Error message
HeadersMap | undefined
Response headers if available
ResponseType Enum
Error Handling Example
Custom Fetch Handlers
Fetch handlers allow you to customize request behavior, add authentication, implement retries, etc.Basic Fetch Handler
Authenticated Fetch Handler
Retry Fetch Handler
Call Options
Encoding
Specify the content type for request bodies:Abort Signals
Cancel requests using AbortController:Per-Request Headers
Working with Lexicons
Lexicon Structure
A lexicon defines the schema for an XRPC method:Multiple Lexicons
Adding Lexicons at Runtime
Types
QueryParams
HeadersMap
CallOptions
Gettable
Client (Deprecated)
For backwards compatibility, the legacyClient class is still available:
Advanced Usage
Streaming Requests
For streaming request bodies (e.g., file uploads):Binary Responses
The client automatically handles different response types based on Content-Type headers:Validation Errors
When response validation fails:Best Practices
1. Reuse Client Instances
Create one client instance and reuse it:2. Handle Errors Appropriately
3. Use TypeScript
Leverage TypeScript for type safety:Related Packages
- @atproto/api - High-level AT Protocol client
- @atproto/lexicon - Lexicon schema definitions and validation
- @atproto/common-web - Shared web utilities