Einbau

Eine Zeile im Shop, ein Aufruf auf Ihrem Server

EdelVerify prüft das Alter und gibt Ihrem Shop genau eine Auskunft zurück: alt genug, ja oder nein — gegen 16 oder gegen 18, je nachdem, was Ihre Ware verlangt. Diese Seite beschreibt den Einbau vollständig — inklusive Testschlüsseln, mit denen Sie die Einbindung heute bauen und prüfen können.

Wie es zusammenspielt

Der Einbau besteht aus zwei Hälften, und die Trennung ist der eigentliche Entwurf:

Im Browser läuft die Bedienung — ein Fenster mit QR-Code, das Ihre Kundschaft durch die Prüfung führt. Das ist Anzeige, und Anzeige lässt sich mit den Entwicklerwerkzeugen umgehen.

Auf Ihrem Server sitzt der Riegel. Vor dem Bestellabschluss lösen Sie den Nachweis ein. Erst dieser Aufruf ist bindend. Wer ihn weglässt, hat eine hübsche Schranke ohne Schloss.

Geprüft wird über die staatliche E-ID (swiyu) oder — sobald die App in den Stores ist — über den Chip im Ausweis. Für Ihre Einbindung macht das keinen Unterschied: Die Schnittstelle bleibt dieselbe, nur der Weg dahinter ändert sich.

Testbetrieb ohne Wallet

Die produktive E-ID des Bundes startet voraussichtlich Ende 2026. Damit Sie Ihre Einbindung nicht bis dahin aufschieben müssen, gibt es Testschlüssel: Sie erkennen sie am Anfang pk_test_ und sk_test_.

Eine Prüfung mit Testschlüssel spricht den Prüfdienst des Bundes gar nicht erst an. Sie steht vier Sekunden auf PENDING — damit Ihre Abfrageschleife wirklich durchläuft — und nimmt dann den Ausgang, den Sie bestellt haben.

curl -X POST https://verify.edelbyte.ch/api/v1/verifications \
  -H "Authorization: Bearer sk_test_…" \
  -H "content-type: application/json" \
  -d '{"reference":"warenkorb-4711","min_age":16,"test_outcome":"under_18"}'

min_age ist optional und nimmt die Zahl 16 oder 18. Ohne Angabe gilt die Vorgabe Ihres Shops, ab Werk 18. Im Beispiel oben prüft der Testlauf gegen 16 und liefert jemanden, der auch das nicht erreicht.

test_outcomeErgebnis
successVorgabe. status SUCCESS, age_ok true, Nachweis wird ausgestellt — gegen die Grenze, die Sie mit min_age bestellt haben.
under_18status SUCCESS, age_ok false, kein Nachweis. Der Name ist geblieben, die Bedeutung ist jetzt «unter der bestellten Grenze» — bei einer Prüfung ab 16 also unter 16. Der Fall, den Ihre Einbindung am seltensten sieht und am dringendsten können muss.
failedstatus FAILED mit error_code test_failed — die Wallet hat abgebrochen.
expiredstatus EXPIRED — niemand hat die Prüfung abgeschlossen.

Ein unbekannter Wert wird mit 400 invalid_test_outcome abgewiesen und nicht stillschweigend zu «success» geglättet. Wer sich bei under_18 vertippt, soll es merken.

Die beiden Welten berühren sich nie

Ein Nachweis aus dem Testbetrieb lässt sich mit einem Live-Schlüssel nicht einlösen, und umgekehrt. Eine Prüfung, die mit pk_test_ begonnen wurde, ist für einen Live-Schlüssel schlicht unbekannt. Entschieden wird das ausschliesslich am Schlüssel — nie an einem Feld, das Sie mitschicken.

Schritt 1 — im Shop

Eine Zeile ins Layout, vor dem schliessenden Body-Tag:

