verify-server HTTP API
The confium-verify-server exposes a stateless HTTP/JSON API for verifying Confium artifacts. This page summarizes the API; the authoritative source is the OpenAPI spec.
Base URL
- Production (Confium-operated):
https://verify.confium.org - Self-hosted:
http://your-verify-server:8080
Versioning
URL paths include the major version (/v1). Breaking changes ship as /v2; /v1 is maintained for 12 months after /v2 ships.
Endpoints
| Method | Path | Body | Returns |
|---|---|---|---|
| POST | /v1/composite/verify |
{message, signature, components[]} |
{valid, checked_components, components[]} |
| POST | /v1/transparency/inclusion/verify |
{proof, entry, root_hash} |
{valid, sequence} |
| POST | /v1/pki/cert-chain/verify |
{leaf, anchor, intermediates[]} |
{valid, path_length, errors[]} |
| POST | /v1/batch/verify |
[{...}, ...] (max 1000) |
[{...}, ...] (same order) |
| GET | /health/live |
— | 200 OK |
| GET | /health/ready |
— | 200 OK or 503 |
| GET | /metrics |
— | Prometheus format |
Authentication
None. The verify-server is intentionally public — there’s nothing to protect by authentication. Confidential artifacts are not stored; the service verifies and forgets.
Rate limiting is the consumer’s responsibility (Cloudflare, nginx, etc.).
TLS
Production deployments MUST refuse plaintext HTTP. Use TLS termination at a reverse proxy (nginx, Caddy, Cloudflare) if you don’t terminate TLS in the verify-server itself.
Caching
In-memory LRU keyed by hash(message || signature). Default size: 10,000 entries. Hit rate visible at /metrics.
Cache is per-instance. For higher hit rates across replicas, put a shared cache (Redis) in front.
Examples
Verify a composite signature
curl -X POST https://verify.confium.org/v1/composite/verify \
-H 'Content-Type: application/json' \
-d '{
"message": "aGVsbG8=",
"signature": "hex..."
}'
Response:
{
"valid": true,
"checked_components": 2,
"components": [
{"algorithm": "Ed25519", "valid": true},
{"algorithm": "ECDSA-P256", "valid": true}
],
"checked_at": "2026-08-08T12:34:56Z"
}
Verify a transparency inclusion proof
curl -X POST https://verify.confium.org/v1/transparency/inclusion/verify \
-H 'Content-Type: application/json' \
-d '{
"proof": {"sequence": 42, "steps": [...]},
"entry": {"sequence": 42, "artifact_hash": "abc..."},
"root_hash": "def..."
}'
Verify a certificate chain
curl -X POST https://verify.confium.org/v1/pki/cert-chain/verify \
-H 'Content-Type: application/json' \
-d '{
"leaf": "base64-der...",
"anchor": "base64-der...",
"intermediates": ["base64-der..."]
}'
Batch verify
curl -X POST https://verify.confium.org/v1/batch/verify \
-H 'Content-Type: application/json' \
-d '[
{"message": "aGVsbG8=", "signature": "..."},
{"proof": {...}, "entry": {...}, "root_hash": "..."}
]'
Client SDKs
The HTTP API is plain JSON; any HTTP client works. First-party bindings:
| Language | Package | Notes |
|---|---|---|
| Rust | confium-verify-server crate |
Native Rust client |
| TypeScript | @confium/verify-client (in progress) |
Browser + Node |
| Python | confium.verify_client (in progress) |
Sync + async |
| Ruby | Confium::Verify::Client (in progress) |
Sync |
| Go | crates.io/crates/confium-go/verify (in progress) |
Stdlib-only |
Errors
| HTTP | Cause | Body |
|---|---|---|
| 400 | Invalid request shape | {"error": "...", "detail": "..."} |
| 429 | Rate limited (if you add a rate limiter) | {"error": "rate_limited"} |
| 500 | Internal verification error | {"error": "internal"} |
OpenAPI spec
The full spec lives at docs/api/verify-server.openapi.yaml. Use it to generate client SDKs:
# Generate TypeScript client
npx openapi-typescript-codegen --input verify-server.openapi.yaml --output ./generated
# Generate Python client
openapi-generator-cli generate -i verify-server.openapi.yaml -g python -o ./generated/python