Send the person to sign in
Your site starts a normal OpenID Connect authorization code flow on your CodeB tenant with acr_values=urn:codeb:acr:eudi-wallet and the CAMARA scopes you need.
Developers · CAMARA-compatible · EUDI wallet
Network-based checks such as CAMARA Number Verification prove which SIM card sits in a phone. They do not prove who is holding it. CodeB answers the same two CAMARA APIs – Number Verification and KYC Match – from the person’s EUDI wallet: the person confirms with fingerprint or PIN, and your service learns whether the phone number and the personal data belong to that person. Yes or no, nothing more.
CAMARA API shapes · OpenID Connect · EUDI wallet (PID) · EU-hosted, your own tenant
number-verification (is this phone number the person’s?) and kyc-match (do name, birth date, address match?).true, false or not_available per field. The personal data stays on the server.Both approaches use the same API shapes. What they prove is different.
| Network check (SIM-based) | CodeB wallet check | |
|---|---|---|
| What is proven | A SIM card of this number is in the device that made the request | The person confirmed with their wallet (fingerprint or PIN) and this number was verified for them |
| Stolen or lent phone | Passes the check | Fails: the wallet needs the person’s unlock |
| SIM swap | Needs a separate SIM-swap check | Not affected: the number belongs to the verified person, not to the SIM |
| Name, birth date, address | From operator customer records where available | From the PID in the wallet, the same data as the identity card |
| Coverage | Depends on each operator joining | Any EU wallet built to the EUDI ARF, any network, Wi-Fi included |
| Data to your service | Match results | Match results only (yes / no / not available) |
Three-legged, like CAMARA: the person consents, your backend calls the API with the resulting access token.
Your site starts a normal OpenID Connect authorization code flow on your CodeB tenant with acr_values=urn:codeb:acr:eudi-wallet and the CAMARA scopes you need.
A QR code on the computer, or the wallet opens on the same phone. The person confirms the sign-in with fingerprint or PIN; the wallet presents the PID.
Exchange the code for an access token and call (the wallet confirmation may be at most 15 minutes old) /number-verification/…/verify or /kyc-match/…/match.
devicePhoneNumberVerified: true, or per field "true", "false", "not_available". Nothing else leaves the server.
POST /camara.ashx/number-verification/v0/verifyScope number-verification:verify. Body {"phoneNumber":"+35699123456"} or {"hashedPhoneNumber":"<sha256 hex>"}. Answer {"devicePhoneNumberVerified":true}.GET /camara.ashx/number-verification/v0/device-phone-numberScope number-verification:device-phone-number:read. Answer {"devicePhoneNumber":"+35699123456"}, or 404 when no number was verified.POST /camara.ashx/kyc-match/v0.3/matchScope kyc-match:match. Send any of givenName, familyName, name, familyNameAtBirth, birthdate, gender, address, streetName, streetNumber, postalCode, locality, region, country, email (and optionally phoneNumber). Each field is answered "true" | "false" | "not_available".GET /camara.ashx/openapi.jsonOpenAPI 3.1 description of these APIs. The complete platform description is at /openapi.json.Which clients may callOn by default: every OIDC client registered on the site can call the APIs as soon as it asks for the scope. The site admin can limit each API to chosen clients or switch it off on the admin page “CAMARA identity APIs”; refused calls get 403. At most 5 calls per API per wallet confirmation (429 after that).# 1. Send the person to the wallet sign-in (your OIDC client on the tenant)
GET <authorization_endpoint from https://<tenant>/.well-known/openid-configuration>?response_type=code&client_id=<your-client>
&redirect_uri=<your-callback>&scope=openid%20number-verification:verify%20kyc-match:match
&acr_values=urn:codeb:acr:eudi-wallet&state=<state>&code_challenge=<S256>&code_challenge_method=S256
# 2. After the code exchange: is +35699123456 this person's number?
curl -X POST https://<tenant>/camara.ashx/number-verification/v0/verify \
-H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \
-d '{"phoneNumber":"+35699123456"}'
{"devicePhoneNumberVerified":true}
# 3. Do name and birth date match the identity card in the wallet?
curl -X POST https://<tenant>/camara.ashx/kyc-match/v0.3/match \
-H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json" \
-d '{"givenName":"Maria","familyName":"Keller","birthdate":"1985-04-12"}'
{"givenNameMatch":"true","familyNameMatch":"true","birthdateMatch":"true"}
The same check works without any integration. The person who receives a call opens Verify caller, reads out a 6-digit code, and the caller confirms with the wallet. The person called then sees the verified name – and the verified number if the caller agrees. Any network, any phone, video calls included. A cloned voice or a faked caller ID cannot pass, because the check needs the real person’s wallet.
not_available.CAMARA is an open-source project that defines common APIs for telecom services. Number Verification answers whether a phone number belongs to the device making the request; KYC Match compares customer data with the data a provider holds and answers true or false per field.
It answers the same API shapes from the person’s EUDI wallet instead of the mobile network. That proves the person, not only the SIM card: a stolen or lent phone does not pass, because the wallet needs the person’s fingerprint or PIN.
No. KYC Match returns only true, false or not_available per field, at most 5 times per wallet confirmation. Number Verification returns only true or false. The device-phone-number endpoint returns the verified number only when you asked for that scope and the person agreed.
Any wallet built to the EUDI ARF that can present a PID to the CodeB verifier, for example the CodeB Wallet for Android or the web wallet at myeudi.app.
No. The check runs between the person’s wallet and your CodeB tenant, in every EU country and on any network.
Yes. The request and answer bodies follow CAMARA. Point the client to your CodeB tenant, request the access token with acr_values=urn:codeb:acr:eudi-wallet, and call the same paths under /camara.ashx.
Set up an OIDC client on your tenant, add the scopes and call the API with the access token.