<script src="https://verify.edelbyte.ch/v1/gate.js"
        data-key="pk_test_…"
        data-callback="/wp-json/edelverify/v1/confirm"
        defer></script>
AttributBedeutung
data-keyPflicht. Ihr öffentlicher Schlüssel. Er darf im Quelltext stehen.
data-callbackAdresse auf Ihrem Server, an die nach Erfolg die Kennung gemeldet wird.
data-accentAkzentfarbe des Fensters. Vorgabe #0f62d6.
data-titleÜberschrift im Fenster.
data-langde, fr, it oder en. Vorgabe de.
data-min-age16 oder 18. Die Vorgabe für alle Auslöser, die keine eigene Grenze mitbringen. Fehlt das Attribut, schickt das Skript gar keine Grenze mit — dann gilt die für Ihren Shop hinterlegte, ab Werk 18. Eine bestehende Einbindung ändert ihr Verhalten dadurch nicht.
data-test-outcomeNur mit Testschlüssel. Bestellt den Ausgang für alle Prüfungen dieser Seite: success, under_18, failed oder expired. Damit lassen sich die vier Fälle im Shop durchspielen, ohne den Aufruf selbst zu bauen.

Ausgelöst wird über ein Attribut am Knopf — kein eigener JavaScript-Code nötig. Verlangt die Ware nur 16, kommt die Grenze an den Knopf und sticht die Vorgabe am Skript-Tag:

<button data-edelverify
        data-edelverify-reference="warenkorb-4711"
        data-edelverify-min-age="16">
  Alter bestätigen
</button>

Wer den Ablauf selbst steuern will, ruft window.EdelVerify.open() auf. Zurück kommt ein Promise:

const { verified, id } = await window.EdelVerify.open({
  reference: 'warenkorb-4711',
  min_age: 16,
  test_outcome: 'under_18', // nur mit Testschlüssel
})

min_age und test_outcome gelten für diesen einen Aufruf und gehen den Attributen am Skript-Tag vor. Ohne test_outcome nimmt eine Testprüfung immer den glücklichen Ausgang — bauen Sie Ihre Einbindung deshalb nicht ohne: der Fall, den Sie sehen müssen, ist under_18.

Zusätzlich meldet das Skript jeden Schritt am document: edelverify:started, edelverify:verified, edelverify:stored, edelverify:failed, edelverify:error und edelverify:closed. Das ist der Weg für Systeme, in denen sich kein data-callback setzen lässt.

«verified» ist nicht der Moment zum Neuladen

verified sagt: die Prüfung ist bestanden. Es sagt nicht, dass Ihr Server davon weiss — die Rückmeldung an data-callback läuft in diesem Augenblick erst los. Wer hier neu lädt, bricht sie ab. Der Nachweis wird nur einmal ausgeliefert und ist damit verbrannt: Die Seite kommt mit derselben Schranke zurück, und für Ihre Kundschaft sieht es aus, als hätte die Prüfung nichts bewirkt.

Warten Sie stattdessen auf edelverify:stored. Das feuert, sobald Ihre Route die Kennung angenommen hat — oder sofort, wenn Sie gar kein data-callback gesetzt haben und den Stand selbst abholen.

Das Fenster hängt in einem eigenen Shadow DOM. Ihr Shop-CSS kann es nicht verschieben, und es kann Ihres nicht durcheinanderbringen.

Schritt 2 — auf Ihrem Server

Der Browser meldet Ihnen nur die Kennung der Prüfung. Alles Weitere macht Ihr Server mit dem geheimen Schlüssel — er verlässt Ihren Server nie.

a) Nachweis abholen. Direkt nachdem der Browser die Kennung gemeldet hat:

GET https://verify.edelbyte.ch/api/v1/verifications/<id>
Authorization: Bearer sk_test_…

→ { "status": "SUCCESS", "min_age": 18, "age_ok": true, "over_18": true,
    "proof": "av_…", "proof_expires_at": "2026-09-13T…" }

