Documentation d'intégration

API Partenaire

Un canal serveur-à-serveur qui permet à votre application d'inscrire vos participants à une session Streameex AIO — webinaire, formation en ligne ou classe virtuelle — sans qu'ils aient à créer un compte eux-mêmes.

Base
https://api.streameex.com/api/partner
Authentification
En-tête X-API-Key
Format
JSON (UTF-8)
Version
v1

Périmètre

Cette API couvre un besoin précis : amener vos participants dans une session qui existe déjà. Elle ne pilote pas la plateforme.

Ce que l'API fait

  • Créer un compte Streameex à partir d'une adresse email
  • Inscrire ce compte à une session dont vous avez l'identifiant
  • Inscrire jusqu'à 100 participants en un seul appel
  • Consulter une session : date, places restantes, éligibilité

Ce que l'API ne fait pas

  • Créer ou modifier une session — c'est l'organisateur qui la crée
  • Désinscrire un participant
  • Ouvrir une session au nom d'un utilisateur
  • Donner accès à une session payante

Le point à retenir

Vous ne créez pas la session. L'organisateur la crée depuis son espace Streameex, puis vous transmet son identifiant — une chaîne du type BY2ez8dMiDAbvQiAsPXG. Votre application s'en sert pour y inscrire les participants. Un identifiant de session est stable : vous pouvez le stocker dans votre base en regard de l'événement correspondant.

Sessions éligibles

Une session accepte les inscriptions par API lorsqu'elle est gratuite, qu'elle demande une inscription, qu'elle n'est ni terminée ni annulée, et qu'il reste des places. Une session payante est refusée : son accès suppose un achat en pièces (PCS) que l'utilisateur effectue lui-même — une clé API ne peut pas s'y substituer.

Comment ça marche

  1. 1L'organisateur crée la session dans StreameexIl vous communique son identifiant. Cette étape ne passe pas par l'API.
  2. 2Votre application appelle l'API avec l'email du participantUn seul appel suffit : le compte est créé s'il n'existe pas, puis inscrit à la session.
  3. 3Le participant reçoit ses identifiants par emailMot de passe provisoire, à changer à sa première connexion sur app.streameex.com.
  4. 4Il rejoint la session le jour JDepuis le web ou l'application mobile Streameex AIO, avec ces identifiants.

Votre clé

Streameex vous remet une clé de la forme strx_live_1NXUvMKVU4hORQR3rpzvbSTjzYae0Q5Y2u51xBLVXLw. Elle s'envoie dans l'en-tête X-API-Key à chaque appel.

Cette clé n'est affichée qu'une fois

Streameex n'en conserve que l'empreinte cryptographique et ne peut pas vous la redonner. Stockez-la immédiatement dans votre gestionnaire de secrets. En cas de perte, nous la révoquons et vous en émettons une nouvelle.

Vérifiez votre configuration avec l'appel de diagnostic — il ne modifie rien et confirme que la clé est reconnue :

GET/partner/pingaucun scope requis
curl https://api.streameex.com/api/partner/ping \
  -H "X-API-Key: $STREAMEEX_API_KEY"

Réponse

{
  "ok": true,
  "name": "App Événements Kinshasa",
  "keyPrefix": "strx_live_1NXUvMKV",
  "scopes": ["users:create", "rooms:read", "rooms:register"]
}

Scopes

Chaque clé porte la liste des actions qui lui sont permises. Un appel hors scope renvoie 403.

ScopeAutorise
users:createCréer ou retrouver un compte par email
rooms:readConsulter les informations d'une session
rooms:registerInscrire des participants, à l'unité ou en lot

Si votre clé est restreinte à certaines adresses IP, seuls les appels venant de ces adresses sont acceptés. L'adresse retenue est celle que Streameex constate réellement : un en-tête X-Forwarded-For envoyé par vos soins n'a aucun effet. Communiquez-nous l'adresse de sortie publique de votre serveur, et prévenez-nous si elle change.

Inscrire un participant

C'est l'appel principal de l'intégration. Un seul appel : il crée le compte Streameex si le participant n'en a pas encore, puis l'inscrit à la session.

