Skip to content

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.