over_18 beantwortet nicht die Frage, die Sie stellen

over_18 ist nur dann true, wenn gegen 18 geprüft wurde. Haben Sie mit min_age: 16 gefragt, steht dort false — auch wenn die Person in Wirklichkeit dreissig ist. Das ist kein Fehler, sondern Datensparsamkeit: Sie haben nach 16 gefragt, also erfahren Sie nur, ob 16 erreicht ist.

Massgeblich für Ihre Ware sind deshalb age_ok und min_age zusammen: age_ok sagt, ob die Grenze erreicht ist, min_age, welche Grenze das war. Wer nur over_18 abfragt, weist bei einer 16er-Prüfung jede Bestellung ab.

Der Nachweis kommt genau einmal

Er entsteht im Moment des Übergangs auf SUCCESS und wird nur in dieser einen Antwort ausgeliefert. Legen Sie ihn sofort ab — in der Sitzung, im Kundenkonto oder in einem HttpOnly-Cookie. Geht er verloren, muss die Kundschaft erneut prüfen.

b) Nachweis einlösen. Vor jedem Bestellabschluss. Das ist der Riegel:

POST https://verify.edelbyte.ch/api/v1/proofs/verify
Authorization: Bearer sk_test_…

{ "proof": "av_…", "min_age": 16 }

→ { "valid": true, "min_age": 18, "required_min_age": 16, "over_18": true,
    "expires_at": "2026-09-13T…", "reference": "warenkorb-4711" }

Beim Einlösen sagt min_age, was die Ware verlangt. Ohne Angabe gilt 18. Zurück kommen beide Zahlen: min_age ist die Grenze, gegen die der Nachweis ausgestellt wurde, required_min_age die, gegen die eingelöst wurde. Im Beispiel oben deckt ein Nachweis ab 18 eine Ware ab 16 ab.

Ein Nachweis ab 16 löst keine Ware ab 18 ein; ein Nachweis ab 18 löst Ware ab 16 ein. Der Vergleich läuft in eine Richtung, und zwar auf unserer Seite — Sie müssen nichts nachrechnen. Wer beim Einlösen gar kein min_age mitschickt, prüft gegen 18: Ein 16er-Nachweis kommt dann als valid: false zurück.

Sobald der Schlüssel angenommen ist, antwortet dieser Aufruf immer mit HTTP 200; ob der Nachweis taugt, steht in valid. Das ist Absicht: Ein 4xx an dieser Stelle verleitet Einbindungen dazu, den Fehlerfall als «Dienst kaputt, durchlassen» zu behandeln. Auch die zu niedrige Altersstufe ist deshalb kein Fehler, sondern valid: false.

Davor steht die Anmeldung. Die läuft vor der 200-Regel: Ein unbekannter, zurückgezogener oder falscher Schlüssel wird mit 401 unauthorized abgewiesen, und ein öffentlicher pk_-Schlüssel gilt hier als falsche Art — auch er bekommt 401. Die 200-Regel gilt also für die Antwort auf Ihren Nachweis, nicht für die Anfrage an sich. Ein 401 heisst blockieren, nicht durchlassen: Wenn der Schlüssel nicht stimmt, ist überhaupt nichts geprüft.

Im Zweifel blockieren

Kein Nachweis, kein Netz, kein Schlüssel — in jedem dieser Fälle gehört die Bestellung angehalten, nie freigegeben. Der Schaden einer abgewiesenen Bestellung ist ein verärgerter Kunde. Der Schaden einer durchgelassenen ist eine Anzeige.

Die Schnittstelle

Vier Endpunkte. Der Schlüssel geht als Authorization: Bearer … oder x-api-key.

