ENCLAVE VERIFY

Enclave Verify

API Documentation

REST API reference for integrating identity verification and credential presentation into your product.

Authentication

All API requests must include your API key in the request body as api_key. Keys are prefixed enc_live_ for production and enc_test_ for test mode. Never expose your API key client-side.

Endpoints

Create verification request

Request

POST https://verify.enclave.talk/api/v1/verify/request

{
  "api_key": "enc_live_...",
  "user_identifier": "user@example.com",
  "claims_requested": ["age_18_plus", "identity_verified"],
  "redirect_url": "https://yoursite.com/verified",
  "webhook_url": "https://yoursite.com/webhooks/verify"
}

Initiates a verification request for a user. Returns a URL to redirect the user to.

ParameterTypeRequiredDescription
api_keystringYesYour Enclave Verify API key
user_identifierstringYesUser's email or Enclave user ID
claims_requestedarrayYesClaims to verify. See supported claims below
redirect_urlstringYesWhere to send the user after verification
webhook_urlstringNoEndpoint to receive verification result

Response

{
  "request_id": "a1b2c3d4-...",
  "verify_url": "https://verify.enclave.talk/consent?request=a1b2c3d4",
  "status": "pending_consent",
  "expires_at": "2026-06-06T01:00:00Z"
}

Redirect your user to verify_url. The request expires after 1 hour.

Get request status

Request

GET https://verify.enclave.talk/api/v1/verify/request/:request_id

x-api-key: enc_live_...

Poll the status of a pending verification request.

Response

{
  "request_id": "a1b2c3d4-...",
  "status": "consented",
  "claims": {
    "age_18_plus": true,
    "identity_verified": true
  },
  "certificate_id": "uuid",
  "presented_at": "2026-06-06T00:05:00Z",
  "signature": "base64_ed25519_signature"
}
StatusDescription
pending_consentAwaiting user action
consentedUser approved — claims returned
deniedUser denied the request
expiredRequest expired after 1 hour

Present certificate

Request

POST https://verify.enclave.talk/api/v1/verify/present

{
  "api_key": "enc_live_...",
  "user_identifier": "user@example.com",
  "claims_requested": ["age_18_plus"]
}

Request a credential presentation for a previously verified user. Billed at $0.025 per call.

Response

{
  "certificate_id": "uuid",
  "claims": {
    "age_18_plus": true
  },
  "presented_at": "2026-06-06T00:05:00Z",
  "signature": "base64_ed25519_signature"
}

Only claims the user previously consented to share will be returned.

Validate signature

Request

POST https://verify.enclave.talk/api/v1/verify/validate

{
  "certificate_id": "uuid",
  "claims": { "age_18_plus": true },
  "presented_at": "2026-06-06T00:05:00Z",
  "signature": "base64_ed25519_signature"
}

Validate a presentation signature offline against Enclave's public key. No authentication required. Free — not billed.

Response

{
  "valid": true,
  "issuer": "verify.enclave.talk",
  "verified_at": "2026-06-06T00:05:00Z"
}

Supported claims

ClaimTypeDescription
identity_verifiedbooleanGovernment ID validated
age_18_plusbooleanUser is 18 or older
age_21_plusbooleanUser is 21 or older
name_verifiedbooleanName on document confirmed
nationalitystringISO country code
document_typestringpassport, drivers_license, national_id

Webhooks

Enclave signs every webhook with HMAC-SHA256. Validate the signature before processing.

Verification consented

{
  "event": "verification.consented",
  "request_id": "uuid",
  "claims": {
    "age_18_plus": true,
    "identity_verified": true
  },
  "certificate_id": "uuid",
  "presented_at": "2026-06-06T00:05:00Z",
  "signature": "base64_ed25519_signature"
}

Verification denied

{
  "event": "verification.denied",
  "request_id": "uuid",
  "denied_at": "2026-06-06T00:05:00Z"
}

Signature validation

import crypto from 'crypto'

const sig = req.headers['x-enclave-signature']
const expected = crypto
  .createHmac('sha256', process.env.ENCLAVE_WEBHOOK_SECRET)
  .update(JSON.stringify(req.body))
  .digest('hex')

if (sig !== expected) {
  return res.status(401).json({ error: 'Invalid signature' })
}

Error codes

CodeHTTP StatusDescription
invalid_api_key401API key missing, invalid, or revoked
user_not_found404No Enclave account for this identifier
no_certificate404User has not completed verification
certificate_expired410Certificate expired — user must re-verify
claim_not_available400Requested claim not in user's certificate
request_expired410Verification request expired
insufficient_funds402Billing not set up — connect a payment method in the business dashboard