Quickstart
This is the fastest path to a working verification: drop a script tag in a page, then read the verdict from your own backend.
What you'll have at the end
- A page with the Veridia widget rendered
- A real document + selfie capture flow
- A
verificationIdyour server can look up - A
verdictofapproved,review, orrejectedwith a confidence score
About 10 minutes. Add 10 more if you want to wire up webhooks.
Three steps
- Installation — get your keys, embed the widget on a page
- First verification — run a test verification end-to-end
- Handling results — read the verdict via polling or webhooks
What you'll need
- A Veridia account (sign up here)
- Two API keys from the dashboard's API keys section — a publishable one and a secret one. See below.
- A page where you can drop a couple of script tags (any framework, or plain HTML)
- A real device with a camera for testing
You need two keys, not one
This trips up nearly every first integration, so it comes before anything else.
| Key family | Prefix (test / live) | Where it runs | What it can do |
|---|---|---|---|
| Publishable | qv_pubt_ / qv_pub_ | Browser, mobile app | Start a verification (/v1/verify/init) and submit it (/v1/verify/submit) |
| Secret | qv_sect_ / qv_sec_ | Your server only | Everything above, plus reading verdicts (GET /v1/verify/{id}) |
The publishable key goes in your HTML. It is meant to be visible — the widget can't work otherwise.
The secret key never leaves your server. GET /v1/verify/{id} rejects a publishable key with HTTP 401 and the error code secret_key_required, on purpose: a publishable key sits in your page source, so accepting it there would publish every one of your customers' KYC verdicts to anyone who opens developer tools.
qv_pubt_ and qv_sect_Not qv_pub_test_. The t is inserted into the prefix itself, before the underscore. If you are working in test mode, both of your keys carry that t — a qv_sec_ key does not exist in your test environment and will come back as invalid_api_key.
Use the test pair while you're integrating; switch both keys to the live pair when you ship.
Already integrated something similar?
If you've integrated Stripe Elements, Sumsub, or Onfido before, the mental model is the same:
| Concept | Stripe / Sumsub equivalent | Veridia |
|---|---|---|
| Publishable key | pk_test_* | qv_pubt_* |
| Secret key | sk_test_* | qv_sect_* |
| Frontend widget | Stripe Elements / Sumsub WebSDK | <veridia-widget> |
| Server confirmation | Webhook + signature | Webhook + HMAC-SHA256 |
| Poll status | GET /v1/payment_intents/:id | GET /v1/verify/:id |
The main difference: Veridia's browser side is a single HTML tag — no SDK install or framework wrapper required.
Ready? Step 1 →