Développeurs

API Infrastructure Wivly

Émettez des cartes wallet, tamponnez-les, offrez des récompenses et recevez des webhooks signés. Une surface REST petite et stable, documentée entièrement avant tout paiement.

L'API est incluse à partir de l'offre Scale Up.

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"}}'

Les clés peuvent être limitées à certaines boutiques. Une clé restreinte n'agit que sur les cartes de ces boutiques, ce qui permet de la confier à un seul point de vente.

Portées des clés

Chaque clé porte exactement une portée. Choisissez la plus étroite qui fait le travail.

FULL

Everything below. Issue passes, stamp, redeem, notify, manage webhooks.

ISSUE_ONLY

Issue passes and read. Cannot stamp, redeem or notify — the right scope for a signup form on your own site.

READ_ONLY

GET requests only. The right scope for a reporting job or a dashboard you build yourself.

Limites 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.

POST/passes

Issue a pass

Body: { templateId, customer?: { name?, email? } }. Returns serialNumber, appleUrl, googleSaveUrl. Venue-scoped keys can only issue on their own venues.

Portées: FULL, ISSUE_ONLY

GET/passes/{serial}

Read pass state

Portées: Any

PATCH/passes/{serial}

Stamp or redeem

Body: { action: "stamp" | "redeem", tier?: 0-2 }.

Portées: FULL

POST/passes/{serial}/notify

Send a lock-screen message

Body: { message: string, max 200 chars }. Subject to the org's frequency cap and quiet hours.

Portées: FULL

GET/events

Export analytics events

Query: since (ISO 8601), type. Paginated, 500 per page.

Portées: Any

GET/analytics/venues

Cross-venue rollups

Query: days (1-365, default 30). Per-venue members, visits, repeat rate, redemptions, revenue, plus cross-venue movement.

Portées: Any

GET/webhooks

List webhooks

Secrets are never returned.

Portées: Any

POST/webhooks

Register a webhook

Body: { url, events?: string[] }. The signing secret is shown once, on creation.

Portées: FULL

DELETE/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.spent

Vé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.

401

Clé API manquante ou invalide.

403

Votre offre ou la portée de la clé ne le permet pas. Code : PLAN_LIMIT quand l'offre en est la cause.

404

Carte, modèle ou webhook introuvable, ou appartenant à une autre organisation.

429

Plus de 60 requêtes par minute pour cette clé.

OpenAPI

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.

Transformez vos habitués en habitude.

En ligne en moins d'une heure. Gratuit pour démarrer, sans carte bancaire.

Référence API · Wivly