Standard ReaderDeveloper docsDocs
Developer docs

AppView API

Public XRPC queries and procedures for the Standard Reader indexed read-model.

Basehttps://standard-reader.app/xrpc·operational

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.

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 endpoints
app.standard-reader.resolveUrlqueryauth: none

Match a web page URL to an indexed standard.site article or publication.

ParamType
urluri
urlsuri[]
diddid
curl
url
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.resolveUrl?url=https%3A%2F%2Fhudexperten.se'
response

Click Run example to fetch a live response.

app.standard-reader.resolveHandlequeryauth: none

Resolve an AT Proto handle, domain, or DID to publication previews.

ParamType
handle*string
curl
publication
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.resolveHandle?handle=rockstar.l7y.media'
response

Click Run example to fetch a live response.

app.standard-reader.searchPublicationsqueryauth: none

Full-text search over indexed publications.

ParamType
q*string
limitinteger
cursorstring
curl
q
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.searchPublications?q=reader&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.searchDocumentsqueryauth: none

Full-text search over indexed articles.

ParamType
q*string
limitinteger
cursorstring
curl
q
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.searchDocuments?q=reader&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getPublicationqueryauth: none

Fetch a single publication profile with owner identity and aggregate stats.

ParamType
publication*at-uri
curl
publication
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublication?publication=at%3A%2F%2Fdid%3Aplc%3Ayivadxxkqphatoon4w3ybd5g%2Fsite.standard.publication%2F3mqwgy2nt2ca2'
response

Click Run example to fetch a live response.

app.standard-reader.getDocumentqueryauth: none

Fetch a single article: card metadata, aggregate stats, and the renderable body (content) ready for the renderers.

ParamType
document*at-uri
curl
document
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocument?document=at%3A%2F%2Fdid%3Aplc%3Agigmfatlw5oclnczr2admewg%2Fsite.standard.document%2F2v33wmbg6oogs'
response

Click Run example to fetch a live response.

app.standard-reader.getPublicationDocumentsqueryauth: none

Page through a single publication's articles, newest first, with cursor pagination.

ParamType
publication*at-uri
limitinteger
cursorstring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublicationDocuments?publication=at%3A%2F%2Fdid%3Aplc%3Ayivadxxkqphatoon4w3ybd5g%2Fsite.standard.publication%2F3mqwgy2nt2ca2&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getPublicationSubscribersqueryauth: none

Readers subscribed to a publication, most recently subscribed first, with cursor pagination.

ParamType
publication*at-uri
limitinteger
cursorstring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublicationSubscribers?publication=at%3A%2F%2Fdid%3Aplc%3Ayivadxxkqphatoon4w3ybd5g%2Fsite.standard.publication%2F3mqwgy2nt2ca2&limit=10'
response

Click Run example to fetch a live response.

app.standard-reader.getPublicationsqueryauth: none

Browse the publication directory with topic filter, sort, and cursor pagination.

ParamType
topicstring
sortstring
limitinteger
cursorstring
qstring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getPublications?limit=6&sort=readers'
response

Click Run example to fetch a live response.

Directory & feeds

no auth · 12 endpoints
app.standard-reader.getLatestFeedqueryauth: none

Chronological feed of indexed articles with optional filter.

ParamType
filterstring
limitinteger
cursorstring
diddid
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLatestFeed?filter=all&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getTrendingPublicationsqueryauth: none

Ranked list of trending discover-eligible publications.

ParamType
limitinteger
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTrendingPublications?limit=6'
response

Click Run example to fetch a live response.

app.standard-reader.getTrendingDocumentsqueryauth: none

Ranked list of trending articles across the network.

ParamType
limitinteger
scopestring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTrendingDocuments?limit=6'
response

Click Run example to fetch a live response.

app.standard-reader.getTagFeedqueryauth: none

Articles or publications carrying a given tag.

ParamType
tag*string
viewstring
sortstring
limitinteger
cursorstring
curl
tag
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getTagFeed?tag=other&view=articles&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getAuthorqueryauth: none

Author profile for a DID with aggregate stats and a first page of their publications.