POST/partner/rooms/{roomId}/registrationsrooms:register
curl -X POST \
  https://api.streameex.com/api/partner/rooms/BY2ez8dMiDAbvQiAsPXG/registrations \
  -H "X-API-Key: $STREAMEEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "jean.kabila@example.com",
    "displayName": "Jean Kabila",
    "phone": "+243812345678",
    "externalId": "crm-4471",
    "customFields": { "entreprise": "Silikin Village", "fonction": "CTO" }
  }'

Réponse — 200

{
  "userId": "kQ7dP2mXbN4vR8sL1wZa",
  "email": "jean.kabila@example.com",
  "displayName": "Jean Kabila",
  "created": true,
  "registrationId": "9fH3kLm2nQpR5tV8wXyZ",
  "registrationStatus": "approved",
  "registered": true
}

Champs de la requête

ChampTypeNotes
emailstringrequisIdentifie le participant. C'est la clé de déduplication.
displayNamestringoptionnelÀ défaut : « firstName lastName », sinon la partie locale de l'email.
firstNamestringoptionnel80 caractères max.
lastNamestringoptionnel80 caractères max.
phonestringoptionnelFormat E.164, indicatif compris : +243812345678
externalIdstringoptionnelVotre identifiant interne, conservé pour vos réconciliations.
customFieldsobjetoptionnelPaires clé/valeur libres, visibles par l'organisateur.

Champs inconnus refusés

Tout champ non listé ci-dessus fait échouer la requête en 400. C'est volontaire : cela vous signale une faute de frappe plutôt que de l'ignorer en silence.

Champs de la réponse

ChampSignification
userIdIdentifiant Streameex du participant.
createdtrue si le compte vient d'être créé, false s'il existait déjà.
registrationIdIdentifiant de l'inscription.
registrationStatusapproved (accès immédiat) ou pending (l'organisateur doit valider).
registeredfalse si le participant était déjà inscrit à cette session.

Ce que voit le participant

Un compte nouvellement créé reçoit par email ses identifiants et un mot de passe provisoire, qu'il devra changer à sa première connexion sur app.streameex.com. Si le participant a déjà un compte Streameex, rien ne lui est envoyé et aucune de ses données n'est modifiée : il est simplement inscrit à la session.

L'API ne renvoie jamais de mot de passe ni de jeton de connexion. Une clé partenaire ne peut pas ouvrir de session au nom d'un utilisateur — c'est une limite de conception, pas une option.

Inscription en lot

Jusqu'à 100 participants par appel. Chaque ligne est traitée indépendamment : une erreur sur l'une n'annule pas les autres.

POST/partner/rooms/{roomId}/registrations/bulkrooms:register
curl -X POST \
  https://api.streameex.com/api/partner/rooms/BY2ez8dMiDAbvQiAsPXG/registrations/bulk \
  -H "X-API-Key: $STREAMEEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "participants": [
      { "email": "alice@example.com", "displayName": "Alice Mbala" },
      { "email": "bruno@example.com", "displayName": "Bruno Ilunga" }
    ]
  }'

Réponse — 200

{
  "total": 2,
  "succeeded": 1,
  "failed": 1,
  "results": [
    {
      "email": "alice@example.com",
      "ok": true,
      "userId": "...",
      "registrationId": "...",
      "created": true,
      "registered": true,
      "registrationStatus": "approved"
    },
    {
      "email": "bruno@example.com",
      "ok": false,
      "error": "Le nombre maximum de participants est atteint."
    }
  ]
}

Réessayez uniquement les lignes ok: false. Le champ error est rédigé pour être affiché à votre équipe : il explique la cause métier (session pleine, email invalide…). En cas d'incident technique de notre côté, il porte un message générique et l'incident est tracé chez nous.

Appelez la consultation de session avant un gros envoi : seatsRemaining vous évite une série d'échecs.

Consulter une session

Lecture seule. Utile pour valider un identifiant, afficher une date, ou vérifier les places restantes avant d'inscrire.

GET/partner/rooms/{roomId}rooms:read
{
  "id": "BY2ez8dMiDAbvQiAsPXG",
  "title": "Webinaire Innovation 2026",
  "status": "scheduled",
  "scheduledAt": "2026-07-22T14:00:00.000Z",
  "registrationRequired": true,
  "pricingModel": "FREE",
  "manualApproval": false,
  "maxParticipants": 100,
  "registrationCount": 12,
  "seatsRemaining": 88,
  "acceptsPartnerRegistrations": true
}

