API
Issuer public keys
Fetch an organisation's Ed25519 public keys to verify credential signatures yourself, with no API key.
Updated
On this page
Credentials an organisation issues through Arrota carry a detached Ed25519 signature. The public keys needed to check those signatures are published in two places, and both need no API key.
Where to find the key
A credential's issuer.id says which one to use:
issuer.id | Key source |
|---|---|
did:web:arrota.com:org:{slug} | https://app.arrota.com/org/{slug}/did.json: the organisation's active signing key |
urn:uuid:{issuerId} | GET /api/public/keys/{issuerId}: the organisation's full key directory |
GET/api/public/keys/{issuerId}
The full URL is https://app.arrota.com/api/public/keys/{issuerId}. This endpoint sits outside /api/v1, needs no API key, and answers only for issuers whose status is Active. An unknown, inactive or malformed issuer id returns 404, and the response is never cached for that case.
Example request
curl "https://app.arrota.com/api/public/keys/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b"Response
200 with a JSON object:
{
"issuer_id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
"keys": [
{
"kty": "OKP",
"crv": "Ed25519",
"x": "base64url-encoded public key",
"kid": "key id, matching the proof kid on the credential",
"alg": "EdDSA",
"use": "sig",
"created_at": "2026-08-29T10:14:00.000Z",
"revoked_at": null
}
]
}Successful responses are cached publicly for five minutes, so a key revocation is picked up within minutes without every verifier hitting the directory. Private key material is never selected, stored alongside, or published.
Key rotation
keys lists every key the organisation has published, newest first, including retired keys with their revoked_at timestamp. A signature made before a rotation must still verify against the key that made it, so retired keys stay published rather than disappearing. To check a credential:
- Read the
kidfrom itsproofblock. - Find the key with that
kidin the directory. - Verify the detached compact JWS over the RFC 8785-canonicalised credential payload.
An organisation has exactly one active (revoked_at: null) signing key at a time.
What a valid signature proves, and what it does not
A signature that verifies against a published key proves integrity and attribution: the credential payload is byte-for-byte what the organisation signed, it was signed by the holder of that organisation's signing key, and it has not been altered since.
It does not prove that the statement the credential makes is true, that the organisation verified the underlying facts before issuing, or anything about the person the credential is about. A signature is not verification of the record's content, and checking it is not the same as running a verification request, which the record holder authorises and the issuer answers.
For credentials a holder has published as Open Badges, the same proof is attached to the Open Badges 3.0 JSON.