ParamType
did*did
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthor?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g'
response

Click Run example to fetch a live response.

app.standard-reader.getAuthorPublicationsqueryauth: none

Publications owned by a DID with cursor pagination.

ParamType
did*did
limitinteger
cursorstring
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthorPublications?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getAuthorPostsqueryauth: none

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.

ParamType
did*did
limitinteger
cursorstring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthorPosts?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getUserSubscriptionsqueryauth: none

Publications a DID subscribes to, most recently subscribed first, with cursor pagination.

ParamType
did*did
limitinteger
cursorstring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserSubscriptions?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getListqueryauth: none

Public metadata and member publications for an app.standard-reader.list AT-URI.

ParamType
list*at-uri
curl
list
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getList?list=at%3A%2F%2Fdid%3Aplc%3Aexample%2Fapp.standard-reader.list%2Fabc'
response

Set API_DOCS_FIXTURE_LIST_URI to run this example.

app.standard-reader.getListFeedqueryauth: none

Chronological article feed across all publications in a list.

ParamType
list*at-uri
limitinteger
cursorstring
curl
list
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'
response

Set API_DOCS_FIXTURE_LIST_URI to run this example.

app.standard-reader.getUserListsqueryauth: none

Every publication list authored by a DID, each with its member publications resolved.

ParamType
did*did
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserLists?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g'
response

Click Run example to fetch a live response.

app.standard-reader.getDocumentContextqueryauth: none

Deferred reading-view context: related articles, recents, social proof.

ParamType
document*at-uri
curl
document
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocumentContext?document=at%3A%2F%2Fdid%3Aplc%3Agigmfatlw5oclnczr2admewg%2Fsite.standard.document%2F2v33wmbg6oogs'
response

Click Run example to fetch a live response.

Personalized feeds

auth · 3 endpoints
app.standard-reader.getHomeFeedqueryauth: required

Signed-in home page critical path: featured lead and latest rows.

ParamType
scopestring
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getHomeFeed?scope=subscriptions'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.getRecommendedPublicationsqueryauth: required

Personalized publication recommendations for the authenticated user.

ParamType
limitinteger
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getRecommendedPublications?limit=6'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.getFollowedByPeopleYouFollowqueryauth: required

Publications followed by Bluesky accounts the caller follows.

ParamType
limitinteger
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getFollowedByPeopleYouFollow?limit=6'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

Reader state

auth · or did · 8 endpoints
app.standard-reader.getFollowStatusqueryauth: optional · did

Whether the subject reader subscribes to a publication.

ParamType
diddid
publication*at-uri
curl
publication
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getFollowStatus?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&publication=at%3A%2F%2Fdid%3Aplc%3Ayivadxxkqphatoon4w3ybd5g%2Fsite.standard.publication%2F3mqwgy2nt2ca2'
response

Click Run example to fetch a live response.

app.standard-reader.getUserFollowStatusqueryauth: optional · did

Whether the subject reader follows a user.

ParamType
diddid
subject*did
curl
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getUserFollowStatus?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&subject=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g'
response

Click Run example to fetch a live response.

app.standard-reader.getReadStatusqueryauth: optional · did

Whether the subject reader has read a document.

ParamType
diddid
document*at-uri
curl
document
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getReadStatus?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&document=at%3A%2F%2Fdid%3Aplc%3Agigmfatlw5oclnczr2admewg%2Fsite.standard.document%2F2v33wmbg6oogs'
response

Click Run example to fetch a live response.

app.standard-reader.getBookmarkStatusqueryauth: optional · did

Whether the subject reader bookmarked a document.

ParamType
diddid
document*at-uri
curl
document
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getBookmarkStatus?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&document=at%3A%2F%2Fdid%3Aplc%3Agigmfatlw5oclnczr2admewg%2Fsite.standard.document%2F2v33wmbg6oogs'
response

Click Run example to fetch a live response.

app.standard-reader.getRecommendStatusqueryauth: optional · did

Whether the subject reader liked a document.

