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.

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.

Run a labeler

A labeler is any DID that publishes AT Proto labels. Readers add one by DID on the Labelers page, and Standard Reader then shows that labeler's labels — and can warn on or hide labeled posts — as they read. Labelers are discovered the standard way; nothing about them is specific to us. To run your own:

1. Identity & signing key. Give it a DID (a did:web is simplest) whose DID document advertises an #atproto_labeler service endpoint and an #atproto_label public signing key.

2. Serve labels. Sign and emit com.atproto.label.defs#label objects, and expose the standard com.atproto.label.queryLabels (HTTP) and com.atproto.label.subscribeLabels (WebSocket) endpoints.

3. Declare your label values. Describe each value (severity, default warn/hide, blur behavior) in an app.standard-reader.labeler.service descriptor, served from app.standard-reader.labeler.getServices (a did:web labeler has no repo to hold the record).

4. Let readers subscribe. When a reader subscribes we write an app.standard-reader.labeler.subscription record to their repo, carrying their per-label warn/hide preferences.

For a complete, minimal reference implementation (Jetstream → detect → sign → SQLite → serve), see the claudeslop labeler in services/claudeslop.

Public queries

no auth · 7 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%2Faftertaf.mont-gargan.fr'
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%3A7hl5jht3pkn244d3ca6csg3w%2Fsite.standard.publication%2F3mqmij2pz6fg2'
response

Click Run example to fetch a live response.

app.standard-reader.getDocumentqueryauth: none

Fetch a single article card metadata and aggregate stats (no full body).

ParamType
document*at-uri
curl
document
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocument?document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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 · 9 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=introduction&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.

ParamType
did*did
curl
did
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthor?did=did%3Aplc%3A7hl5jht3pkn244d3ca6csg3w'
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%3A7hl5jht3pkn244d3ca6csg3w&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.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%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&publication=at%3A%2F%2Fdid%3Aplc%3A7hl5jht3pkn244d3ca6csg3w%2Fsite.standard.publication%2F3mqmij2pz6fg2'
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%3A7hl5jht3pkn244d3ca6csg3w&subject=did%3Aplc%3A7hl5jht3pkn244d3ca6csg3w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&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%3A7hl5jht3pkn244d3ca6csg3w&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%3A7hl5jht3pkn244d3ca6csg3w&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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w"}'
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:7hl5jht3pkn244d3ca6csg3w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"]}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"]}'
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).