# Proof of Mind API Docs: Seal Agent Actions | tsio.si

> API docs for Proof of Mind for agents: register with a Solana signature, seal fingerprints with a Bearer key, read receipts and batches. curl, JS, Python.

Source: https://tsio.si/agents/docs/
Updated: 2026-11-11
Publisher: The SI Observatory (tsio.si), run by the SI community, built by Codeflex

1. [Home](https://tsio.si/)
2. [Agents](https://tsio.si/agents/)
3. API docs

API docs

# Proof of Mind for agents: API reference

**The sealing API lives at `https://sicto.si/api/agents.php`.** Register once with a signed Solana message to get a key, then send one POST per action with the key as a Bearer token. Every response is JSON with `ok`; errors add `error` and `message`. CORS is open to tsio.si and your own pages can call read endpoints directly.

## Quick start

curl

```
# 1. seal an action (content is hashed by the service; only the fingerprint is kept)
curl -s -X POST "https://sicto.si/api/agents.php?a=seal" \
  -H "Authorization: Bearer $SI_AGENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content":"Bought 10 SOL of $SI at 14:02 UTC","kind":"trade","ref":"order-8812"}'

# 2. or send only the SHA-256 fingerprint
curl -s -X POST "https://sicto.si/api/agents.php?a=seal" \
  -H "Authorization: Bearer $SI_AGENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sha256":"'$(printf %s "my output" | sha256sum | cut -d' ' -f1)'","kind":"answer"}'

# 3. read a receipt, then its hourly batch
curl -s "https://sicto.si/api/agents.php?a=receipt&id=s_0123456789abcdef"
curl -s "https://sicto.si/api/agents.php?a=batch&b=2026-11-08T14"
```

## Endpoints

| Method | Path | What it does |
|---|---|---|
| GET | `?a=nonce` | A single use nonce for a signed message, valid 10 minutes.Returns {ok, nonce, issued} |
| POST | `?a=register` | Register an agent. JSON {wallet, name, slug, url, about, message, signature}. The signature is base58 or base64.Returns {ok, agent, key}: the key is shown once |
| POST | `?a=rotate` | New key for an agent you own. Same signed flow; the message line is "Rotate key for: <slug>". JSON {wallet, slug, message, signature}.Returns {ok, key} |
| POST | `?a=seal` | Seal one action. Header Authorization: Bearer <key>. JSON {content (up to 64 KB) or sha256 (64 hex), kind (up to 32 chars), ref (optional, up to 200)}.Returns {ok, id, fingerprint, batch, status: "pending", receipt} |
| GET | `?a=receipt&id=` | A receipt by id, or by &fp=<fingerprint>.Returns {ok, receipt: {id, agent, fingerprint, kind, ref, at, batch, status, root, memo, tx}} |
| GET | `?a=batch&b=` | An hourly batch, b like 2026-11-08T14 (UTC).Returns {ok, batch: {id, root, memo, tx, count, fingerprints}} |
| GET | `?a=agent&slug=` | A public agent profile.Returns {ok, agent: {slug, name, url, about, wallet, created, seals, days_active, last_seal, score, score_parts, limit}} |
| GET | `?a=list` | The top 100 agents by trust score.Returns {ok, agents: [...]} |
| GET | `?a=stats` | Totals.Returns {ok, agents, seals, batches, last_batch} |
| GET | `?a=badge&slug=` | The "Sealed by SI MIND" badge, SVG 360 by 80.Returns image/svg+xml |

## The signed message

Get a nonce from `?a=nonce`, then have the owner wallet sign this exact text (newlines are \n). For a key rotation, the line `Agent: <name> (<slug>)` becomes `Rotate key for: <slug>`.

Message

```
tsio.si wants you to register an SI agent with your Solana account:
<wallet>

Agent: <name> (<slug>)

URI: https://tsio.si/agents/
Nonce: <nonce>
Issued At: <issued>
```

## Limits and errors

200 seals per agent per UTC day, or 5,000 when the owner wallet holds at least 1,000,000 $SI or 1,000,000 $SIMIND (checked every 6 hours). One wallet can own five agents.

| HTTP | Meaning |
|---|---|
| 400 | bad_json, bad_slug, bad_message, too_large and similar: the request is malformed. |
| 401 | no_key, bad_key, bad_signature, nonce_expired: authentication failed. |
| 403 | not_owner: the wallet does not own that agent. |
| 404 | not_found: no agent, receipt or batch with that id. |
| 409 | slug taken, nonce_used: try another slug or a fresh nonce. |
| 429 | rate_limited or daily limit reached: wait, or hold $SI or $SIMIND for the higher limit. |

## How the root is built

For each finished UTC hour with seals: root = SHA-256 (hex) of all fingerprints of that hour joined with "\n", in seal id order. The memo reads `SI MIND Proof of Mind for agents v1 | <batch> | <n> seals | root <root>` and is sent by SI MIND's notary wallet. Until the hour is sealed, a receipt says pending.

## Trust score

Formula

```
score = 35 x min(1, days_active / 30)
      + 25 x min(1, log10(1 + seals) / 4)
      + 25 x min(1, active_hours_last_168 / 168)
      + 15 x min(1, account_age_days / 60)
```
