Documentation J+SERVICES Guides Référence API

Contrat API editeur de portail TiketMOMO

Authentification

L’editeur appelle les routes avec Authorization: Bearer <token>. Le token est emis par GET /api/v1/clients/portal-editor/handshake, expire en 30 minutes, porte scope: "portal_editor" et est resolu comme une identite client liee.

Bootstrap

GET /api/v1/clients/portal-editor/bootstrap

La reponse conserve tous les champs existants (router, profiles, offers, editorConfig, editorConfigPersisted, importedAt) et ajoute :

{
  "store_slug": "demo-store",
  "router_state": {
    "mode": "ONLINE",
    "source": "ROUTER_LIVE",
    "read_at": "2026-09-29T12:00:00.000Z",
    "allocation_id": "8076cbf5-2a96-4263-8758-73d4aaf04eaa",
    "reason": null
  },
  "router_facts": {
    "serial": "HH40AF7YVNP",
    "identity": "MikroTik",
    "model": "hAP ax3",
    "routeros_version": "7.19.6",
    "mac": "AA:BB:CC:DD:EE:FF"
  },
  "nas_facts": {
    "declared_nas_name": "TM-950",
    "hotspot_servers": ["TM-950"],
    "dns_name": "demo.hotspot.local",
    "local_ip": "192.168.88.1",
    "profiles": [
      {
        "name": "100F-4H",
        "price": 100,
        "timelimit": "4h",
        "validity": null,
        "data_limit": null,
        "voucher_format": null
      }
    ]
  }
}

Modes :

mode source Sens
ONLINE ROUTER_LIVE Les profils ont ete lus directement sur le routeur.
OFFLINE_CACHED DATABASE_CACHE Le routeur est injoignable, les profils viennent du cache de l’allocation.
OFFLINE_CACHED NAS_DECLARATION Le routeur est injoignable et aucun cache profils n’existe ; la derniere declaration NAS fait foi.
MANUAL_REQUIRED NONE Le routeur est injoignable, sans cache et sans declaration NAS.
NO_ROUTER NONE Aucune allocation routeur n’est connue pour ce vendeur.

read_at est l’heure de lecture directe pour ROUTER_LIVE, l’heure connue du cache pour DATABASE_CACHE, et nas_declaration.declared_at pour NAS_DECLARATION.

La lecture directe des profils hotspot ne vaut ONLINE que si le routeur renvoie une liste non vide. Une liste vide ([]) est traitee comme un routeur non joignable, exactement comme une erreur transport : le bootstrap bascule alors vers le cache base, puis vers la derniere declaration NAS, puis vers MANUAL_REQUIRED.

store_slug reprend le slug de boutique charge par le bootstrap, ou null s’il est inconnu. router_facts contient uniquement serial, identity, model, routeros_version et mac : lecture directe quand router_state.mode vaut ONLINE, sinon metadata.router_facts, sinon les verrous routeur de l’allocation quand ils existent. Une valeur inconnue reste null.

nas_facts vient de la derniere declaration NAS stockee sur l’allocation. hotspot_servers vaut [] si la declaration ne les connait pas. profiles reprend store_settings.sales_profiles avec les seules cles name, price, timelimit, validity, data_limit et voucher_format.

Aucun de ces objets ne transporte de secret : pas de mot de passe routeur, pas de cle API, pas de jeton.

Declaration NAS depuis l’editeur

L’editeur reutilise la route existante :

POST /api/v1/clients/tiketmomo/nas-declaration

Il n’existe pas de voie parallele. declaration_id est idempotent : rejouer le meme identifiant renvoie la reponse deja stockee sans reecrire l’etat.

Exemple complet :

{
  "allocation_id": "8076cbf5-2a96-4263-8758-73d4aaf04eaa",
  "declaration_id": "portal-editor-2026-09-29T12:00:00.000Z",
  "declared_at": "2026-09-29T12:00:00.000Z",
  "store_slug": "demo-store",
  "router": {
    "serial": "HH40AF7YVNP",
    "identity": "MikroTik",
    "model": "hAP ax3",
    "routeros_version": "7.19.6",
    "mac": "AA:BB:CC:DD:EE:FF"
  },
  "nas": {
    "declared_nas_name": "TM-950",
    "hotspot_servers": ["TM-950"],
    "local_ip": "192.168.88.1",
    "dns_name": "demo.hotspot.local",
    "walled_garden_present": true
  },
  "profiles": [
    {
      "name": "100F-4H",
      "price": 100,
      "timelimit": "4h",
      "data_limit": null,
      "commercial": true
    }
  ]
}

Les declarations acceptees sont stockees sur remote_access_allocations.metadata : last_declared_at, nas_declaration et router_facts.

Walled garden manuel

GET /api/v1/clients/tiketmomo/walled-garden-script

Retourne le script RouterOS manuel a coller quand le backend ne peut pas joindre le routeur. La route reste protegee par la meme chaine client que la declaration NAS.

Erreurs

Erreurs transport habituelles : 401 token manquant, expire ou invalide ; 403 role interdit ou identite non provisionnee ; 400 validation de corps invalide.

La declaration NAS renvoie les decisions metier en 200 avec status : ALIGNED, RECONCILED ou REFUSED. Meme en REFUSED, le statut HTTP reste 200 ; le client lit status pour distinguer la decision. Un refus porte code, message et parfois details.