A zero-dependency AT Protocol Personal Data Server written in JavaScript
atproto
pds
1# PDS Endpoint Comparison: pds.js vs atproto/packages/pds
2
3Comparison of endpoints and parameters between this implementation and the official AT Protocol PDS.
4
5---
6
7## Endpoints Missing from pds.js
8
9### com.atproto.admin.* (entire namespace missing)
10
11| Endpoint | Params |
12|----------|--------|
13| deleteAccount | did |
14| disableAccountInvites | account, note |
15| disableInviteCodes | accounts, codes |
16| enableAccountInvites | account, note |
17| getAccountInfo | did |
18| getAccountInfos | dids |
19| getInviteCodes | cursor, limit, sort |
20| getSubjectStatus | blob, did, uri |
21| searchAccounts | cursor, email, limit |
22| sendEmail | comment, content, recipientDid, senderDid, subject |
23| updateAccountEmail | account, email |
24| updateAccountHandle | did, handle |
25| updateAccountPassword | did, password |
26| updateAccountSigningKey | did, signingKey |
27| updateSubjectStatus | deactivated, subject, takedown |
28
29### com.atproto.identity.* (mostly missing)
30
31| Endpoint | Params | Notes |
32|----------|--------|-------|
33| getRecommendedDidCredentials | (none) | |
34| refreshIdentity | identifier | |
35| requestPlcOperationSignature | (none) | |
36| resolveDid | did | |
37| resolveIdentity | identifier | |
38| signPlcOperation | alsoKnownAs, rotationKeys, services, token, verificationMethods | |
39| submitPlcOperation | operation | |
40| updateHandle | handle | |
41
42*pds.js only implements: resolveHandle*
43
44### com.atproto.server.* (many missing)
45
46| Endpoint | Params |
47|----------|--------|
48| activateAccount | (none) |
49| checkAccountStatus | (none) |
50| confirmEmail | email, token |
51| createAccount | did, email, handle, inviteCode, password, plcOp, recoveryKey, verificationCode, verificationPhone |
52| createAppPassword | name, privileged |
53| createInviteCode | forAccount, useCount |
54| createInviteCodes | codeCount, forAccounts, useCount |
55| deactivateAccount | deleteAfter |
56| deleteAccount | did, password, token |
57| deleteSession | (none) |
58| getAccountInviteCodes | createAvailable, includeUsed |
59| getServiceAuth | aud, exp, lxm |
60| listAppPasswords | (none) |
61| requestAccountDelete | (none) |
62| requestEmailConfirmation | (none) |
63| requestEmailUpdate | (none) |
64| requestPasswordReset | email |
65| reserveSigningKey | did |
66| resetPassword | password, token |
67| revokeAppPassword | name |
68| updateEmail | email, emailAuthFactor, token |
69
70*pds.js implements: createSession, getSession, refreshSession, describeServer*
71
72### com.atproto.sync.* (some missing)
73
74| Endpoint | Params |
75|----------|--------|
76| getBlocks | cids, did |
77| getHostStatus | hostname |
78| listHosts | cursor, limit |
79| listReposByCollection | collection, cursor, limit |
80| notifyOfUpdate | hostname |
81| requestCrawl | hostname |
82
83*pds.js implements: listRepos, getLatestCommit, getRepoStatus, getRepo, getRecord, getBlob, listBlobs, subscribeRepos*
84
85### com.atproto.repo.* (some missing)
86
87| Endpoint | Params |
88|----------|--------|
89| importRepo | (binary) |
90| listMissingBlobs | cursor, limit |
91
92*pds.js implements: createRecord, deleteRecord, putRecord, applyWrites, getRecord, describeRepo, listRecords, uploadBlob*
93
94### com.atproto.moderation.*
95
96| Endpoint | Params |
97|----------|--------|
98| createReport | modTool, reason, reasonType, subject |
99
100### com.atproto.temp.* (entire namespace missing)
101
102| Endpoint | Params |
103|----------|--------|
104| addReservedHandle | handle |
105| checkHandleAvailability | birthDate, email, handle |
106| checkSignupQueue | (none) |
107| dereferenceScope | scope |
108| fetchLabels | limit, since |
109| requestPhoneVerification | phoneNumber |
110| revokeAccountCredentials | account |
111
112---
113
114## Missing Parameters in Shared Endpoints
115
116Endpoints that exist in both implementations, but pds.js is missing parameters:
117
118| Endpoint | pds.js has | Missing from pds.js |
119|----------|------------|---------------------|
120| repo.createRecord | collection, record, rkey | **repo**, **validate**, swapCommit |
121| repo.deleteRecord | collection, rkey | **repo**, swapCommit, swapRecord |
122| repo.putRecord | collection, rkey, record | **repo**, **validate**, swapCommit, swapRecord |
123| repo.applyWrites | writes | **repo**, validate, swapCommit |
124| sync.getRepo | did | since |
125| sync.listBlobs | did, cursor, limit | since |
126| sync.listRepos | (none) | cursor, limit |
127| server.createSession | identifier, password | allowTakendown, authFactorToken |
128
129**Bold** = likely important for compatibility
130
131---
132
133## app.bsky.* Coverage
134
135Both implementations handle app.bsky.* the same way:
136
137| Category | Endpoints | Notes |
138|----------|-----------|-------|
139| Native (stored in PDS) | actor.getPreferences, actor.putPreferences | Both implementations |
140| Proxied to AppView | ~87 endpoints | feed.*, graph.*, notification.*, etc. |
141
142---
143
144## Extra in pds.js (not in atproto spec)
145
146Custom endpoints specific to this implementation:
147
148| Endpoint | Purpose |
149|----------|---------|
150| `POST /init` | Initialize PDS with DID/keys |
151| `GET /status` | Health check |
152| `POST /register-did` | Register a DID |
153| `GET /get-registered-dids` | List registered DIDs |
154| `POST /register-handle` | Register a handle |
155| `GET /resolve-handle` | Resolve handle (non-XRPC path) |
156| `POST /forward-event` | Forward sync events to other instances |
157| `GET /repo-info` | Get repository info |
158| `GET /oauth-public-key` | Get OAuth public key |
159| `POST /check-dpop-jti` | DPoP replay protection |
160
161### OAuth 2.0 Stack (full implementation)
162
163| Endpoint | Purpose |
164|----------|---------|
165| `GET /.well-known/oauth-authorization-server` | OAuth server metadata |
166| `GET /.well-known/oauth-protected-resource` | Protected resource metadata |
167| `GET /oauth/jwks` | JSON Web Key Set |
168| `POST /oauth/par` | Pushed Authorization Request |
169| `GET/POST /oauth/authorize` | Authorization endpoint |
170| `POST /oauth/token` | Token endpoint (with DPoP) |
171| `POST /oauth/revoke` | Token revocation |
172
173---
174
175## Summary
176
177| Category | pds.js | atproto PDS |
178|----------|--------|-------------|
179| com.atproto.admin.* | 0 | 15 |
180| com.atproto.identity.* | 1 | 9 |
181| com.atproto.moderation.* | 0 | 1 |
182| com.atproto.repo.* | 8 | 10 |
183| com.atproto.server.* | 4 | 25 |
184| com.atproto.sync.* | 8 | 14 |
185| com.atproto.temp.* | 0 | 7 |
186| app.bsky.* (native) | 2 | 2 |
187| app.bsky.* (proxied) | ~87 | ~87 |
188| **Total XRPC (native)** | **23** | **85** |
189| Custom endpoints | 10 | 0 |
190| OAuth endpoints | 7 | 7 (via @atproto/oauth-provider) |