- Verification
- API reference
Verification API reference
Read public verification data. No key required, rate limited to 100 requests a minute per IP.
Base URL
https://api.jagaan.com/api/v1Health check
GET/health/
Service status and current platform counters.
curl https://api.jagaan.com/api/v1/health/
{
"ok": true,
"service": "jagaan-verification-api",
"version": "1.0",
"timestamp": "2026-06-23T15:30:00Z",
"stats": {
"registered_checks": 12,
"total_requests": 1234
}
}Get a verification
GET/verification/<uid>/
The full record: badge, score, checks, signature material and embed URLs.
curl https://api.jagaan.com/api/v1/verification/V-XXXX/
{
"ok": true,
"uid": "V-XXXX",
"status": "verified",
"badge": {
"slug": "premium",
"name": "Premium Verified",
"icon": "fa-solid fa-shield-check"
},
"score": { "total": "9.60", "max": "9.60", "percent": 100.0 },
"timeline": {
"completed_at": "2026-06-23T15:30:00Z",
"expires_at": "2027-06-23T15:30:00Z",
"days_until_expiry": 335
},
"checks": [
{
"type": "owner_identity",
"label": "Owner Identity",
"status": "auto_verified",
"weight": 1.5,
"final_score": 100.0,
"evidence_count": 2
}
],
"signature": {
"algorithm": "RSA-2048 + HMAC-SHA256",
"rsa_valid": true,
"hmac_valid": true,
"sha256_matches": true,
"signature_valid": true,
"public_key_pem": "-----BEGIN PUBLIC KEY-----..."
},
"public_url": "https://jagaan.com/verification/public/V-XXXX/"
}Response fields
| Field | Type | Description |
|---|---|---|
ok | boolean | True when the request succeeded. |
uid | string | Verification identifier in V-XXXXX form. |
status | string | One of draft, in_progress, manual_review, verified, expired, cancelled, disputed. |
badge.slug | string | One of unverified, partial, verified, premium. |
score.percent | number | Trust score from 0 to 100. |
signature.signature_valid | boolean | True when both the RSA and HMAC signatures verify. |
checks[].status | string | One of auto_verified, manual_review, failed, pending, waived. |
Rate limits
- 100 requests a minute per IP on the verification endpoint.
- 10 requests a minute per IP on the health endpoint.
- Exceeding a limit returns
429with aretry_afterfield. - Responses carry
Cache-Control: max-age=30for edge caching.
Webhooks
Push verification events to your own server. Every delivery is HMAC signed and retried up to five times. Configure endpoints under Verifications in your dashboard.
POST https://your-server.com/webhook
X-Jagaan-Event: verification.completed
X-Jagaan-Event-ID: evt_abc123
X-Jagaan-Signature: t=1700000000,v1=<hmac-sha256>
X-Jagaan-Delivery-ID: 12345
X-Jagaan-Attempt: 1
{
"event": "verification.completed",
"verification": {
"uid": "V-XXXX",
"status": "verified",
"score_total": "9.60",
"badge_slug": "premium"
},
"timestamp": 1700000000,
"event_id": "evt_abc123"
}Verify the signature before trusting a payload:
import hmac, hashlib
secret = "your-webhook-secret"
timestamp = "1700000000"
payload = request.body.decode()
expected = hmac.new(
secret.encode(),
f"{timestamp}.{payload}".encode(),
hashlib.sha256,
).hexdigest()
assert hmac.compare_digest(expected, signature_from_header)Other endpoints
| Endpoint | Description |
|---|---|
/metrics | Prometheus metrics: counters, gauges and histograms. |
/verification/<uid>/qr.svg | QR code image linking to the public verification page. |
/verification/<uid>/embed-snippet.js | Badge embed snippet for third party sites. |
/verification/<uid>/certificate.pdf | Signed audit certificate. Owner or staff only. |
/verification/public/<uid>/audit.pdf | Public audit record for a verified property. |