EndpunktSchlüsselZweck
POST /api/v1/verificationspk oder skPrüfung beginnen. Optional min_age. Zurück: id, deeplink, expires_at, min_age. Die Prüfung verfällt nach 10 Minuten.
GET /api/v1/verifications/:idpk oder skStand abfragen: status, min_age, age_ok, over_18. Mit sk zusätzlich der Nachweis — einmalig.
POST /api/v1/proofs/verifynur skNachweis einlösen, optional gegen min_age. Der Riegel. Ohne CORS — gehört auf den Server.
GET /api/v1/verifications/:id/qr.svgkeinerQR-Code als Bild, direkt als img einbindbar. Nur solange die Prüfung läuft.

qr.svg gilt nur, solange die Prüfung läuft

Das Bild gibt es ausschliesslich im Zustand PENDING. Sobald die Prüfung abgeschlossen oder verfallen ist, antwortet die Adresse mit 404 als schlichtem Text — kein Bild. Das ist Absicht: Ein QR-Code, der ins Leere führt, gehört nicht an eine Bestellseite.

Für Ihre Einbindung heisst das: Ein <img>, das nach dem Erfolg stehen bleibt, läuft auf ein kaputtes Bild. Nehmen Sie es weg, sobald der Stand nicht mehr PENDING ist.

status ist einer von PENDING, SUCCESS, FAILED oder EXPIRED. Achtung: SUCCESS heisst «die Prüfung ist abgeschlossen», nicht «alt genug». Massgeblich sind age_ok und min_age.

Zwei Altersstufen. min_age nimmt die Zahl 16 oder 18 — nicht die Zeichenkette "18". Alles andere, auch 17 oder 21, wird mit 400 invalid_min_age abgewiesen; wir raten nicht, was gemeint war. Lassen Sie das Feld weg, gilt die für Ihren Shop hinterlegte Vorgabe, ab Werk 18.

over_18 bleibt für bestehende Einbindungen erhalten, beantwortet aber ausschliesslich die 18er-Frage: Bei einer Prüfung gegen 16 steht dort false, unabhängig vom tatsächlichen Alter. Neue Einbindungen lesen age_ok zusammen mit min_age.

Herkunftsprüfung. Für den öffentlichen Schlüssel lässt sich hinterlegen, von welchen Adressen er benutzt werden darf. Solange für Ihren Shop keine Adresse hinterlegt ist, wird jede Herkunft angenommen — auch eine fremde, und auch gar keine. Erst mit dem ersten Eintrag greift die Sperre, und dann antwortet die Schnittstelle jeder nicht gelisteten Herkunft mit 403 origin_not_allowed.

Das ist so gebaut, damit eine neue Einbindung nicht an einer Kleinigkeit scheitert, bevor sie je lief. Vor dem Kundenbetrieb gehört die Liste aber gefüllt — sonst kann jede beliebige Seite Prüfungen auf Ihren Schlüssel beginnen. Diese Einstellung nehmen wir für Sie vor — sagen Sie uns Adresse und gewünschte Grenze. Einen Selbstbedienungszugang gibt es heute noch nicht.

Ein Nachweis gilt standardmässig 30 Tage und ausschliesslich bei dem Shop, für den er ausgestellt wurde.

Fehlerschlüssel

SchlüsselHTTPBedeutung
unauthorized401Schlüssel unbekannt, zurückgezogen oder von der falschen Art.
origin_not_allowed403Für Ihren Shop ist eine Herkunftsliste hinterlegt, und die aufrufende Herkunft steht nicht darin. Ist die Liste leer, tritt dieser Fall nie auf.
not_found404Unbekannte Prüfung — oder eine aus der jeweils anderen Welt.
invalid_test_outcome400Unbekannter Wert in test_outcome.
invalid_min_age400 bzw. 200min_age ist nicht die Zahl 16 oder 18. Auch "18" als Text, 17, 21, null und 0 fallen darunter. Bei POST /verifications als 400, bei POST /proofs/verify als error_code im 200er-Rumpf.
simulation_mode503Der Dienst ist ohne angebundene Prüfstelle konfiguriert und stellt deshalb keine Nachweise aus. Auf verify.edelbyte.ch tritt das nicht auf.
verifier_unavailable502Die Prüfstelle ist nicht erreichbar.