ParamType
diddid
document*at-uri
curl
document
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getRecommendStatus?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&document=at%3A%2F%2Fdid%3Aplc%3Agigmfatlw5oclnczr2admewg%2Fsite.standard.document%2F2v33wmbg6oogs'
response

Click Run example to fetch a live response.

app.standard-reader.getSavedqueryauth: optional · did

Subject reader save queue with hydrated document rows.

ParamType
diddid
limitinteger
cursorstring
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getSaved?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getReadingHistoryqueryauth: optional · did

Subject reader reading history.

ParamType
diddid
limitinteger
cursorstring
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getReadingHistory?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

app.standard-reader.getLikesqueryauth: optional · did

Subject reader liked articles.

ParamType
diddid
limitinteger
cursorstring
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getLikes?did=did%3Aplc%3Ayivadxxkqphatoon4w3ybd5g&limit=5'
response

Click Run example to fetch a live response.

Write procedures

auth · 17 endpoints
app.standard-reader.followPublicationprocedureauth: required

Subscribe to a site.standard.publication.

ParamType
publication*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.followPublication' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:yivadxxkqphatoon4w3ybd5g/site.standard.publication/3mqwgy2nt2ca2"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.unfollowPublicationprocedureauth: required

Remove a publication subscription.

ParamType
publication*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unfollowPublication' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:yivadxxkqphatoon4w3ybd5g/site.standard.publication/3mqwgy2nt2ca2"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.followUserprocedureauth: required

Follow another user by DID.

ParamType
did*did
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.followUser' -H 'Content-Type: application/json' -d '{"did":"did:plc:yivadxxkqphatoon4w3ybd5g"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.unfollowUserprocedureauth: required

Unfollow a user by DID.

ParamType
did*did
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unfollowUser' -H 'Content-Type: application/json' -d '{"did":"did:plc:yivadxxkqphatoon4w3ybd5g"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.recommendDocumentprocedureauth: required

Recommend an article on the network.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.recommendDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.unrecommendDocumentprocedureauth: required

Remove your recommendation from an article on the network.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unrecommendDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.markReadprocedureauth: required

Mark an article as read.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markRead' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.markUnreadprocedureauth: required

Mark an article as unread.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markUnread' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.bookmarkDocumentprocedureauth: required

Save an article for later.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.bookmarkDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.unbookmarkDocumentprocedureauth: required

Remove an article from the save queue.

ParamType
document*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.unbookmarkDocument' -H 'Content-Type: application/json' -d '{"document":"at://did:plc:gigmfatlw5oclnczr2admewg/site.standard.document/2v33wmbg6oogs"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.saveListprocedureauth: required

Add another reader publication list to this app.

ParamType
list*at-uri
curl
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"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.unsaveListprocedureauth: required

Remove a saved list from this app.

ParamType
list*at-uri
curl
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"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.markAllReadprocedureauth: required

Mark all unread articles in the effective follow set as read.

curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markAllRead' -H 'Content-Type: application/json' -d '{}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.markPublicationAllReadprocedureauth: required

Mark all unread articles from one publication as read.

ParamType
publication*at-uri
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.markPublicationAllRead' -H 'Content-Type: application/json' -d '{"publication":"at://did:plc:yivadxxkqphatoon4w3ybd5g/site.standard.publication/3mqwgy2nt2ca2"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.createListprocedureauth: required

Create a new publication list.

ParamType
name*string
descriptionstring
publications*at-uri[]
curl
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:yivadxxkqphatoon4w3ybd5g/site.standard.publication/3mqwgy2nt2ca2"]}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.updateListprocedureauth: required

Replace an existing publication list owned by the actor.

ParamType
rkey*string
name*string
publications*at-uri[]
curl
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:yivadxxkqphatoon4w3ybd5g/site.standard.publication/3mqwgy2nt2ca2"]}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).

app.standard-reader.deleteListprocedureauth: required

Delete a publication list owned by the actor.

ParamType
rkey*string
curl
curl -sS -X POST 'https://standard-reader.app/xrpc/app.standard-reader.deleteList' -H 'Content-Type: application/json' -d '{"rkey":"abc"}'
response

Sign in to run this example (curl uses Bearer $ACCESS_TOKEN).