A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
1# Hold Service XRPC Endpoints
2
3This document lists all XRPC endpoints implemented in the Hold service (`pkg/hold/`).
4
5## PDS Endpoints (`pkg/hold/pds/xrpc.go`)
6
7### Public (No Auth Required)
8
9| Endpoint | Method | Description |
10|----------|--------|-------------|
11| `/xrpc/_health` | GET | Health check |
12| `/xrpc/com.atproto.server.describeServer` | GET | Server metadata |
13| `/xrpc/com.atproto.repo.describeRepo` | GET | Repository information |
14| `/xrpc/com.atproto.repo.getRecord` | GET | Retrieve a single record |
15| `/xrpc/com.atproto.repo.listRecords` | GET | List records in a collection (paginated) |
16| `/xrpc/com.atproto.sync.listRepos` | GET | List all repositories |
17| `/xrpc/com.atproto.sync.getRecord` | GET | Get record as CAR file |
18| `/xrpc/com.atproto.sync.getRepo` | GET | Full repository as CAR file |
19| `/xrpc/com.atproto.sync.getRepoStatus` | GET | Repository hosting status |
20| `/xrpc/com.atproto.sync.subscribeRepos` | GET | WebSocket firehose |
21| `/xrpc/com.atproto.identity.resolveHandle` | GET | Resolve handle to DID |
22| `/xrpc/app.bsky.actor.getProfile` | GET | Get actor profile |
23| `/xrpc/app.bsky.actor.getProfiles` | GET | Get multiple profiles |
24| `/.well-known/did.json` | GET | DID document |
25| `/.well-known/atproto-did` | GET | DID for handle resolution |
26
27### Conditional Auth (based on captain.public)
28
29| Endpoint | Method | Description |
30|----------|--------|-------------|
31| `/xrpc/com.atproto.sync.getBlob` | GET/HEAD | Get blob (routes OCI vs ATProto) |
32
33### Owner/Crew Admin Required
34
35| Endpoint | Method | Description |
36|----------|--------|-------------|
37| `/xrpc/com.atproto.repo.deleteRecord` | POST | Delete a record |
38| `/xrpc/com.atproto.repo.uploadBlob` | POST | Upload ATProto blob |
39
40### DPoP Auth Required
41
42| Endpoint | Method | Description |
43|----------|--------|-------------|
44| `/xrpc/io.atcr.hold.requestCrew` | POST | Request crew membership |
45
46---
47
48## OCI Multipart Upload Endpoints (`pkg/hold/oci/xrpc.go`)
49
50All require `blob:write` permission via service token:
51
52| Endpoint | Method | Description |
53|----------|--------|-------------|
54| `/xrpc/io.atcr.hold.initiateUpload` | POST | Start multipart upload |
55| `/xrpc/io.atcr.hold.getPartUploadUrl` | POST | Get presigned URL for part |
56| `/xrpc/io.atcr.hold.uploadPart` | PUT | Direct buffered part upload |
57| `/xrpc/io.atcr.hold.completeUpload` | POST | Finalize multipart upload |
58| `/xrpc/io.atcr.hold.abortUpload` | POST | Cancel multipart upload |
59| `/xrpc/io.atcr.hold.notifyManifest` | POST | Notify manifest push (creates layer records + optional Bluesky post) |
60
61---
62
63## Standard ATProto Endpoints (excluding io.atcr.hold.*)
64
65| Endpoint |
66|----------|
67| /xrpc/_health |
68| /xrpc/com.atproto.server.describeServer |
69| /xrpc/com.atproto.repo.describeRepo |
70| /xrpc/com.atproto.repo.getRecord |
71| /xrpc/com.atproto.repo.listRecords |
72| /xrpc/com.atproto.repo.deleteRecord |
73| /xrpc/com.atproto.repo.uploadBlob |
74| /xrpc/com.atproto.sync.listRepos |
75| /xrpc/com.atproto.sync.getRecord |
76| /xrpc/com.atproto.sync.getRepo |
77| /xrpc/com.atproto.sync.getRepoStatus |
78| /xrpc/com.atproto.sync.getBlob |
79| /xrpc/com.atproto.sync.subscribeRepos |
80| /xrpc/com.atproto.identity.resolveHandle |
81| /xrpc/app.bsky.actor.getProfile |
82| /xrpc/app.bsky.actor.getProfiles |
83| /.well-known/did.json |
84| /.well-known/atproto-did |