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.
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 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%2Faftertaf.mont-gargan.fr'
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%3A7hl5jht3pkn244d3ca6csg3w%2Fsite.standard.publication%2F3mqmij2pz6fg2'
Click Run example to fetch a live response.
Fetch a single article card metadata and aggregate stats (no full body).
| Param | Type |
|---|---|
| document* | at-uri |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getDocument?document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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 · 9 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=introduction&view=articles&limit=5'
Click Run example to fetch a live response.
Author profile for a DID with aggregate stats.
| Param | Type |
|---|---|
| did* | did |
curl -sS 'https://standard-reader.app/xrpc/app.standard-reader.getAuthor?did=did%3Aplc%3A7hl5jht3pkn244d3ca6csg3w'
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%3A7hl5jht3pkn244d3ca6csg3w&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.
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%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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 · 8 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%3A7hl5jht3pkn244d3ca6csg3w&publication=at%3A%2F%2Fdid%3Aplc%3A7hl5jht3pkn244d3ca6csg3w%2Fsite.standard.publication%2F3mqmij2pz6fg2'
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%3A7hl5jht3pkn244d3ca6csg3w&subject=did%3Aplc%3A7hl5jht3pkn244d3ca6csg3w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&document=at%3A%2F%2Fdid%3Aplc%3Asdshk7vl3bzffwd262b6ee5s%2Fsite.standard.document%2F3mqntptwgis2w'
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%3A7hl5jht3pkn244d3ca6csg3w&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%3A7hl5jht3pkn244d3ca6csg3w&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%3A7hl5jht3pkn244d3ca6csg3w&limit=5'
Click Run example to fetch a live response.
Write procedures
auth · 17 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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w"}'
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:7hl5jht3pkn244d3ca6csg3w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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:sdshk7vl3bzffwd262b6ee5s/site.standard.document/3mqntptwgis2w"}'
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).
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"]}'
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:7hl5jht3pkn244d3ca6csg3w/site.standard.publication/3mqmij2pz6fg2"]}'
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).