AppView API
Public XRPC queries and procedures for the Standard Reader indexed read-model.
Overview
Standard Reader exposes an AT Proto AppView at https://standard-reader.app/xrpc. Public directory and feed queries read the Neon index; personal state lives in each reader's PDS as app.standard-reader.* repo records.
Prefer a typed client? The whole API ships as codegen'd AT Protocol lexicon schemas in @standard-reader/lexicons. Pair it with @atproto/lex-client for fully-typed client.call() queries and procedures.
Service discovery
Service DID is did:web:standard-reader.app. The service advertises a DID document and an OAuth protected resource descriptor for clients that negotiate scopes.
Authentication
Public reads need no token. Authenticated reads and writes accept standard AT Proto credentials: call your PDS with atproto-proxy: did:web:standard-reader.app#standard_reader_appview (recommended), or call the AppView directly with Authorization: DPoP plus a DPoP proof. Token validity is checked via com.atproto.server.getSession on the issuer PDS; a token that cannot call getSession — an OAuth grant scoped only to rpc:<method>?aud=did:web:standard-reader.app#standard_reader_appview — is instead verified against the issuer's published keys, including its DPoP binding, and accepted for the methods that scope names.
The proxy header is best for reads. It cannot serve writes: the service JWT your PDS mints tells us who you are but carries no credential to write to your repo with, so write procedures reject it. The same is true of a DPoP-bound token presented directly — we cannot replay it at your PDS. For writes, either call the AppView directly with an app-password session, or skip the AppView and write the app.standard-reader.* record to your own repo — the firehose mirrors it here within seconds.
Reader state endpoints also accept an optional did query param to read a reader's public indexed state without auth.
MCP server
This API is also served as a Model Context Protocol server at https://standard-reader.app/mcp. Paste that URL into an MCP client and authorize it; the fifty-odd methods above are grouped into fifteen tools, and the client can read the network and act on your behalf.
It is an OAuth 2.1 protected resource: an unauthenticated request answers 401 with a resource metadata pointer, clients register themselves dynamically, and PKCE is required. Two scopes: mcp:read and mcp:write.
Public queries
no auth · 9 endpointsMatch a web page URL to an indexed standard.site article or publication.
| Param | Type |
|---|---|
| url | uri |
| urls | uri[] |
| did | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.resolveUrl?url=https%3A%2F%2Fblog.atmosphere.community'
Click Run example to fetch a live response.
Resolve an AT Proto handle, domain, or DID to publication previews.
| Param | Type |
|---|---|
| handle* | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.resolveHandle?handle=rockstar.l7y.media'
Click Run example to fetch a live response.
Full-text search over indexed publications.
| Param | Type |
|---|---|
| q* | string |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.searchPublications?q=reader&limit=5'
Click Run example to fetch a live response.
Full-text search over indexed articles.
| Param | Type |
|---|---|
| q* | string |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.searchDocuments?q=reader&limit=5'
Click Run example to fetch a live response.
Fetch a single publication profile with owner identity and aggregate stats.
| Param | Type |
|---|---|
| publication* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublication?publication=at%3A%2F%2Fdid%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq%2Fsite.standard.publication%2F3mjnpilwnrp2v'
Click Run example to fetch a live response.
Fetch a single article: card metadata, aggregate stats, and the renderable body (content) ready for the renderers.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocument?document=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Page through a single publication's articles, newest first, with cursor pagination.
| Param | Type |
|---|---|
| publication* | at-uri |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublicationDocuments?publication=at%3A%2F%2Fdid%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq%2Fsite.standard.publication%2F3mjnpilwnrp2v&limit=5'
Click Run example to fetch a live response.
Readers subscribed to a publication, most recently subscribed first, with cursor pagination.
| Param | Type |
|---|---|
| publication* | at-uri |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublicationSubscribers?publication=at%3A%2F%2Fdid%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq%2Fsite.standard.publication%2F3mjnpilwnrp2v&limit=10'
Click Run example to fetch a live response.
Browse the publication directory with topic filter, sort, and cursor pagination.
| Param | Type |
|---|---|
| topic | string |
| sort | string |
| limit | integer |
| cursor | string |
| q | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublications?limit=6&sort=readers'
Click Run example to fetch a live response.
Directory & feeds
no auth · 12 endpointsChronological feed of indexed articles with optional filter.
| Param | Type |
|---|---|
| filter | string |
| limit | integer |
| cursor | string |
| did | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLatestFeed?filter=all&limit=5'
Click Run example to fetch a live response.
Ranked list of trending discover-eligible publications.
| Param | Type |
|---|---|
| limit | integer |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTrendingPublications?limit=6'
Click Run example to fetch a live response.
Ranked list of trending articles across the network.
| Param | Type |
|---|---|
| limit | integer |
| scope | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTrendingDocuments?limit=6'
Click Run example to fetch a live response.
Articles or publications carrying a given tag.
| Param | Type |
|---|---|
| tag* | string |
| view | string |
| sort | string |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTagFeed?tag=PC%E3%83%BB%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8&view=articles&limit=5'
Click Run example to fetch a live response.
Author profile for a DID with aggregate stats and a first page of their publications.
| Param | Type |
|---|---|
| did* | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthor?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq'
Click Run example to fetch a live response.
Publications owned by a DID with cursor pagination.
| Param | Type |
|---|---|
| did* | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthorPublications?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Every article a DID has a byline on — their own posts plus documents they are credited on elsewhere (featured in) — newest first, with cursor pagination.
| Param | Type |
|---|---|
| did* | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthorPosts?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Publications a DID subscribes to, most recently subscribed first, with cursor pagination.
| Param | Type |
|---|---|
| did* | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserSubscriptions?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Public metadata and member publications for an app.standard-reader.list AT-URI.
| Param | Type |
|---|---|
| list* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getList?list=at%3A%2F%2Fdid%3Aplc%3Aexample%2Fapp.standard-reader.list%2Fabc'
Set API_DOCS_FIXTURE_LIST_URI to run this example.
Chronological article feed across all publications in a list.
| Param | Type |
|---|---|
| list* | at-uri |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getListFeed?list=at%3A%2F%2Fdid%3Aplc%3Aexample%2Fapp.standard-reader.list%2Fabc&limit=5'
Set API_DOCS_FIXTURE_LIST_URI to run this example.
Every publication list authored by a DID, each with its member publications resolved.
| Param | Type |
|---|---|
| did* | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserLists?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq'
Click Run example to fetch a live response.
Deferred reading-view context: related articles, recents, social proof.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocumentContext?document=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Personalized feeds
auth · 3 endpointsSigned-in home page critical path: featured lead and latest rows.
| Param | Type |
|---|---|
| scope | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getHomeFeed?scope=subscriptions'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Personalized publication recommendations for the authenticated user.
| Param | Type |
|---|---|
| limit | integer |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getRecommendedPublications?limit=6'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Publications followed by Bluesky accounts the caller follows.
| Param | Type |
|---|---|
| limit | integer |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getFollowedByPeopleYouFollow?limit=6'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Reader state
auth · or did · 11 endpointsWhether the subject reader subscribes to a publication.
| Param | Type |
|---|---|
| did | did |
| publication* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getFollowStatus?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&publication=at%3A%2F%2Fdid%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq%2Fsite.standard.publication%2F3mjnpilwnrp2v'
Click Run example to fetch a live response.
Whether the subject reader follows a user.
| Param | Type |
|---|---|
| did | did |
| subject* | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserFollowStatus?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&subject=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq'
Click Run example to fetch a live response.
Whether the subject reader has read a document.
| Param | Type |
|---|---|
| did | did |
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getReadStatus?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&document=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Whether the subject reader bookmarked a document.
| Param | Type |
|---|---|
| did | did |
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getBookmarkStatus?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&document=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Whether the subject reader liked a document.
| Param | Type |
|---|---|
| did | did |
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getRecommendStatus?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&document=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Subject reader save queue with hydrated document rows.
| Param | Type |
|---|---|
| did | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getSaved?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Subject reader reading history.
| Param | Type |
|---|---|
| did | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getReadingHistory?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Subject reader liked articles.
| Param | Type |
|---|---|
| did | did |
| limit | integer |
| cursor | string |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLikes?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq&limit=5'
Click Run example to fetch a live response.
Resolve one labeler by DID or handle, with the calling reader's subscription state.
| Param | Type |
|---|---|
| actor* | at-identifier |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLabeler?actor=did%3Aplc%3Aar7c4by46qjdydhdevvrndac'
Click Run example to fetch a live response.
Labelers the calling reader is subscribed to, each resolved to a labeler view.
| Param | Type |
|---|---|
| did | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLabelers?did=did%3Aplc%3Alehcqqkwzcwvjvw66uthu5oq'
Click Run example to fetch a live response.
Labels on a set of subjects, from the calling reader's subscribed labelers.
| Param | Type |
|---|---|
| uris* | at-uri[] |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLabels?uris=at%3A%2F%2Fdid%3Aplc%3Asehyb53f4mosh6mnncdsepvl%2Fsite.standard.document%2F3mves2woag4f2'
Click Run example to fetch a live response.
Write procedures
auth · 19 endpointsSubscribe to a site.standard.publication.
| Param | Type |
|---|---|
| publication* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.followPublication' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3mjnpilwnrp2v"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Remove a publication subscription.
| Param | Type |
|---|---|
| publication* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unfollowPublication' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3mjnpilwnrp2v"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Follow another user by DID.
| Param | Type |
|---|---|
| did* | did |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.followUser' -H 'Content-Type: application/json' -d '{"did":"did:plc:example-author"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Unfollow a user by DID.
| Param | Type |
|---|---|
| did* | did |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unfollowUser' -H 'Content-Type: application/json' -d '{"did":"did:plc:example-author"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Recommend an article on the network.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.recommendDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Remove your recommendation from an article on the network.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unrecommendDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Mark an article as read.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markRead' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Mark an article as unread.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markUnread' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Save an article for later.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.bookmarkDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Remove an article from the save queue.
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unbookmarkDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:sehyb53f4mosh6mnncdsepvl/site.standard.document/3mves2woag4f2"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Add another reader publication list to this app.
| Param | Type |
|---|---|
| list* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.saveList' -H 'Content-Type: application/json' -d '{"list":"at://did:plc:example/app.standard-reader.list/abc"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Remove a saved list from this app.
| Param | Type |
|---|---|
| list* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unsaveList' -H 'Content-Type: application/json' -d '{"list":"at://did:plc:example/app.standard-reader.list/abc"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Subscribe the calling reader to a labeler service.
| Param | Type |
|---|---|
| labeler* | did |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.subscribeLabeler' -H 'Content-Type: application/json' -d '{"labeler":"did:plc:ar7c4by46qjdydhdevvrndac"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Unsubscribe the calling reader from a labeler service.
| Param | Type |
|---|---|
| labeler* | did |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unsubscribeLabeler' -H 'Content-Type: application/json' -d '{"labeler":"did:plc:ar7c4by46qjdydhdevvrndac"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Mark all unread articles in the effective follow set as read.
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markAllRead' -H 'Content-Type: application/json' -d '{}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Mark all unread articles from one publication as read.
| Param | Type |
|---|---|
| publication* | at-uri |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markPublicationAllRead' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3mjnpilwnrp2v"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Create a new publication list.
| Param | Type |
|---|---|
| name* | string |
| description | string |
| publications* | at-uri[] |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.createList' -H 'Content-Type: application/json' -d '{"name":"Example list","publications":["at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3mjnpilwnrp2v"]}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Replace an existing publication list owned by the actor.
| Param | Type |
|---|---|
| rkey* | string |
| name* | string |
| publications* | at-uri[] |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.updateList' -H 'Content-Type: application/json' -d '{"rkey":"abc","name":"Updated list","publications":["at://did:plc:lehcqqkwzcwvjvw66uthu5oq/site.standard.publication/3mjnpilwnrp2v"]}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).
Delete a publication list owned by the actor.
| Param | Type |
|---|---|
| rkey* | string |
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.deleteList' -H 'Content-Type: application/json' -d '{"rkey":"abc"}'
Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).