Ein Sonderfall, damit Sie ihn nicht suchen: Beim Einlösen über /api/v1/proofs/verify gibt es für eine zu niedrige Altersstufe kein 4xx. Sobald der Schlüssel angenommen ist, antwortet dieser Aufruf immer mit 200 — die Absage steht als valid: false im Rumpf, zusammen mit required_min_age.

error_code beim Einlösen. Auch eine unbrauchbare Altersgrenze führt hier zu keinem 4xx: Ein min_age: 17 kommt als 200 zurück, mit valid: false und error_code "invalid_min_age". min_age und required_min_age stehen dann beide auf null — es wurde gar nichts geprüft. invalid_min_age gibt es also an beiden Endpunkten, nur in verschiedener Gestalt.

Das Feld error_code steht in dieser Antwort nur im Fehlerfall. Ein regulärer Einlösevorgang — gültig wie ungültig — liefert es gar nicht mit. Lesen Sie es deshalb als «vorhanden heisst: Ihre Einbindung ist zu reparieren», nicht als Feld, das Sie immer erwarten dürfen. Und behandeln Sie diesen Fall wie jede andere Absage: blockieren.

Webhook

Der Stand lässt sich abfragen — er kommt aber auch von selbst, wenn Sie das wollen. So sparen Sie sich die Abfrageschleife auf Ihrem Server und erfahren das Ergebnis, sobald es feststeht.

Eingerichtet wird der Webhook mit Adresse und Geheimnis. Die Adresse muss https sein. Zugestellt wird als POST mit JSON-Rumpf. Diese Einstellung nehmen wir für Sie vor — sagen Sie uns Adresse und gewünschte Grenze. Einen Selbstbedienungszugang gibt es heute noch nicht.

POST /ihr/endpunkt
X-EdelVerify-Event: evt_…
X-EdelVerify-Signature: t=1786742825,v1=9f86d081…

{ "id": "evt_…", "type": "verification.completed",
  "created_at": "2026-08-15T09:12:44.000Z",
  "verification_id": "ver_…", "mode": "test",
  "status": "SUCCESS", "min_age": 16, "age_ok": true, "over_18": false,
  "reference": "warenkorb-4711", "error_code": null }

Es gibt genau einen Ereignistyp — und er heisst nicht «bestanden»

type ist immer verification.completed. Einen zweiten Typ gibt es nicht, und einen mit «success» oder «succeeded» im Namen hat es nie gegeben. Wer auf einen solchen filtert, verarbeitet niemals etwas.

«Completed» heisst abgeschlossen, nicht «bestanden». Dieselbe Meldung kommt bei SUCCESS, bei FAILED und bei EXPIRED. Wer aus dem blossen Eingang einer Meldung «alt genug» schliesst, gibt bei einer fehlgeschlagenen Prüfung frei. Massgeblich ist status zusammen mit age_ok und min_age: status muss SUCCESS sein, age_ok true, und min_age sagt, gegen welche Grenze das gilt.

created_at ist ein ISO-Zeitpunkt mit Millisekunden 2026-08-15T09:12:44.000Z, nicht …:44Z. Ein Parser, der auf Sekundengenauigkeit festgenagelt ist, stolpert darüber.

X-EdelVerify-Event ist die Kennung der Zustellung — merken Sie sie sich und verarbeiten Sie dieselbe Kennung nur einmal. Wiederholungen sind normal, doppelte Buchungen nicht.

