# API publique

> publicApi() — vérification des cartes, profil public d’une association, code fiscal, clés publiques. Sans identifiants.

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

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

Les endpoints qui n’exigent ni identifiants ni connexion. Utilisables depuis n’importe quelle page, depuis un scanner,
depuis un serveur. `publicApi({ apiUrl?, fetch? })` accepte les mêmes options réseau que les autres classes.

| Méthode | Endpoint | |
|---|---|---|
| `verifyCard(cardToken)` | `GET /v1/verify/{card_token}` | « cette carte est-elle active en ce moment ? » — seulement l’état et la fin de validité |
| `association(slug, { locale }?)` | `GET /v1/aps/{slug}` | profil public : identité visuelle, types d’adhésion avec les cotisations, statuto en vigueur, façon d’admettre les membres, recueil ou non de leur adresse (`member_address`) |
| `validateFiscalCode(input)` | `POST /v1/validate/fiscal-code` | structure et caractère de contrôle ; avec les données personnelles, leur cohérence aussi — et ce que contient le code (`birth_date`, `birth_country`). Pour une personne née à l’étranger, envoyez `country` |
| `cardKeys()` | `GET /v1/card-keys` | les clés publiques (JWKS, Ed25519) qui vérifient les jetons hors ligne |
| `confirmEnrollment(token, identification?, address?)` | `POST /v1/enroll/confirm` | consomme le jeton du lien « confirmez votre demande » envoyé quand un système fait adhérer un compte existant ; après un `409 identification_required`, il est répété avec `identification`, après un `409 address_required` avec `address` |
| `events.list(slug, params?)` · `events.get(slug, event, { locale }?)` | `GET /v1/aps/{slug}/events[/{event}]` | les événements **publics** d’une association, avec les places restantes par type ([guide](https://developers.vimine.network/fr/guides/events/)) |
| `confirmRegistration(token)` | `POST /v1/registrations/confirm` | consomme le jeton du lien « confirmez votre inscription » d’un invité : l’inscription, avec le `token` du QR quand elle est confirmée |
| `viewRegistration(token)` | `POST /v1/registrations/view` | lit la place derrière le lien personnel d’un invité (l’e-mail qui confirme la place) : son état et, tant qu’elle est confirmée, le `token` du QR ; il fonctionne jusqu’à la fin de l’événement (depuis 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);   // depuis le lien reçu par e-mail
// { status: 'pending', already: false, association: { name, slug } } — 400 invalid_token quand il a expiré, 409 statuto_outdated

// 409 identification_required : le compte n’est pas identifié ; err.errors nomme ce qui manque. Demandez-le et répétez :
await api.confirmEnrollment(token, { dob: '1985-03-10', birthplace: 'Lyon', birth_country: 'FR' });

// 409 address_required : l’association demande une adresse à chaque membre. Demandez-la et répétez (avec l’identification, si elle a déjà été donnée) :
await api.confirmEnrollment(token, undefined, { line: 'Via Roma 1', postal_code: '20100', city: 'Milano', province: 'MI' });
```

Le code fiscal est facultatif : `error` vaut `invalid`, `mismatch` ou `null`, et `hints` contient `names_swapped` quand
le code correspond une fois le nom et le prénom intervertis. Les données de naissance d’`identification` et l’adresse
voyagent dans le corps de la requête, jamais dans le lien. Voir [Membres sans code fiscal](https://developers.vimine.network/fr/guides/members-without-cf/).

Les clés changent rarement : mettez-les en cache et rechargez-les une fois par jour, ou quand vous rencontrez un `kid`
inconnu. Le reste de la vérification hors ligne se trouve dans
[Intégration et vérification des cartes](https://developers.vimine.network/fr/guides/embed-and-verify/).

Ces endpoints ont une limite par IP (60 requêtes par minute sur la vérification et le code fiscal) : pour des volumes
plus élevés, utilisez un client confidentiel avec `verify:read`.
