Is this person who their card says they are?
Send a candidate a link. On their phone they show their face and their Ghana Card. You get a verdict, and the reasons behind it.
Try the whole flow in test mode first, with a test key.
Example result
- Live checkPass
- Face matchPass
- Card numbersPass
- Name and datesPass
- ExpiryPass
From link to verdict in four steps
Your app makes one API call. The candidate does the rest on their phone.
-
1
Your app asks for a verification
One call with your API key creates it. You get a link that works for that one candidate and expires.
-
2
The candidate opens the link
They read what is collected and agree to it before any photo is taken.
-
3
They show their face and their card
They blink and turn their head when asked, then photograph the front and back of the card. A photo that is too dark or blurry is sent back with a tip.
-
4
You read the result
VeriKit runs the checks and your app fetches the verdict. The candidate's last screen only says Submitted.
The candidate never sees the verdict, so nobody can learn which check caught them and try again with that in mind.
Seven checks, each with a reason in plain words
Every check ends in pass, flag or can't tell, and carries a sentence that anyone on your team can understand.
Live check
The person blinks and turns their head when asked. The order and the timing are random, and only one face may be in view.
A still photo, or a recording that cannot know what comes next.
Face match
The live selfie against the photo printed on the card.
Someone holding another person's card.
Card numbers
The check digits in the three lines on the back of the card.
Numbers that do not add up, because they were misread or changed.
Date of birth
The date on the front of the card against the date on the back.
Details that disagree with each other.
Name
The name on the front against the name on the back, forgiving small reading slips.
A card whose two sides name different people.
Expiry
The expiry date on the back of the card.
Cards that are out of date.
Camera
The name of the camera that captured the face.
Camera names that match virtual camera software.
Three verdicts. Nothing passes on a guess.
When a check cannot tell, it says so and the case goes to a person. A missing answer never counts as a pass.
A page for every case, so your team can see why
- Plain reasons. Each step of the check reads as a sentence, not a code.
- Your reference, not names. Cases are listed by the reference your app sent, so the dashboard does not turn into a list of people.
- In progress is visible. A case that is still being worked on is marked as such and never shows up as a failure.
- Unclear cases cannot hide. Anything that needs a person is marked Review.
Needs review
interview-2291
Face match is in the middle (61%). A person should look.
- Live checkBlinked and turned as asked
- Face match61%, in the middle
- Card numbersAll check digits are correct
- Name and datesFront and back agree
- ExpiryCard is in date
Create, send the link, read the result
Three calls with a bearer key. Everything is JSON.
- Test keys and live keys. Run the whole flow with a test key before you go live.
- Safe retries. Send an Idempotency-Key and a repeated call returns the same verification instead of making a second one.
- Send them back to you. Give a return_url and the candidate's last screen gets a Continue button that goes there.
- Webhooks are on the way. Until then, ask for the result every few seconds.
curl -X POST {API_BASE}api/v1/verifications/ \
-H "Authorization: Bearer $VERIKIT_KEY" \
-H "Idempotency-Key: signup-1001" \
-H "Content-Type: application/json" \
-d '{"external_ref": "user-1001",
"return_url": "https://yourapp.com/interview/42"}'
201
{
"id": "6f1c2d9e-...",
"status": "pending",
"external_ref": "user-1001",
"reused": false
}
curl -X POST {API_BASE}api/v1/verifications/6f1c2d9e-.../session/ \
-H "Authorization: Bearer $VERIKIT_KEY"
201
{
"verification_id": "6f1c2d9e-...",
"status": "pending",
"verification_url": "https://.../verify/<token>/",
"expires_at": "2026-10-30T10:30:00Z"
}
curl {API_BASE}api/v1/verifications/6f1c2d9e-.../ \
-H "Authorization: Bearer $VERIKIT_KEY"
200
{
"status": "complete",
"verdict": "pass",
"checks": [
{ "name": "face_match", "answer": "pass",
"reason": "Face match is high (92%)." },
...
],
"card_holder": { "full_name": "AMA SPECIMEN", ... },
"face_signature": { "jaw_to_eye_ratio": 1.67, ... }
}
The face at check-in becomes a signature your app can keep
While the candidate does the live check, we measure the proportions of their face. Five ratios, each one length divided by another.
- Face width divided by eye distance
- Nose to chin divided by face width
- Face height divided by face width
- Eye width divided by eye distance
- Nose width divided by face width
Because they are ratios, they stay the same when the person sits closer to the camera or farther from it. An app that keeps watching after check-in, such as an interview platform, can measure the same way later and compare.
A difference is a reason to look closer, not proof. Pair it with other signals, such as no face in view or more than one.
What candidates agree to, and what you can see
Consent comes first
The candidate reads what is collected and agrees before any photo is taken.
Only your company can read a result
A verification opens only with the key of the company that created it. Anyone else is told it was not found.
Names stay out of the dashboard
The console lists your own reference. A name appears only in the API result, and only when both sides of the card agree on it.
Run a test verification today
Create an account, make a test key and send yourself a link.