Signatur prüfen. X-EdelVerify-Signature trägt zwei Werte: t ist der Zeitpunkt in Unix-Sekunden, v1 ein HMAC-SHA256 in Hex über die Zeichenfolge "<t>.<roher Rumpf>", mit Ihrem Geheimnis als Schlüssel.

  • Rechnen Sie gegen den rohen Rumpf, so wie er ankam. Wer erst nach JSON wandelt und wieder zurück, bekommt eine andere Zeichenfolge und damit nie eine gültige Signatur.
  • Vergleichen Sie zeitkonstant (hash_equals, crypto.timingSafeEqual), nicht mit ==.
  • Weisen Sie ab, was älter oder neuer als 300 Sekunden ist. Das schliesst die Wiedereinspielung mitgeschnittener Zustellungen aus.

Der Nachweis ist nicht dabei

Im Rumpf steht kein proof, und das bleibt so. Ein Nachweis, der ungefragt an eine Adresse geht, ist ein Nachweis, der abhandenkommen kann. Holen Sie ihn nach der Meldung mit Ihrem sk_-Schlüssel über GET /api/v1/verifications/:id ab.

Und der Webhook bleibt ein Hinweis, kein Riegel. Der Riegel ist und bleibt /api/v1/proofs/verify vor dem Bestellabschluss. Wer eine Bestellung allein aufgrund einer eingegangenen Meldung freigibt, hat die Schranke an die falsche Stelle gehängt.

Die Meldung entsteht beim Abfragen — nicht von allein

Es gibt heute keinen Taktgeber, der Prüfungen im Hintergrund nachschaut. Der Abschluss einer Prüfung wird in dem Augenblick festgestellt, in dem jemand ihren Stand abfragt — über GET /api/v1/verifications/:id. Erst dabei entsteht die Meldung.

Das heisst im Klartext: Schliesst Ihre Kundschaft den Tab, fragt niemand mehr nach. Die Prüfung bleibt offen, und es entsteht gar keine Meldung — auch keine über den Verfall. Ausgerechnet der Fall, für den ein Webhook gedacht ist, ist der, in dem er nicht kommt.

Rechnen Sie deshalb nicht damit, dass eine ausbleibende Meldung «noch offen» bedeutet. Fragen Sie den Stand für eine liegen gebliebene Bestellung einmal serverseitig nach — ein einziger GET mit Ihrem sk_-Schlüssel genügt, und er löst zugleich die Meldung aus, falls sie noch aussteht.

Wiederholungen. Nach 30 Sekunden, 2 Minuten, 10 Minuten, 1 Stunde und 6 Stunden — höchstens sechs Versuche. Als angenommen zählt nur eine 2xx-Antwort; Weiterleitungen werden nicht verfolgt, und nach 10 Sekunden ohne Antwort brechen wir ab. Antworten Sie deshalb sofort mit 200 und arbeiten Sie danach.

Stand je Shop-System

SystemStandWeg
WooCommerceverfügbarPlugin mit Einstellungsseite und Verbindungstest. ZIP herunterladen · läuft im Demo-Shop
Shopware 6gebaut, ungetestetPlugin mit CartValidator als Riegel — greift damit auch bei direktem Zugriff auf die Store-API. Der Weg ist derselbe wie bei WooCommerce.
Magento 2gebaut, ungetestetModul mit Plugin auf CartManagementInterface::placeOrder — greift für Luma, REST und PWA gleichermassen.
Shopifygebaut, nachweislich noch nicht lauffähigTheme App Extension und Webhook-Prüfung. Eine harte Sperre vor Bestellabschluss verlangt dort eine Cart-and-Checkout-Validation-Function und damit Shopify Plus — ohne Plus wird jede Bestellung nachgelagert geprüft und ohne Nachweis vom Versand angehalten. Zwei Einschränkungen, die Sie vor dem Pilotversuch kennen sollten: Der Stand-Abruf forderte den Nachweis nicht an und lief deshalb ausnahmslos auf 409 — behoben, aber noch nie in einem echten Shop gelaufen. Und es gibt keinen OAuth-Weg: Die Rückrufadressen sind nicht gebaut, die App lässt sich heute nur mit einem von Hand angelegten Shop betreiben.
Alles anderesofortDie Schnittstelle ist plattformneutral. Für jedes System, das eine Zeile JavaScript und einen Serveraufruf erlaubt, brauchen Sie kein Plugin.

