Para desarrolladores
API pública de verificación
Toda credencial de OpenChapitas es verificable por terceros sin necesitar cuenta ni depender de que este servidor exista — resolviendo el did:web del emisor y comprobando la firma híbrida (Ed25519 + ML-DSA-65) directamente. Estos son los endpoints públicos y los webhooks para integrar tus propios sistemas.
Verificación
/.well-known/did.jsonDocumento DID del emisor — claves públicas Ed25519 (con histórico de versiones) y ML-DSA-65.
curl https://openchapitas.org/.well-known/did.json
/api/verifyVerifica una credencial firmada (JSON completo en el body). Devuelve validez de cada prueba, si es post-cuántica, y si está vigente/revocada.
curl -X POST https://openchapitas.org/api/verify \
-H "Content-Type: application/json" \
-d '{"credential": <VC firmada>}'/api/credentials/{id}Credencial firmada en JSON-LD (con Accept: application/vc+ld+json) o página pública HTML.
curl https://openchapitas.org/api/credentials/{id} \
-H "Accept: application/vc+ld+json"/status/list-1BitstringStatusList firmada — estado de revocación de todas las credenciales, comprobable offline.
curl https://openchapitas.org/status/list-1
Datos públicos
/api/public/statsConteos agregados sin PII: credenciales vigentes y nº de emisores.
/api/public/orgsDirectorio de organizaciones emisoras con vitrina pública.
/api/public/org/{slug}Perfil de una organización + las insignias que otorga.
Webhooks
Configurables desde tu consola. Cada entrega llega firmada con HMAC-SHA256 (secreto propio de cada webhook). La firma en X-OpenChapitas-Signature (formato sha256=<hex>) cubre timestamp.body, donde el timestamp viaja en X-OpenChapitas-Timestamp. Rechaza la entrega si el timestamp queda fuera de una tolerancia (p.ej. 5 min) para evitar reenvíos (replay), y usa X-OpenChapitas-Id para descartar entregas duplicadas (idempotencia).
credential.issueSe dispara al emitir una credencial.
{"event":"credential.issue","credential_id":"...","achievement_id":"...","status":"valid","url":"https://openchapitas.org/credentials/..."}credential.revokeSe dispara al revocar una credencial.
{"event":"credential.revoke","credential_id":"...","reason":"...","url":"https://openchapitas.org/credentials/..."}Verificación de firma (Node/Python — cualquier librería HMAC-SHA256 estándar sirve):
# Python — rechaza (no uses assert en producción: -O lo elimina)
import time, hmac, hashlib
ts = request.headers["X-OpenChapitas-Timestamp"]
sig = request.headers["X-OpenChapitas-Signature"]
# 1) frescura: descarta reenvíos fuera de la tolerancia (anti-replay)
if abs(time.time() - int(ts)) > 300:
return Response(status=401)
# 2) firma sobre timestamp.body, comparación en tiempo constante
signed = ts.encode() + b"." + body_raw_bytes
expected = "sha256=" + hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, sig):
return Response(status=401)
# 3) idempotencia: ignora si ya procesaste este id
if seen(request.headers["X-OpenChapitas-Id"]):
return Response(status=200)¿Necesitas algo que no está aquí? La API es de solo lectura para verificación pública — la emisión requiere una API key de tu organización (Bearer token), disponible desde la consola.