Developers · CAMARA-compatible · EUDI wallet

Number Verification and KYC Match that verify the person, not the SIM

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

The short answer

What
Two CAMARA-compatible REST APIs: number-verification (is this phone number the person’s?) and kyc-match (do name, birth date, address match?).
Answered from
The PID in the person’s wallet and the phone number the site operator verified for the account – not from the mobile network.
Proves
That the right person confirmed just now with a wallet built to the EUDI ARF – not only that a SIM card is present.
Your service gets
true, false or not_available per field. The personal data stays on the server.
Where
Every EU country, any wallet built to the EUDI ARF, no contracts with mobile operators.

SIM check or person check?

Both approaches use the same API shapes. What they prove is different.

Network check (SIM-based)CodeB wallet check
What is provenA SIM card of this number is in the device that made the requestThe person confirmed with their wallet (fingerprint or PIN) and this number was verified for them
Stolen or lent phonePasses the checkFails: the wallet needs the person’s unlock
SIM swapNeeds a separate SIM-swap checkNot affected: the number belongs to the verified person, not to the SIM
Name, birth date, addressFrom operator customer records where availableFrom the PID in the wallet, the same data as the identity card
CoverageDepends on each operator joiningAny EU wallet built to the EUDI ARF, any network, Wi-Fi included
Data to your serviceMatch resultsMatch results only (yes / no / not available)

How it works

Three-legged, like CAMARA: the person consents, your backend calls the API with the resulting access token.

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.

The person confirms with the wallet

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.

Your backend calls the API

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.

You get yes or no

devicePhoneNumberVerified: true, or per field "true", "false", "not_available". Nothing else leaves the server.

The APIs

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).

Example

# 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"}

OpenAPI (identity APIs) · OpenAPI (platform)

Where the phone number comes from

  • The site operator verifies a person’s number and marks it in the account. The server records who verified it, when, and for which number.
  • If the person changes the number, the verification is removed automatically.
  • The person can add the number to the wallet as the card “Verified phone number” (SD-JWT and ISO mdoc, valid one year). The card is revoked automatically when the number changes or the verification is removed.

Also for people on a call: Verify caller

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.

Privacy by design

  • KYC Match answers only true, false or not available; the values from the PID are never sent. Addresses are compared as a whole, so a request cannot test many variants at once.
  • One wallet confirmation allows at most 5 calls per API within 15 minutes; then the person has to confirm again. Only sign-in clients registered on the site can call them; the site admin can limit each API to chosen clients or switch it off.
  • No contracts with mobile operators and no network data: the check does not depend on SIM, roaming or location.
  • Each answer is written to the tenant’s audit log with the client and the result count, not with the values.
  • Runs on your own CodeB tenant in the EU.

Honest limits

  • The phone number is as good as the operator’s verification of it. Today it is verified by the site operator, not confirmed by a mobile network.
  • KYC Match needs a wallet that presents a PID. Fields the PID does not contain are answered not_available.
  • The API shapes follow CAMARA; it is not a mobile-network API and not a CAMARA-certified service. If you also need to know that a specific SIM is in a device, combine it with a network check.

Frequently asked questions

What are the CAMARA Number Verification and KYC Match APIs?

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.

How is the CodeB version different?

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.

Does my service see the identity data?

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.

Which wallets work?

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.

Do I need contracts with mobile operators?

No. The check runs between the person’s wallet and your CodeB tenant, in every EU country and on any network.

Can I migrate from a network-based Number Verification integration?

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.

Start with one API call

Set up an OIDC client on your tenant, add the scopes and call the API with the access token.