Aller au contenu

API publique

Afficher en Markdown
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)
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)
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.

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.

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.