Reference
API reference
The public, unauthenticated routes. Every schema on this page is generated from the OpenAPI document, and CI checks that document against the running API handler.
The console API (tenants, policies, decisions, evidence) is published by the console lane as docs/api/console-v1.openapi.json. When it lands in the repository, this page includes it automatically.
Generated from apps/docs/openapi/public-api.openapi.json (Silvector public API, version 2026-11-07).
POST /v1/check
Decide one request shape and return a signed receipt
Runs the request shape through the public policy for tenant try. Rate limited to 60 requests a minute per caller. A signature field in the JSON body is ignored; only HTTP message signatures on the request can verify an agent.
curl -s https://api.silvector.com/v1/check \
-H 'content-type: application/json' \
-d '{"method":"GET","path":"/pricing"}'
const res = await fetch("https://api.silvector.com/v1/check", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ method: "GET", path: "/pricing" }),
});
const { outcome, ruleId, receipt } = await res.json();
import json, urllib.request
req = urllib.request.Request("https://api.silvector.com/v1/check",
data=json.dumps({"method": "GET", "path": "/pricing"}).encode(),
headers={"content-type": "application/json"})
decision = json.load(urllib.request.urlopen(req))
res, err := http.Post("https://api.silvector.com/v1/check", "application/json",
strings.NewReader(`{"method":"GET","path":"/pricing"}`))
No authentication. Up to 60 requests a minute per caller address, counted by each Worker instance; over that, 429. To verify the receipt, follow a quickstart.
Request body · CheckRequest
| Field | Type | Description |
|---|---|---|
method | string | HTTP method of the request being decided. Defaults to the method of this call. |
path | string | Path of the request being decided. |
userAgent | string | User-Agent claim of the request being decided. Defaults to this call's User-Agent. |
ip | string | Client address of the request being decided. Defaults to this call's address. |
prompt | string | Prompt text, for routes that carry one. |
tool | string | Tool name, for agent tool calls. |
signature | string | Ignored. Present only so the response can say it was ignored. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Allowed or otherwise decided without an error status. | CheckResponse |
401 | Decided step_up. | CheckResponse |
403 | Decided deny, for example a spoofed operator. | CheckResponse |
429 | Rate limited. | none |
503 | The deployed API has no receipt signing key, so nothing is decided or signed. The body carries `error: signing_key_missing` when the API layer answers; it can be empty. | Problem |
Example response REPLAY
Recorded from https://api.silvector.com on 2026-11-07. Outcome allow, rule allow.default.
{
"status": 200,
"outcome": "allow",
"ruleId": "allow.default",
"verdict": "not_identified",
"reason": "no_claim",
"method": "none",
"ignoredSignatureField": false,
"receiptId": "a2d418a873a3b2a1d575a3cdcea89eef2004d996776cf75973fcf7d2fdc1e093",
"receipt": {
"body": {
"v": "ag47.receipt.v1",
"ts_edge": 1794073836000,
"tenant": "try",
"agent_kid": "edge-receipt",
"delegation": null,
"action_hash": "d7777da76fba8007e1516a9cdb3ce3e9ee031f774c47bb510f9b3639f87b6253",
"policy_bundle_hash": "2f0edd22bc9aab7b6727c1011b973730e7132c40c74af8bbf9cf8c667c9d2c46",
"flag_state_hash": "cf67de135395834ad2a0d41915e8cf3f6769fd5748d00dcc2a562974ce08c45b",
"outcome": "allow",
"rule_id": "allow.default",
"prev": "0000000000000000000000000000000000000000000000000000000000000000",
"bypass": false,
"applied_outcome": "allow",
"computed_outcome": "allow",
"verification": "not_identified"
},
"sig": "vL1Iy9MUGhUEdBojuZV3dfUW13ICR20eYhroOzqmceZwBx648oN6ZhHsy0GhiHvHqZFxaxhjQ1ieg4a9I24kCA"
}
}
- Covers
- Which rule decided this request and that the record was not changed after signing. Not whether the sender was an AI agent.
- Confidence
- None stated. No calibrated confidence applies to this record.
- Calibration
- Uncalibrated
- Known error rates
- None measured. Silvector publishes no detection error rate yet.
- Basis
- Deterministic decide() rule allow.default
- Ed25519 signature over the canonical receipt body, checked against the published JWKS
- Bias risks
- The decision is only as good as the facts it was given. A request with no signature claim is not_identified, which is not a finding that a person or an agent sent it.
- Next step
- To ask who was behind a series of requests, keep the receipts and escalate to rung 3 with at least two independent signal families. How escalation works
- Assigned by
- These docs, from the rung definitions. The grade is not a signed field of the receipt.
GET /.well-known/jwks.json
Public keys that verify receipts and log heads
curl -s https://api.silvector.com/.well-known/jwks.json
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The key set. | Jwks |
503 | The deployed API has no receipt signing key, so nothing is decided or signed. The body carries `error: signing_key_missing` when the API layer answers; it can be empty. | Problem |
Example response REPLAY
{
"keys": [
{
"kty": "OKP",
"crv": "Ed25519",
"x": "-cOD_m33YIDM5Z096uppcsj2I_M3VdSXAmvb8ofSQ4c",
"kid": "edge-receipt",
"use": "sig"
},
{
"kty": "OKP",
"crv": "Ed25519",
"x": "BobpKJc-Yj1n2DYUeBPMzO5NVX3gXGDk8PboyWBxuLQ",
"kid": "identity",
"use": "sig",
"alg": "EdDSA"
}
]
}
GET /.well-known/transparency
Signed tree head over placeholder leaves and recent receipt hashes, with one inclusion check and one consistency check
The leaves are four fixed placeholders followed by hashes of recent /v1/check receipts, appended on a best-effort basis. On the API Worker each data center keeps its own leaf list in its cache for up to six hours; the list stops growing at 64 leaves and is not stored durably, so two requests can return different heads. The inclusion check is for the first placeholder leaf, not for a receipt. Keys: the edge-receipt key in the JWKS on staging.
curl -s https://api.silvector.com/.well-known/transparency
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The current log head. | TransparencyHead |
503 | The deployed API has no receipt signing key, so nothing is decided or signed. The body carries `error: signing_key_missing` when the API layer answers; it can be empty. | Problem |
GET /.well-known/transparency/inclusion
An inclusion check for one leaf of a separate four-leaf sample log
This route signs its own fixed four-leaf sample tree, not the head at /.well-known/transparency, so its tree head does not match that one. It says nothing about receipts.
curl -s https://api.silvector.com/.well-known/transparency/inclusion
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The audit path and the tree head it is checked against. | InclusionCheck |
GET /health
Service identity, build and flag snapshot
curl -s https://api.silvector.com/health
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The service is answering. | Health |
Schemas
CheckRequest
| Field | Type | Description |
|---|---|---|
method | string | HTTP method of the request being decided. Defaults to the method of this call. |
path | string | Path of the request being decided. |
userAgent | string | User-Agent claim of the request being decided. Defaults to this call's User-Agent. |
ip | string | Client address of the request being decided. Defaults to this call's address. |
prompt | string | Prompt text, for routes that carry one. |
tool | string | Tool name, for agent tool calls. |
signature | string | Ignored. Present only so the response can say it was ignored. |
CheckResponse
| Field | Type | Description |
|---|---|---|
status required | integer | The HTTP status the decision maps to. |
outcome required | "allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy" | |
ruleId required | string | |
verdict required | "verified" | "verification_failed" | "not_verifiable" | "not_identified" | |
reason required | string | Why the identity verdict is what it is. |
method required | string | How the identity claim was checked. |
ignoredSignatureField required | boolean | |
ranges | object | State of the operator range snapshot used for the check. |
receiptId required | string | sha256 of the canonical receipt body followed by the signature, hex. |
receipt required | SignedReceipt |
SignedReceipt
| Field | Type | Description |
|---|---|---|
body required | ReceiptBody | |
sig required | string | base64url Ed25519 signature over the canonical JSON of body. |
ReceiptBody
| Field | Type | Description |
|---|---|---|
v required | "ag47.receipt.v1" | |
ts_edge required | integer | Decision time, Unix milliseconds. |
tenant required | string | Tenant stream. try for /v1/check. |
agent_kid required | string | Key id that signed the receipt. |
delegation required | string | null | On-behalf-of chain, or null. |
action_hash required | string | sha256 of method, path, authority and request id. |
policy_bundle_hash required | string | |
flag_state_hash required | string | |
outcome required | "allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy" | |
rule_id required | string | |
prev required | string | Hash of the previous receipt in this tenant stream, or 64 zeros. |
bypass required | boolean | |
verification | "verified" | "verification_failed" | "not_verifiable" | "not_identified" | |
applied_outcome | "allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy" | |
computed_outcome | "allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy" | |
computed_rule_id | string | |
directory_hash | string | |
signal | "replay_detected_async" | |
caep | string | |
range_source | "published" | "bundled" | |
range_list | string | |
range_fetched_at | string |
Outcome
"allow" | "meter" | "price" | "edit" | "step_up" | "deny" | "throttle" | "tarpit" | "decoy"
Verification
"verified" | "verification_failed" | "not_verifiable" | "not_identified"
Jwks
| Field | Type | Description |
|---|---|---|
keys required | object[] |
TransparencyHead
| Field | Type | Description |
|---|---|---|
v required | "ag47.transparency.v1" | |
sth required | SignedTreeHead | |
inclusion | InclusionCheck | |
consistency | object | One consistency check between two sizes of the log. Not described field by field here; see packages/transparency/src/log.ts. |
Health
| Field | Type | Description |
|---|---|---|
service required | string | |
sha required | string | Build commit. |
product required | string | |
signing required | "secret" | "test" | "missing" | secret when receipts are signed with the deployed key, test in local development with built-in test keys, missing when a deployed API has no key. |
flags required | object |
SignedTreeHead
| Field | Type | Description |
|---|---|---|
body required | object | |
sig required | string | base64url Ed25519 over the canonical JSON of body. |
keyLabel required | string |
InclusionCheck
| Field | Type | Description |
|---|---|---|
kind required | "inclusion" | |
keyLabel required | string | |
leaf_b64 required | string | The leaf, base64. |
leaf_index required | integer | |
tree_size required | integer | |
audit_path required | string[] | |
sth required | SignedTreeHead |
Problem
| Field | Type | Description |
|---|---|---|
error | string |