Skip to main content
selo verify checks a signed release attestation against keys you trust, and checks that it attests the release, URL and method you expect. It needs no wallet, pays nothing and, with a key file, uses no network. It exits with the attested verdict, so a promotion step can trust a PASS that Selo signed for this exact build.

Flags

Relative paths resolve against the directory you ran the command in.

Trusted keys

Selo publishes its attestation keys at https://api.useselo.xyz/.well-known/selo-attestation-keys.json:
selo-attestation-keys.json
publicKey is the raw Ed25519 public key, base64url-encoded. A key set is any JSON object with a keys array of { keyId, algorithm: "Ed25519", publicKey } entries.
Pin the keys. Download the key set once, review it and commit it, for example as selo/attestation-keys.json, then pass that file to --keys. Never take the key location from the attestation itself. The Selo repository keeps its own pinned copy at docs/evidence/selo-attestation-keys.json.
With an https URL, the CLI downloads the key set on every run, with a 300-second timeout and no redirects followed. A file is read from disk and needs no network.

What it checks

The checks run in this order. The first one that fails stops verification with exit 2, and the CLI prints not verified: <reason> on stderr. Canonical JSON means the payload with object keys sorted at every level and no whitespace, so the signature never covers itself. The CLI verifies the payload exactly as it appears in the file: changing any field, including the verdict, breaks the signature. URL matching is exact after normalization. --url https://api.example.com becomes https://api.example.com/, and a trailing slash or a different path does not match. Pass the same URL you tested. The issuer field is printed but not used for trust. Trust comes only from the key you pinned.

Output

Verified attestations print seven lines on stdout. These are the real outputs for the two Mainnet runs against the demo merchant, using the pinned key file from the Selo repository:

Exit codes

selo verify trusts the signed verdict. It does not recompute the verdict from the checks the way selo test does, and it does not look the transactions up on chain. Use an Algorand explorer, for example https://allo.info/tx/<txId>, to check the payment legs independently.

Examples

The Selo repository’s Release gate demo workflow uses this mode to verify the two committed Mainnet attestations against the pinned key. On 26 October 2026 it blocked broken-v1 and promoted fixed-v2.