Authentification
Chaque requête porte une clé API en bearer token. Créez vos clés dans Réglages → Développeurs ; la clé complète est affichée une seule fois, à la création, et n'est stockée que sous forme d'empreinte.
curl https://wivly.me/api/v1/passes \
-H "Authorization: Bearer wivly_..." \
-H "Content-Type: application/json" \
-d '{"templateId":"tpl_123","customer":{"name":"Marco"}}'Portées des clés
Chaque clé porte exactement une portée. Choisissez la plus étroite qui fait le travail.
FULLISSUE_ONLYREAD_ONLYLimites de débit
60 requêtes par minute et par clé. Au-delà, l'API renvoie 429 et la requête n'est pas traitée : réessayez après la minute suivante plutôt qu'immédiatement.
Endpoints
Tous les chemins sont relatifs à https://wivly.me/api/v1 et renvoient du JSON.
/passesIssue a pass
Portées: FULL, ISSUE_ONLY
/passes/{serial}Read pass state
Portées: Any
/passes/{serial}Stamp or redeem
Portées: FULL
/passes/{serial}/notifySend a lock-screen message
Portées: FULL
/eventsExport analytics events
Portées: Any
/analytics/venuesCross-venue rollups
Portées: Any
/webhooksList webhooks
Portées: Any
/webhooksRegister a webhook
Portées: FULL
/webhooks/{id}Delete a webhook
Portées: FULL
Webhooks
Enregistrez une URL et Wivly y publie quand quelque chose se produit. Les livraisons sont réessayées en cas d'échec.
Événements
pass.addedpass.removedpass.scannedreward.unlockedreward.redeemedprepaid.soldprepaid.debitedprepaid.low_balanceprepaid.spentVérifier une livraison
Chaque requête porte un en-tête x-wivly-signature : HMAC-SHA256 du corps brut de la requête, avec votre secret de webhook comme clé. Comparez-le aux octets bruts avant tout parsing, avec une comparaison à temps constant.
import { createHmac, timingSafeEqual } from "node:crypto";
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
const received = req.headers["x-wivly-signature"];
const ok =
received.length === expected.length &&
timingSafeEqual(Buffer.from(expected), Buffer.from(received));Idempotence
Chaque livraison porte un id stable dans le corps, avec apiVersion « 2026-01-01 ». Une nouvelle tentative réutilise l'id : stockez-le et ignorez ceux déjà traités.
Erreurs
Les erreurs renvoient un corps JSON avec un message, et un code lorsque c'est utile.
401403404429OpenAPI
La spécification lisible par machine, pour Postman, Swagger, Stoplight ou la génération de code. Publique et sans authentification : elle décrit la surface, pas les données.
Ouvrir la spec OpenAPI →Obtenir une clé
Créez un compte, puis retrouvez les clés API dans Réglages → Développeurs.