Where national wallets stand. The Todis integration is usable and testable today. The eIDAS 2 wallets your users will install are being rolled out across Member States: the regulation sets a deadline of 24 December 2026 for each of them to have an operational verifier registry. In the meantime, test your integration with a proof you already have in hand, or contact us for access to a test wallet: you'll be ready as soon as your users hold a real wallet.

In three steps

1

You authenticate with the token received by email at signup.

2

You ask Todis for a verification: through a guided session with your user's wallet, or directly if you already have their proof in hand.

3

You get a clear verification result, with only the requested information.

Authenticating

Every call uses the token received by email at signup, passed in the Authorization: Bearer <token> header. A missing, invalid, or expired token always returns a 401.

Two ways to integrate

The full flow is the recommended method for the vast majority of integrations. Direct verification remains useful if you already have your user's proof in hand through some other channel.

Full flow (recommended)

You ask Todis to create a verification session, specifying what you want to know (claim):

curl -X POST https://verify.todis.eu/verify/sessions \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "vct": "https://example.eu/credentials/pid",
    "claims": ["age_over_18"],
    "country_code": "FR"
  }'

Todis returns a session identifier and an authorization request to present to your user (QR code or deep link depending on your journey). Their wallet opens it, shows them exactly what is being requested, and sends its response directly to Todis, never to your server.

You then query the session identifier: the response carries a status ("pending", "verified" or "failed") and, once verified, the requested claim:

{
  "status": "verified",
  "claims": { "age_over_18": true }
}

Your application never has to receive or parse a wallet's raw response: it only ever sees this already-verified result.

Direct verification

You've already received your user's proof (SD-JWT VC or mdoc) through some other channel. A single HTTP call gets it verified:

curl -X POST https://verify.todis.eu/verify/sd-jwt-vc \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "presentation": "<proof received from the wallet>",
    "country_code": "FR"
  }'

country_code lets Todis automatically resolve the issuer via the EU's official registry. You can also supply its public key directly with issuer_public_key_pem if you already know it.

Who decides what gets shared

In a European wallet, each piece of information (age, a degree, a status) is separately protected by its own cryptographic proof. The wallet only attaches to its response the proofs for the information the user agreed to share: everything else stays invisible, not just hidden. Todis technically cannot see it, authorized or not.

With the full flow, you decide what information to ask for, through the claims field of your request (for example ["age_over_18"]). Todis passes that request to the wallet, which shows the user a consent screen listing exactly the requested information before they accept. With direct verification, that step has already happened before the proof reaches Todis: you send us an already-built proof, we verify it and return its content as is, without adding or removing anything.

The response

In both cases, you get a clear verification result, with only the information actually disclosed (see the full flow example above). Direct verification responds with a verified field:

{
  "verified": true,
  "claims": { "age_over_18": true }
}

Need the full detail?

Response codes and error cases: see the technical reference. Exact request/response schema: todis.eu/en/docs (Swagger). Still have a question? contact@todis.eu.

The flow end to end

Below, an illustrative representation of the complete flow: from the trigger on your side to the value delivered to your customer, not just the part Todis handles.

1

Your application A visitor tries to buy a bottle of wine on your site: your application triggers an age check.

2

Your application → Todis Your application asks Todis to verify "is over 18"; Todis returns a QR code (or a URL) to show the customer.

3

User's wallet The customer scans the QR code, their wallet shows the request, and they consent.

4

Wallet → Todis The wallet sends its response directly to Todis, never to your application.

5

Todis → your application You retrieve the result:

{
  "status": "verified",
  "claims": { "age_over_18": true }
}
6

Your application The purchase is unlocked immediately, without your application or Todis ever seeing the customer's real date of birth.