01Get a key before you call anything
1 · Identity
Ask for a name at sso.pluronymous.com. The name maps to a public key
through NIP-05. That is all the name service does today: every other path there answers
503.
2 · Join request
POST your public key to /join/api/request. The route is public and
origin-checked. A request enters a ledger. It is not a membership.
3 · Approval
The operator approves or denies by hand. Approval adds you to a scope. Your standing then comes from a signed relation, never from a role name.
02Standing, and the verb each tier holds
| Tier | Proof the edge checks | Verbs | Refusal you get |
|---|---|---|---|
| public | none | liveness, health, join request, join status | none, the route answers |
| signed guest | a signed event from a known key | read your own join status | NPUB_MALFORMED on a bad key |
| member | NIP-98 on HTTP, NIP-42 on the socket | relay query, relay events, content store, content retrieve | missing Nostr auth, DSTOR_GATE_DENIED |
| operator | a bearer token that never leaves the host | pending list, approve, deny | OPERATOR_AUTH_REQUIRED |
A caller that asks for a verb above its tier receives a
named refusal with a code. The edge does not answer 404, because a 404
reads as a broken service.
03Endpoint catalog, measured
Identity · sso.pluronymous.com
| Route | Method | Auth | Answer on 2026-11-10 |
|---|---|---|---|
/.well-known/nostr.json | GET | none | 200 the name map, 2062 bytes |
/ | GET | none | 503 Pluronymous SSO is not deployed yet. |
Transport · sys.pluronymous.com
| Route | Method | Auth | Answer on 2026-11-10 |
|---|---|---|---|
/ws | WS upgrade | NIP-42 | 426 answered a plain GET, which is correct: the route wants an upgrade |
/ws/query | POST | NIP-42 | 401 {"error":"missing Nostr auth"} |
/ws/events | POST | NIP-42 | not probed same handler as /ws/query |
/events | POST | event signature | 400 invalid event: missing id/pubkey/sig |
/_liveness | GET | none | 200 {"ok": true} |
/live | GET | none | 404 closed on purpose until a sanitized source lands |
Content · sys.pluronymous.com
| Route | Method | Auth | Answer on 2026-11-10 |
|---|---|---|---|
/dstor/health | GET | none | 200 {"ok": true, "engine": "dstor-http-gateway"} |
/dstor/store | POST | NIP-98, member key | not probed writes an object and returns its address |
/dstor/sha256/<64 hex> | GET | NIP-98, member key | 403 DSTOR_GATE_DENIED without a signature |
The health route carries no topology and no inventory count. A caller that asks for detail gets detail only from inside the container network.
Membership · home.pluronymous.com/join/api/
| Route | Method | Auth | Answer on 2026-11-10 |
|---|---|---|---|
liveness | GET | none | 200 counts: seen, pending, approved, denied |
request | POST | none, origin-checked | not probed writes one ledger row; a request is not a membership |
status?npub= | GET | none | 400 NPUB_MALFORMED on a bad key. A real key answers its own state |
coordinates?npub= | GET | none | not probed the public pack. The full pack needs an approved key |
ladder | GET | none | not probed the tier list the service holds |
pending | GET | bearer token | 401 OPERATOR_AUTH_REQUIRED |
approve, deny | POST | bearer token | not probed operator only |
04Two calls, written out
Store an object
curl -X POST https://sys.pluronymous.com/dstor/store \
-H "Authorization: Nostr <base64 of a signed kind-27235 event>" \
-H "Content-Type: text/plain" \
--data-binary @note.txt
The answer carries the object address. The address is the
sha256 of the bytes, so the same bytes always land on the same address.
Retrieve it
curl https://sys.pluronymous.com/dstor/sha256/<64 hex> \
-H "Authorization: Nostr <base64 of a signed kind-27235 event>"
A good answer carries X-dSTOR-SHA256 and
X-dSTOR-Verified: true. Check the hash on your side. Do not trust the header alone.
Query the relay
wss://sys.pluronymous.com/ws # WebSocket, NIP-42 auth on connect
POST /ws/query # same origin, JSON request, NIP-42
A plain GET to /ws answers 426.
That is the route telling you it wants an upgrade, and not an error.
05Refusals, and what each one means
| Code | Where it comes from | What it means |
|---|---|---|
missing Nostr auth | the relay bridge | no signed event on the request. Sign one, then repeat |
DSTOR_GATE_DENIED | the content gate | the edge refused before the object route. The request needs a NIP-98 signature from a member key |
OPERATOR_AUTH_REQUIRED | the join service | the route is operator-only, and the bearer token is absent or wrong |
NPUB_MALFORMED | the join service | the key is not a 63-character bech32 npub |
NO_ROUTE | the join service | the service is up and the path is not one of its routes |
body_too_large | the content store | the object passes the store limit. Split it, or send a manifest |
integrity_failure | the content store | the stored bytes do not match their address. The object is not served |
06Limits at the edge
- Front door: burst 20 requests. API paths: burst 200. The gate path: burst 20.
- Join requests: burst 10. The route is origin-checked. The check itself was not probed here.
- One connection limit of 100 per address on the TLS listeners.
- Bodies over the content store limit answer
413, and not a silent truncation.
These numbers come from the live edge configuration on 2026-11-10. They can change without notice, and this page is a still reading.
07What this portal does not offer
- No OpenAPI document. The catalog above is a measurement, not a schema. A machine-readable spec does not exist yet, and this page says so rather than shipping a false one.
- No SDK. Two calls are written out above. A package with no tests would be worse than a curl line.
- No SLA and no uptime number. This estate publishes no availability figure, because it measures no availability figure.
- No price list. Spend is blocked by policy on this estate. A consumer portal that prints prices would promise a transaction nobody can settle.
- No dashboard. The operator view is a separate path, unlinked here and unindexed, and it is not for consumers.
08Why this name
api.pluronymous.com would be a false name: the endpoints answer on
sys.pluronymous.com, and a name that promises an API at its root would break the naming
rule the estate uses. dev names the reader this page serves: a developer who needs the
catalog and the refusals in one place.
Every short name here does one job. wg is the tunnel.
sso is identity. sys is the system surface. dkr is the
Domino Compass front door. pss is sourcing. dev is this portal.