Developers
API.
A small JSON API. Reads return only what the caller is allowed to see: anonymous callers get public records, signed-in callers get what their relationship allows. Private records are never exposed.
Read
GET /api/v1/users/:username/stands GET /api/v1/subjects/:slug GET /api/v1/events/:id (id or slug)
Write (signed-in, same-origin)
POST /api/v1/stands
{ "subjectId": "uuid", "eventId": "uuid"?, "date": "2024" | "2024-09" | "2024-09-20",
"participationType": "ATTENDED"?, "note": "…"?, "visibility": "PUBLIC"? }
POST /api/v1/stands/:id/evidence multipart: file, artifactKind, caption?Issuers: signed confirmations
Verified organizations confirm attendance by signing a payload with an Ed25519 key registered with I STOOD. The signature is over the canonical JSON of the payload (keys sorted recursively, no whitespace).
POST /api/v1/issuers/:slug/issuances
{
"keyId": "uuid",
"signature": "base64(ed25519(canonicalJson(payload)))",
"payload": {
"v": 1,
"issuer": ":slug",
"recipient": { "username": "ethan" } // or { "emailSha256": "<sha256 of lowercase email>" }
"eventId": "uuid",
"issuedAt": "2027-09-21T03:00:00.000Z",
"nonce": "unique-per-issuance"
}
}Issuances are idempotent on the payload digest. If the person has no record for the event, one is created privately; only they can make it public. The issuer must be active and granted the event’s subject.