«Gebaut» heisst nicht «erprobt»

Shopware, Magento und Shopify sind vollständig geschrieben und gegen die echten Quelltexte der jeweiligen Plattform geprüft — jede verwendete Klasse und jede Signatur ist dort nachgeschlagen. Gelaufen sind sie noch in keinem echten Shop. Was das wert ist, zeigt Shopify: Dort fiel beim Nachmessen auf, dass der Stand-Abruf den Nachweis gar nicht erst anforderte und die Gegenstelle deshalb ausnahmslos mit 409 antwortete. Behoben — aber gefunden hat es eine Messung, nicht das Lesen.

Jedes Paket bringt einen Prüfplan mit, der offen auflistet, was ohne laufende Instanz nicht zu klären war, samt dem Befehl zum Nachprüfen. Der erste Shop je Plattform ist ein Pilot, und wir behandeln ihn auch so.

Was heute noch nicht geht

Damit Sie es von uns erfahren und nicht nach der Installation:

Die Technik läuft — Ihrer Kundschaft fehlt noch der Nachweis

Die Kette steht: Ein Live-Schlüssel stellt echte Nachweise aus, die Prüfstelle ist angebunden, und im Demo-Shop können Sie den ganzen Ablauf durchspielen.

Was fehlt, ist die andere Seite. Geprüft wird heute gegen die öffentliche Beta des Bundes, und dort besitzt nur die Beta-ID einen gültigen Nachweis — Ihre gewöhnliche Kundschaft hat schlicht noch nichts vorzuzeigen. Schalten Sie EdelVerify deshalb noch nicht scharf: Eine richtig gebaute Einbindung blockiert im Zweifel, und blockieren würde sie derzeit fast jede Bestellung. Die produktive E-ID wird für Ende 2026 erwartet.

Bauen und prüfen Sie so lange mit Testschlüsseln. Am Tag der Umstellung tauschen Sie zwei Zeichenfolgen aus, sonst nichts.

  • Genau zwei Altersstufen. 16 und 18 — die beiden, die das Schweizer Recht kennt. Ein anderer Wert in min_age wird abgewiesen, nicht gerundet. Brauchen Sie eine weitere Schwelle, sagen Sie es uns.
  • Die 16er-Stufe ist gebaut, aber noch nicht gegen einen echten Nachweis gemessen. In der Schnittstelle und in allen Paketen ist sie fertig, und im Testbetrieb ist die ganze Kette durchgängig belegt — Prüfung ab 16, Nachweis ab 16, Einlösen ab 16, und die Absage, wenn ein 16er-Nachweis auf Ware ab 18 trifft. Gegen einen echten Nachweis gemessen ist bisher aber nur die 18er-Frage. Ob die Beta-ID des Bundes das Merkmal age_over_16 überhaupt führt, prüfen wir vor dem ersten 16er-Piloten nach. Bauen Sie ruhig schon dagegen; setzen Sie einen 16er-Livebetrieb erst an, wenn wir das bestätigt haben.
  • Ein Nachweis gilt bei einem Shop. Wer mehrere Shops betreibt, braucht je Shop ein eigenes Schlüsselpaar; die Kundschaft weist sich in jedem einmal aus. Das ist datenschutzrechtlich sauber, aber es ist eine Entscheidung und kein Versehen — sagen Sie uns, wenn Sie es anders brauchen.
  • Die Schweizer Identitätskarte hat keinen Chip. Für den Ausweis-Weg brauchen Sie einen Pass oder einen Ausländerausweis. Die biometrische ID wird für Ende 2026 erwartet.

Fehlt Ihnen etwas davon dringend? Schreiben Sie uns — die Reihenfolge richtet sich danach, was Shops wirklich blockiert.