Skip to main content

Check an agent

Two reads that need no key. An agent's owner can open its behavioral integrity record to anyone; the record shows what VIGIL holds about that agent right now, and nothing else.

GET /public/agents/{org_slug}/{agent_id} returns exactly these fields:

FieldMeaning
orgThe organization's slug
agent_id, name, kindWhich agent; kind is production, sandbox or system
gateThe current gate: pass, hold, alert or collapse (null before the first scored event)
biiThe current Behavioral Integrity Index, 0.0 to 1.0, as stored at the last scored event
ledger_recordsHow many records on the organization's ledger belong to this agent
ledger_headThe organization's current ledger head hash; the same value GET /audit/{agent_id}/verify reports as head
last_event_atWhen the agent's most recent event was recorded, UTC
observedWhether the agent has been told it is under observation. It is scored either way
policy_digestDigest of the policy version that produced the current score
public_linksLinks the owner declared, at most five {kind, url} entries; VIGIL does not check them
verify_urlWhere to read how to verify the ledger yourself

There is no event content, no payload, no score history, no review note and no configuration on this route. Every value is one the owner already reads with a key; the public read computes nothing new.

GET /public/agents/{org_slug} lists the organization's public agents with the same fields, limit (1 to 100, default 50) and offset.

Both answer 404 for an agent that is not public, not active, or not in that organization, and for an organization with no public agent. Both are rate limited per client address (60 a minute by default) and send X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Responses carry Cache-Control: public, max-age=60 and may be read from any origin in a browser.

The same record as a page: https://app.vigil.supertruth.ai/a/{org_slug}/{agent_id}.

The two calls

curl:

curl -s https://vigil.supertruth.ai/public/agents/supertruth/truth-agent
curl -s "https://vigil.supertruth.ai/public/agents/supertruth?limit=20"

Python:

import httpx

BASE = "https://vigil.supertruth.ai"

def check_agent(org: str, agent_id: str) -> dict | None:
r = httpx.get(f"{BASE}/public/agents/{org}/{agent_id}", timeout=10)
if r.status_code == 404:
return None # not public, not active, or no such agent
r.raise_for_status()
return r.json()

rec = check_agent("supertruth", "truth-agent")
if rec:
print(rec["gate"], rec["bii"], rec["ledger_records"], rec["ledger_head"][:12])

TypeScript:

const BASE = "https://vigil.supertruth.ai";

export async function checkAgent(org: string, agentId: string) {
const res = await fetch(`${BASE}/public/agents/${encodeURIComponent(org)}/${encodeURIComponent(agentId)}`);
if (res.status === 404) return null; // not public, not active, or no such agent
if (!res.ok) throw new Error(`VIGIL ${res.status}`);
return (await res.json()) as {
org: string; agent_id: string; name: string; kind: string;
gate: "pass" | "hold" | "alert" | "collapse" | null; bii: number | null;
ledger_records: number; ledger_head: string | null; last_event_at: string | null;
observed: boolean; policy_digest: string;
public_links: { kind: string; url: string }[]; verify_url: string;
};
}

Make your agent public

The flag is off for every agent until an admin key in the agent's own organization turns it on with PATCH /admin/agents/{agent_id}. The same call sets public_links: up to five entries, kind one of website, github, x, moltbook, other, url an http or https address of at most 200 characters. The list is replaced whole; [] clears it. {"public": false} closes the record again; retiring the agent (is_active: false) closes it too.

This snippet registers an agent, scores one event, opens the record, reads it with no key, and closes it:

curl -sf -X POST "$VIGIL_URL/agents/" -H "Authorization: Bearer $VIGIL_KEY" -H "Content-Type: application/json" \
-d '{"agent_id":"docs-public","name":"Docs public"}' > /dev/null || true # 409 if it already exists
curl -sf -X POST "$VIGIL_URL/events/" -H "Authorization: Bearer $VIGIL_KEY" -H "Content-Type: application/json" \
-d '{"agent_id":"docs-public","event_type":"output_generated","payload":{"content_length":512},"dti":0.9}' > /dev/null
curl -sf -X PATCH "$VIGIL_URL/admin/agents/docs-public" -H "Authorization: Bearer $VIGIL_KEY" -H "Content-Type: application/json" \
-d '{"public":true,"public_links":[{"kind":"website","url":"https://example.com"}]}' > /dev/null # admin key
org=$(curl -sf -H "Authorization: Bearer $VIGIL_KEY" "$VIGIL_URL/orgs/me" | python3 -c 'import json,sys; print(json.load(sys.stdin)["slug"])')
curl -sf "$VIGIL_URL/public/agents/$org/docs-public" # no key
curl -sf "$VIGIL_URL/public/agents/$org?limit=5" > /dev/null # no key
curl -sf -X PATCH "$VIGIL_URL/admin/agents/docs-public" -H "Authorization: Bearer $VIGIL_KEY" -H "Content-Type: application/json" \
-d '{"public":false}' > /dev/null

What the record proves, and what it does not

It proves that a VIGIL-registered runtime reporting as this agent has the behavior record shown, and that the ledger holding it has not been edited: every record carries its content hash and the previous chain hash, the database rejects UPDATE and DELETE, and the head hash commits to the whole history.

It does not prove identity or key custody. It does not say who operates the agent, who holds the agent's keys, or that an account on any other site belongs to it; the public_links are the owner's own words. VIGIL scores the events the runtime reported. An action the agent took outside that runtime, or that its runtime never reported, is not on the record.

Verify the ledger yourself

The head hash on the public record is the head of the organization's chain. With a key from the owner, GET /audit/{agent_id}/verify recomputes the chain and reports the same head, GET /audit/export returns the raw rows, and the standalone verifier in the ledger checks them with no dependency on VIGIL. Without a key, the record still tells you the gate, the score, how long the chain is and where it stands today; if the head you saw yesterday is no longer a prefix of today's chain in the owner's export, something was rewritten.

For agents

Load the skill file at /skills/check-an-agent.md to call these two reads before acting on another agent's output. It sends no key and needs none. With a key, the MCP server tool get_trust returns the same gate and BII for agents in your own organization.