Développeurs

Synchronisation

Une copie locale des billets et des bracelets du site, chargée une fois puis tenue à jour.

Votre serveur tient une copie locale des billets et des bracelets du site. Il la charge une fois avec l'instantané, puis la tient à jour avec les changements. C'est avec cette copie que le portique lit les bracelets, et que votre serveur décide quand le réseau tombe.

Instantané

GET/partners/gates/api/v1/gates/entitlements?siteId=…&limit=5000

La première page fixe une version. Les pages suivantes (cursor=<nextCursor>) restent à cette version, même si des billets changent pendant le chargement. La dernière page n'a pas de nextCursor. Une page compte 5 000 porteurs au plus.

{
  "data": {
    "siteId": "0199…",
    "eventId": "0199…",
    "version": 52,
    "items": [
      {
        "holderId": "0199…",
        "kind": "TICKET",
        "reference": "WLE26-959WVM-T01",
        "category": "STANDARD",
        "status": "ACTIVE",
        "entitlements": [
          {
            "sessionId": "0199…",
            "sessionCode": "D1",
            "operationalDay": "2026-12-26",
            "zones": ["PORT"],
            "accessRule": "SINGLE_ENTRY",
            "status": "ACTIVE"
          }
        ],
        "credentials": [
          {
            "kind": "WRISTBAND_UID",
            "value": "6EC387C8",
            "status": "ACTIVE",
            "chip": { "uuid": "3F2A9C1E7B4D4E8FA21C6D5B0E9F7A13", "lot": "0001" },
            "keyA": "112233445566"
          }
        ],
        "version": 48,
        "consumption": []
      }
    ],
    "sessions": {
      "eventId": "0199…",
      "timeZone": "Africa/Porto-Novo",
      "sessions": [
        {
          "sessionId": "0199…",
          "code": "D1",
          "operationalDay": "2026-12-26",
          "opensAt": "2026-12-26T15:00:00.000Z",
          "closesAt": "2026-12-27T03:00:00.000Z"
        }
      ],
      "zones": [{ "code": "PORT", "label": "Port" }]
    },
    "site": {
      "siteId": "0199…",
      "eventId": "0199…",
      "name": "…",
      "active": true,
      "checkpoints": [
        { "checkpointId": "0199…", "name": "Entrée", "type": "ENTRY", "zone": null, "sessionId": null, "active": true }
      ]
    },
    "nextCursor": "eyJ…"
  }
}

sessions et site ne figurent que sur la première page.

ChampSens
items[]un porteur : un billet (TICKET) ou un badge (BADGE)
statusACTIVE, BLOCKED ou CANCELLED ; seul ACTIVE entre
entitlements[]un droit par jour (session) : zones ouvertes, règle d'accès, statut
accessRuleSINGLE_ENTRY : une entrée par jour ; REENTRY : entrées et sorties libres
credentials[]ce que le portique lit ; un bracelet absent de la liste est inconnu
credentials[].statusACTIVE ou BLOCKED : un bracelet bloqué se lit, puis se refuse
credentials[].chipce que les blocs 4 et 5 de la puce doivent contenir, voir Lire un bracelet
credentials[].keyAclé A du bracelet, 12 chiffres hexadécimaux, avec le droit gates:keys
consumption[]les entrées que votre site a déjà remontées, pour reprendre après une perte de données

Changements

GET/partners/gates/api/v1/gates/changes?siteId=…&since=52&limit=1000
{
  "data": {
    "siteId": "0199…",
    "since": 52,
    "headVersion": 57,
    "nextSince": 57,
    "hasMore": false,
    "items": [
      {
        "version": 55,
        "type": "CREDENTIAL",
        "at": "2026-12-26T16:02:11.000Z",
        "holder": { "holderId": "0199…", "…": "état complet du porteur" }
      }
    ]
  }
}
  • Appelez changes en continu, toutes les 2 à 5 secondes, avec since égal à la version de l'instantané, puis au nextSince reçu. Tant que hasMore vaut true, rappelez aussitôt.
  • ENTITLEMENT, CREDENTIAL, BLOCK, UNBLOCK et CANCEL portent l'état complet du porteur dans holder ; SESSION porte sessions ; SITE porte site.
  • Appliquez chaque élément en remplaçant l'état que vous détenez, sans fusion.

Les clés A

Les clés A arrivent avec la synchronisation, il n'y a pas d'autre chargement.

  • L'instantané donne la clé A de chaque bracelet lié.
  • Ensuite, un bracelet lié, remplacé ou bloqué pendant le festival revient dans changes avec sa clé A.
  • La clé A d'un bracelet ne change pas : une clé reçue n'a jamais besoin d'être rechargée.

Si le portique lit un UID absent de votre copie, appelez changes une fois tout de suite avant de conclure : le bracelet vient peut-être d'être lié.

Accusé

Une fois tout appliqué jusqu'à une version, dites-le :

POST/partners/gates/api/v1/gates/acknowledgements
{ "siteId": "0199…", "appliedVersion": 57 }
{ "data": { "siteId": "0199…", "appliedVersion": 57, "publishedVersion": 57, "pendingChanges": 0 } }

L'accusé indique la version réellement en place sur votre site. Il ne change pas ce que vous recevez : changes répond selon le since envoyé. Envoyez-le après chaque lot appliqué.

La version accusée ne recule jamais. WeLovEya suit le retard de chaque site pendant les heures d'ouverture : une alerte s'ouvre si un changement attend depuis plus de 60 secondes, et le site est déclaré injoignable après 120 secondes sans aucun appel.

Reprise

Après une perte de données, repartez d'un instantané. Les entrées que votre site avait remontées reviennent dans consumption.

Sur cette page