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.

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%2Fcadernodeandre.leaflet.pub'
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%3Atpahzhv7j7bxzcw6g35sijrd%2Fsite.standard.publication%2F3mo5ccevb422r'
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%3Aki5px4zg2sa2zhmojphgtjys%2Fsite.standard.document%2F3mocs5c6czk2h'
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=observability&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%3Atpahzhv7j7bxzcw6g35sijrd'
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%3Atpahzhv7j7bxzcw6g35sijrd&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%3Aki5px4zg2sa2zhmojphgtjys%2Fsite.standard.document%2F3mocs5c6czk2h'
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 · 7 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%3Atpahzhv7j7bxzcw6g35sijrd&publication=at%3A%2F%2Fdid%3Aplc%3Atpahzhv7j7bxzcw6g35sijrd%2Fsite.standard.publication%2F3mo5ccevb422r'
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%3Atpahzhv7j7bxzcw6g35sijrd&document=at%3A%2F%2Fdid%3Aplc%3Aki5px4zg2sa2zhmojphgtjys%2Fsite.standard.document%2F3mocs5c6czk2h'
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%3Atpahzhv7j7bxzcw6g35sijrd&document=at%3A%2F%2Fdid%3Aplc%3Aki5px4zg2sa2zhmojphgtjys%2Fsite.standard.document%2F3mocs5c6czk2h'
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%3Atpahzhv7j7bxzcw6g35sijrd&document=at%3A%2F%2Fdid%3Aplc%3Aki5px4zg2sa2zhmojphgtjys%2Fsite.standard.document%2F3mocs5c6czk2h'
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%3Atpahzhv7j7bxzcw6g35sijrd&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%3Atpahzhv7j7bxzcw6g35sijrd&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%3Atpahzhv7j7bxzcw6g35sijrd&limit=5'
response

Click Run example to fetch a live response.

Write procedures

auth · 15 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:tpahzhv7j7bxzcw6g35sijrd/site.standard.publication/3mo5ccevb422r"}'
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:tpahzhv7j7bxzcw6g35sijrd/site.standard.publication/3mo5ccevb422r"}'
response

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

app.standard-reader.recommendDocumentprocedureauth: required

Like 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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
response

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

app.standard-reader.unrecommendDocumentprocedureauth: required

Remove a network like from an article.

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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
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:ki5px4zg2sa2zhmojphgtjys/site.standard.document/3mocs5c6czk2h"}'
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:tpahzhv7j7bxzcw6g35sijrd/site.standard.publication/3mo5ccevb422r"}'
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:tpahzhv7j7bxzcw6g35sijrd/site.standard.publication/3mo5ccevb422r"]}'
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:tpahzhv7j7bxzcw6g35sijrd/site.standard.publication/3mo5ccevb422r"]}'
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).