# Öffentliche API

> publicApi() — Ausweisprüfung, das öffentliche Profil eines Vereins, Steuernummer, öffentliche Schlüssel. Ohne Zugangsdaten.

URL: https://developers.vimine.network/de/sdk/public/

```js
import { publicApi } from '@vimine/sdk';
const api = publicApi();                       // oder vimine.public / vimineServer.public
```

Die Endpunkte, die weder Zugangsdaten noch eine Anmeldung brauchen. Verwendbar von jeder Seite, von einem Scanner, von einem
Server. `publicApi({ apiUrl?, fetch? })` nimmt dieselben Netzwerkoptionen wie die anderen Klassen.

| Methode | Endpunkt | |
|---|---|---|
| `verifyCard(cardToken)` | `GET /v1/verify/{card_token}` | „Ist dieser Ausweis gerade aktiv?“ — nur Status und Ende der Gültigkeit |
| `association(slug, { locale }?)` | `GET /v1/aps/{slug}` | öffentliches Profil: Erscheinungsbild, Mitgliedsarten mit Beiträgen, geltendes Statuto, wie der Verein Mitglieder aufnimmt, ob er ihre Adresse erfasst (`member_address`) |
| `validateFiscalCode(input)` | `POST /v1/validate/fiscal-code` | Aufbau und Prüfzeichen; mit persönlichen Daten auch deren Übereinstimmung — und was die Steuernummer enthält (`birth_date`, `birth_country`). Für eine im Ausland geborene Person senden Sie `country` |
| `cardKeys()` | `GET /v1/card-keys` | die öffentlichen Schlüssel (JWKS, Ed25519), die Tokens offline prüfen |
| `confirmEnrollment(token, identification?, address?)` | `POST /v1/enroll/confirm` | löst das Token des Links „Bestätigen Sie Ihren Antrag“ ein, der verschickt wird, wenn ein System ein bestehendes Konto aufnimmt; nach einem `409 identification_required` wird es mit `identification` wiederholt, nach einem `409 address_required` mit `address` |
| `events.list(slug, params?)` · `events.get(slug, event, { locale }?)` | `GET /v1/aps/{slug}/events[/{event}]` | die **öffentlichen** Veranstaltungen eines Vereins, mit den freien Plätzen pro Art ([Anleitung](https://developers.vimine.network/de/guides/events/)) |
| `confirmRegistration(token)` | `POST /v1/registrations/confirm` | löst das Token des Links „Bestätigen Sie Ihre Anmeldung“ eines Gasts ein: die Anmeldung, mit dem QR-`token`, wenn bestätigt |
| `viewRegistration(token)` | `POST /v1/registrations/view` | liest den Platz hinter dem eigenen Link eines Gasts (der E-Mail, die den Platz bestätigt): seinen Status und, solange er bestätigt ist, das QR-`token`; funktioniert, bis die Veranstaltung vorbei ist (ab 0.3.2) |

```js
const { status, valid_until } = await api.verifyCard('vmt_…');
// { status: 'active', valid_until: '2027-03-31T22:59:59.000Z' } | { status: 'inactive', reason: 'expired' }

const { aps, membership_types, statuto } = await api.association('your-slug');

const check = await api.validateFiscalCode({ code: 'RSSMRA80A01H501U', first_name: 'Mario', last_name: 'Rossi', date: '1980-01-01', place: 'Roma', country: 'IT' });
// { valid: true, error: null, mismatches: [], hints: [], birth_date: '1980-01-01', birth_country: 'IT' }
// | { valid: false, error: 'mismatch', mismatches: ['date'], hints: [], birth_date: '1980-01-01', birth_country: 'IT' }

const { keys } = await api.cardKeys();   // [{ kty: 'OKP', crv: 'Ed25519', x, kid, use: 'sig', alg: 'EdDSA' }]

const { status, already, association } = await api.confirmEnrollment(token);   // aus dem Link, der per E-Mail kam
// { status: 'pending', already: false, association: { name, slug } } — 400 invalid_token, wenn abgelaufen, 409 statuto_outdated

// 409 identification_required: Das Konto ist nicht identifiziert; err.errors nennt, was fehlt. Fragen Sie danach und wiederholen Sie:
await api.confirmEnrollment(token, { dob: '1985-03-10', birthplace: 'Lyon', birth_country: 'FR' });

// 409 address_required: Der Verein verlangt von jedem Mitglied eine Adresse. Fragen Sie danach und wiederholen Sie (mit der Identifizierung, falls schon angegeben):
await api.confirmEnrollment(token, undefined, { line: 'Via Roma 1', postal_code: '20100', city: 'Milano', province: 'MI' });
```

Die Steuernummer ist optional: `error` ist `invalid`, `mismatch` oder `null`, und `hints` enthält `names_swapped`, wenn die
Steuernummer passt, sobald Nachname und Vorname vertauscht werden. Die Geburtsdaten von `identification` und die Adresse reisen im
Body der Anfrage, nie im Link. Siehe [Mitglieder ohne Steuernummer](https://developers.vimine.network/de/guides/members-without-cf/).

Die Schlüssel ändern sich selten: Speichern Sie sie zwischen und laden Sie sie einmal am Tag neu, oder wenn Sie auf eine unbekannte `kid` stoßen. Der Rest der
Offline-Prüfung steht in [Einbetten und Ausweisprüfung](https://developers.vimine.network/de/guides/embed-and-verify/).

Diese Endpunkte haben ein Limit pro IP (60 Anfragen pro Minute bei Prüfung und Steuernummer): Für größere
Mengen verwenden Sie einen vertraulichen Client mit `verify:read`.
