Quovalis
PricingDocsSign inGet started

API quickstart

From zero to a verdict in three steps. Base URL and full schemas live in the OpenAPI specification; everything below is the happy path.

Background reading for the terms this page uses: What is a QWAC? · QWAC vs QSealC · How qualified status is determined · Trusted lists and the LOTL · The tri-state verdict · The validation call · API key security

1. Get a key

Create an account, verify your email, then mint a key under API keys in the console. Keys look like qv_<prefix>_<secret> and are shown exactly once — only a hash is stored. Each key can carry an IP allowlist (see API key security).

2. Validate a certificate

POST a PEM certificate (optionally with intermediates) under a policy — POLICY_EIDAS_QWAC_V1 for website-authentication certificates, POLICY_EIDAS_QSEALC_V1 for electronic seals:

curl https://api.quovalis.eu/v1/validations \
  -H "Authorization: Bearer $QUOVALIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "certificate": "-----BEGIN CERTIFICATE-----\n…\n-----END CERTIFICATE-----",
    "chain": ["-----BEGIN CERTIFICATE-----\n…\n-----END CERTIFICATE-----"],
    "policy": "POLICY_EIDAS_QWAC_V1",
    "options": { "checkRevocation": true }
  }'

Request bodies are capped at 256 KiB and chain takes at most 10 intermediates. The response pins the exact trust-list snapshot the verdict was computed against. A field that does not apply is an absent key, never null, and 64-bit integers such as sequenceNumber are JSON strings so no precision is lost:

{
  "id": "0198f3a2-7c11-7000-8000-3f9be1a2c001",
  "verdict": "VERDICT_VALID",
  "policy": "POLICY_EIDAS_QWAC_V1",
  "validatedAt": "2026-07-09T12:00:00Z",
  "certificate": { "subject": "CN=bank.example.com,…", "notAfter": "2027-01-01T00:00:00Z", … },
  "qualified": {
    "isQualified": true,
    "qcType": "QC_TYPE_WEB",
    "trustServiceProvider": { "name": "Example QTSP", "territory": "NL", "serviceStatus": "granted" }
  },
  "psd2": { "roles": ["PSD2_ROLE_PSP_AS", "PSD2_ROLE_PSP_AI"], "ncaId": "NL-DNB", "authorizationNumber": "PSDNL-DNB-123456" },
  "revocation": { "status": "REVOCATION_STATUS_GOOD", "method": "REVOCATION_METHOD_OCSP", "checkedAt": "2026-07-09T12:00:00Z" },
  "trustList": {
    "territory": "NL",
    "sequenceNumber": "87",
    "snapshotId": "0198f3a2-7c11-7000-8000-3f9be1a2c002"
  }
}

Verdicts are tri-state: VERDICT_VALID, VERDICT_INVALID (with a subIndication naming the dominant reason) or VERDICT_INDETERMINATE when the service could not obtain enough data — and an indeterminate result is never silently upgraded (why the third state exists is covered on the tri-state verdict). A validation outcome is always HTTP 200; errors use RFC 9457 problem documents. The result document and its absent-key rules are covered in depth on the validation call, and how the qualified answer is reached on qualified status.

3. Fetch stored results

# Re-served from the stored record — the same document every fetch, never recomputed.
curl https://api.quovalis.eu/v1/validations/0198f3a2-7c11-7000-8000-3f9be1a2c001 \
  -H "Authorization: Bearer $QUOVALIS_API_KEY"

Stored results stay fetchable for up to your plan's retention window — quotas, rate limits and retention per plan are on the pricing page.

More endpoints

Three read-only endpoints round out the API — full schemas in the OpenAPI specification. GET /v1/usage returns your current billing period at a glance: plan, quota, consumed, remaining, overage and your rate limit.

curl https://api.quovalis.eu/v1/usage \
  -H "Authorization: Bearer $QUOVALIS_API_KEY"

GET /v1/trustlist/providers lists the trust service providers and their CA/QC services from the current trust-list snapshot, filterable by territory and paginated with cursor/limit:

curl "https://api.quovalis.eu/v1/trustlist/providers?territory=NL" \
  -H "Authorization: Bearer $QUOVALIS_API_KEY"

GET /v1/trustlist/status reports ingestion health per territory — sequence numbers, snapshot ids, signature checks and staleness — so you can see exactly which trust state verdicts are being computed against:

curl https://api.quovalis.eu/v1/trustlist/status \
  -H "Authorization: Bearer $QUOVALIS_API_KEY"

Errors

All non-2xx responses are RFC 9457 problem documents (application/problem+json) with a type of urn:quovalis:problem:<suffix>; problem bodies carry a requestId to quote at support. A validation outcome is never an error: INVALID and INDETERMINATE verdicts arrive as HTTP 200. The full error table — every type suffix, status and the monthly-window resetAt member — is on the validation call page.

Good to know

  • Validation is not idempotent by design — every call produces a new, billable validation record.
  • A verdict is a technical assessment against published trust-list and revocation data — see the Terms for the documented non-claims.
  • Try certificates interactively in the console playground before writing any code.
NextWhat is a QWAC? →
ContactImprintTermsPrivacyCookiesDPA