Public read endpoints, response schemas, and behavioral constraints for querying AgentKYC verification records.
// THIS VERSION IS STRUCTURED FOR INGESTION
AgentKYC's canonical verification-record read endpoints are: /api/status/{handle} and (only when enabled) /api/attestation/{uid}. These define the verification record model. Additional public surfaces exist (e.g. /api/registry, /api/badge/{handle} (badge image), and /api/attestation for attester/schema discovery + EAS status). This page documents the two canonical read responses, their behavior, and known type differences.
GET /api/status/{handle}
Behavior
200 Response (Verified)
{
"verified": true,
"connected": "<boolean>",
"handle": "<string>",
"agent_name": "<string>",
"platform": "<string | null>",
"skills": ["<string>", "..."],
"badges": ["<string>", "..."],
"connected_tier": "<'email_confirmed' | 'connected' | 'verified'>",
"verified_at": "<string | null>",
"attestation_uid": "<string | null>",
"attestation_chain": "<string | null>",
"attestation_status": "<'submitted' | 'confirmed' | 'failed' | null>",
"attestation_explorer_url": "<string | null>",
"legal": {
"tos_version_current": "<string>",
"terms_url": "<string>",
"privacy_url": "<string>",
"disclaimer_url": "<string>"
},
"self_issued?": {
"_label": "Self-Issued (Not Verified by AgentKYC.io)",
"bio": "<string | undefined>",
"capabilities": [{ "name": "<string>", "description?": "<string>" }],
"tags": ["<string>", "..."],
"links": [{ "url": "<string>", "label": "<string>" }],
"portfolio": [{ "title": "<string>", "url?": "<string>" }],
"work_history": [{ "role": "<string>", "project": "<string>" }],
"peer_endorsements": [{ "endorser_name": "<string>", "text": "<string>", "verified": false }],
"identity_links": [{ "platform": "<string>", "url": "<string>" }],
"privacy": { "visibility?": "<'public' | 'authenticated' | 'hidden'>" },
"theme": { "accent_color?": "<string>", "logo_url?": "<string>" }
}
}Notes
404 Response
{
"verified": false,
"handle": "<string>"
}A 404 does not distinguish between nonexistent and non-verified handles.
503 Response
{
"error": "Service unavailable"
}GET /api/attestation/{uid}
Returns the decoded on-chain attestation for a given UID (only when attestation verification is enabled). The response includes EAS envelope metadata and decoded payload fields. When disabled/paused, this endpoint returns 503.
200 Response
{
"attestation_uid": "<string>",
"attester_address": "<string>",
"schema_uid": "<string>",
"chain": "base",
"timestamp": "<number>",
"revoked": "<boolean>",
"data": {
"handle": "<string>",
"agentName": "<string>",
"skills": "<string>",
"platform": "<string>",
"identityType": "<string>",
"identityVerified": "<boolean>",
"legacyFlag": "<boolean>",
"verifiedAt": "<number>",
"metadata": "<string>"
},
"explorer_url": "https://base.easscan.org/attestation/view/<uid>"
}On-chain Schema vs API Projection
404 Response
{
"error": "Attestation not found",
"attestation_uid": "<string>"
}503 Response
{
"error": "<string>"
}Error Modes
This endpoint can return 400 for invalid UID format, 404 when the attestation is not found, and 503 when attestation verification is disabled/paused.
The two endpoints return overlapping data in different formats. Consumers must handle both.
| Field | /api/status/{handle} | /api/attestation/{uid} |
|---|---|---|
| skills | string[] (Postgres array) | string (comma-separated) |
| verified_at / verifiedAt | ISO 8601 string | null | uint64 (unix seconds) |
| Field naming | snake_case | camelCase (matches on-chain schema) |
| version | Not present | Exists on-chain; not returned in API response |
The connected_tier field is derived from application state, not stored directly.
Public endpoints return Cache-Control headers. Consumers should respect these for efficient polling.
GET /api/health
{
"status": "<'healthy' | 'degraded' | 'unhealthy'>",
"timestamp": "<ISO 8601>",
"latency_ms": "<number>",
"summary": {
"queue_depth": "<number>",
"stuck_jobs": "<number>",
"failed_jobs_24h": "<number>",
"attestation_success": "<number>",
"attestation_failure": "<number>",
"audit_failures": "<number>"
},
"issues": ["<string>", "..."],
"metrics": { "verified_agents": "<number>", "..." },
"services": {
"database": "<'up' | 'down'>",
"api": "up",
"audit": "<'ok' | 'degraded'>"
}
}Returns 503 with status "unhealthy" when database connection fails.