acceptsPartnerRegistrations résume à lui seul l'éligibilité : s'il vaut false, toute inscription sur cette session sera refusée, et les autres champs vous disent pourquoi (session payante, complète, terminée…).

Créer un compte seul

Si votre flux crée les comptes en amont des inscriptions, l'appel POST /partner/users (scope users:create) accepte les mêmes champs d'identité, sans customFields, et renvoie userId, email, displayName et created.

Rejouer un appel

L'API est idempotente sur le couple (email, session). Concrètement :

  • Email déjà connu de Streameex → le compte existant est réutilisé, aucune donnée écrasée (created: false).
  • Participant déjà inscrit → l'inscription existante est renvoyée en 200 (registered: false).

Rejouer une requête après un délai d'attente réseau est donc sans danger : vous ne créerez ni doublon de compte, ni doublon d'inscription, et le participant ne recevra pas un second email. Vous n'avez pas besoin de tenir un registre des appels déjà passés.

Erreurs

Toutes les réponses d'erreur sont en JSON et le champ message est explicite. Il est rédigé en français, à destination de votre équipe technique.

CodeCauseQue faire
400Session payante, complète, terminée ou sans inscription ; corps de requête invalideLire le champ message — il nomme la cause exacte
401Clé absente, inconnue, révoquée ou expiréeVérifier l'en-tête ; nous demander une nouvelle clé
403Scope manquant, ou adresse IP hors de la liste autoriséeNous demander l'ajout du scope ou de l'adresse
404Session introuvableVérifier l'identifiant auprès de l'organisateur
429Quota dépasséRespecter l'en-tête Retry-After

Exemple de corps d'erreur

{
  "statusCode": 400,
  "message": "Cette room est payante — l'API partenaire ne gère que les rooms gratuites.",
  "error": "Bad Request"
}

Quotas

Le quota est compté par clé, pas par adresse IP. Un dépassement renvoie 429 avec les en-têtes Retry-After et X-RateLimit-*.

AppelQuota
GET /partner/ping60 / min
GET /partner/rooms/{id}120 / min
POST /partner/users60 / min
POST /partner/rooms/{id}/registrations60 / min
POST /partner/rooms/{id}/registrations/bulk10 / min

Pour une liste importante, préférez l'appel en lot : 10 appels par minute à 100 participants couvrent 1 000 inscriptions par minute.

Sécurité

Votre clé vaut un mot de passe serveur : elle permet de créer des comptes en votre nom.

Côté serveur uniquement

Jamais dans un navigateur, une application mobile, ni un dépôt Git — même privé.

Variable d'environnement

Ou gestionnaire de secrets. Jamais en dur dans le code.

Une clé par environnement

Demandez-nous une clé distincte pour vos tests et pour votre production : révoquer l'une n'interrompt pas l'autre.

Restreignez par IP

Si votre application sort par une adresse fixe. C'est ce qui limite les dégâts si la clé fuite.

En cas de doute, dites-le nous

La révocation est immédiate et nous émettons une clé de remplacement.

Les appels sont journalisés de notre côté : date, adresse IP, action et clé utilisée. Nous pouvons vous fournir cet historique sur demande.

Mise en service

Le parcours d'intégration, dans l'ordre :

  • Stocker la clé reçue dans votre gestionnaire de secrets
  • Valider la configuration avec GET /partner/ping
  • Récupérer l'identifiant de session auprès de l'organisateur
  • Vérifier la session avec GET /partner/rooms/{roomId}
  • Inscrire un premier participant de test avec une adresse que vous contrôlez
  • Confirmer la réception de l'email d'identifiants et la connexion
  • Brancher votre flux réel, à l'unité ou en lot
  • Traiter les codes 400 et 429 dans votre gestion d'erreurs

Une question

Écrivez à contact@streameex.com en précisant le préfixe de votre clé (les caractères visibles, par exemple strx_live_1NXUvMKV) et l'horodatage de l'appel concerné. Cela nous permet de retrouver la trace immédiatement. Ne nous envoyez jamais la clé complète.

Streameex AIO — API Partenaire v1. Document destiné à l'équipe technique de l'intégrateur.