API et intégrations
Chaque salle dispose d'une API HTTP. Démarrez et arrêtez des minuteurs, affichez des messages, ajoutez du temps et lisez le déroulé depuis un script, un système de contrôle de spectacle ou tout outil capable d'envoyer une requête web. Un webhook prévient votre système quand un minuteur démarre ou se termine.


Bien démarrer
Créer une clé API
Ouvrez Clés API et cliquez sur Créer une clé. Copiez-la tout de suite : elle n'est affichée qu'une seule fois. Consultez Équipe et clés API.
Trouver l'id de la salle
C'est la partie qui suit /timer/r/ dans l'adresse de la régie, par exemple https://cliqer.io/timer/r/<room>/control.
Envoyer une requête
Envoyez la clé avec chaque requête. ping vérifie que la salle existe.
L'API pilote la même salle que la régie : un appel depuis votre outil s'affiche sur tous les écrans en même temps.
Requêtes
Chaque appel a la forme https://cliqer.io/api/timer/v1/<room>/<action>. GET, POST, PUT et PATCH fonctionnent tous. Les paramètres passent dans la query string, ou dans un corps JSON en POST, PUT et PATCH ; le corps l'emporte quand les deux en contiennent. Les tirets dans le nom de l'action fonctionnent aussi : add-time équivaut à add_time. /api/timer/v0/ accepte les mêmes appels.
Envoyez la clé de l'une des façons suivantes, vérifiées dans cet ordre :
| Emplacement | Exemple |
|---|---|
En-tête Authorization | Authorization: Bearer <key> |
En-tête x-api-key | x-api-key: <key> |
Paramètre de requête api_key | ?api_key=<key>. À éviter autant que possible : les adresses finissent dans les journaux. |
curl -X POST https://cliqer.io/api/timer/v1/<room>/add_time \
-H "Authorization: Bearer $CLIQER_KEY" \
-H "content-type: application/json" \
-d '{"timer_id": "<timer>", "amount": "2m"}'
const res = await fetch('https://cliqer.io/api/timer/v1/<room>/add_time', {
method: 'POST',
headers: { 'authorization': `Bearer ${process.env.CLIQER_KEY}`, 'content-type': 'application/json' },
body: JSON.stringify({ timer_id: '<timer>', amount: '2m' }),
})
const { ok, message, data } = await res.json()
import os, requests
r = requests.post(
"https://cliqer.io/api/timer/v1/<room>/add_time",
headers={"Authorization": f"Bearer {os.environ['CLIQER_KEY']}"},
json={"timer_id": "<timer>", "amount": "2m"},
)
print(r.json())
Clés et permissions
La clé API de votre compte peut tout faire sur les salles dont vous êtes propriétaire. Une salle peut aussi avoir ses propres clés, chacune disposant de tout ou partie de ces trois permissions :
| Permission | Autorise |
|---|---|
| Lecture | Les actions get_ et export. |
| Pilotage | Transport, temps, blackout, On air et messages. |
| Modification | Suppression, import, intents bruts et webhook. |
Un appel qui requiert une permission que la clé n'a pas reçoit 401. Le secret d'une clé de salle n'est affiché qu'une seule fois, à sa création. Pour utiliser l'API, votre forfait doit l'inclure, voir Forfaits et limites.
Actions
timer_id désigne un minuteur par son id ; index le désigne par sa position, en comptant à partir de 1. Si les deux sont envoyés, timer_id l'emporte. Omettez les deux pour agir sur le minuteur en cours.
| Action | Renvoie |
|---|---|
get_room | Titre, date, fuseau horaire et paramètres. |
get_status | Ce qui est en cours. |
get_timers | Le déroulé. |
get_messages | Les messages. |
get_questions | Les questions du public. |
get_connections | Les appareils connectés. |
get_logs | Le journal de la salle. limit, offset. |
export | Toute la salle, en téléchargement cliqer-timer-<room>.json. |
| Action | Paramètres | Effet |
|---|---|---|
start, start_or_stop | timer_id ou index | Démarre, ou bascule. |
stop | Arrête le minuteur en cours. | |
start_fresh | timer_id ou index | Démarre à partir de la durée complète. |
select | timer_id ou index (l'un des deux est requis) | En fait le minuteur courant sans le démarrer. |
reset | timer_id ou index, autostart, from_memory | Revient à la durée complète. |
next, previous | autostart, from_memory | Avance ou recule dans le déroulé. |
add_time, subtract_time | timer_id, amount | Modifie la durée d'un minuteur. |
jump | amount | Fait avancer ou reculer le minuteur en cours de cette durée. |
set_remaining | amount | Définit le temps restant. |
flash | count, message | Fait clignoter les écrans. |
stop_flash | Arrête le clignotement. | |
blackout | on | Active ou désactive le blackout. |
blackout_on, blackout_off, toggle_blackout | Idem, sans paramètre. | |
focus | on | Met le message en avant. |
on_air | on | Le signal On air. |
show_message | message_id, focus | Affiche un message. |
toggle_message | message_id | L'affiche, ou le masque s'il est déjà affiché. |
hide_message | Masque le message. |
| Action | Paramètres | Effet |
|---|---|---|
delete_timer | timer_id | Supprime un minuteur. |
delete_message | message_id | Supprime un message. |
delete_question | question_id | Supprime une question. |
import_csv | csv, replace, date_line, columns, header_row, rows | Importe des lignes, comme dans Importer depuis Stagetimer. |
intent | {"intent": {...}} | Toute modification que la régie peut effectuer, en JSON. |
webhook | url | Définit ou supprime le webhook. Voir ci-dessous. |
| Action | Paramètres | Effet |
|---|---|---|
ping | Répond pong si la salle existe. | |
submit_question | text (1000 caractères maximum), name (100 maximum) | Envoie une question du public. |
vote_question | question_id | Vote pour une question. |
Les durées s'écrivent 30s, 5m, 1h, 250ms, ou sous forme d'un simple nombre de secondes. seconds peut remplacer amount, et un signe moins fait reculer. Les interrupteurs comme on, autostart et replace interprètent 0, false, off et no comme désactivé, et toute autre valeur comme activé. Omettez on dans blackout pour le basculer.
Réponses
Chaque réponse est en JSON : {"ok": true, "message": "<action>", "data": ...} en cas de succès, {"ok": false, "message": "...", "code": "..."} en cas d'échec.
| Statut | Message | Raison |
|---|---|---|
| 400 | Either timer_id OR index are required | select sans minuteur. |
| 400 | amount is required, like 30s, 5m or 1h | Durée manquante ou illisible. |
| 400 | Refused: invalid | La salle n'a pas pu l'appliquer. |
| 401 | Access Denied: Valid API key required | Clé absente, clé erronée ou permission manquante. |
| 403 | The API is not in this plan | Le forfait de la salle n'inclut pas l'API. |
| 403 | Refused: forbidden, Refused: readOnly, Refused: limitReached | Action non autorisée, salle en lecture seule, ou limite du forfait atteinte. |
| 404 | Room not found, Unknown action <name>, Timer not found | Vérifiez l'id de la salle, l'action ou l'id du minuteur. |
| 409 | Refused: staleEpoch | La salle a changé pendant l'appel. Renvoyez-le. |
| 429 | Too many requests. Please try again later. | Limite de débit. |
| 503 | Refused: authorityOffline | La salle est dans la corbeille. Restaurez-la d'abord. |
Limite de débit : 100 appels par minute et par clé ; les appels sans clé sont comptés par adresse. Chaque réponse contient RateLimit-Limit, RateLimit-Remaining et RateLimit-Reset (nombre de secondes avant le début de la minute suivante).
Webhooks
Définir l'adresse
Appelez webhook avec une url en https. La réponse contient un secret commençant par whsec_. Conservez-le : il n'est affiché qu'une seule fois.
Recevoir les événements
Cliqer Timer envoie un POST à cette adresse dès qu'il se passe quelque chose dans la salle.
Vérifier la signature
Vérifiez chaque requête avant de lui faire confiance.
Supprimer le webhook
Appelez webhook sans url. L'adresse et son secret sont tous deux supprimés.
| Événement | Quand |
|---|---|
timerStarted | Un minuteur démarre. |
timerEnded | Un minuteur atteint zéro. |
wrapUpYellow | Un minuteur atteint son seuil d'alerte jaune. |
wrapUpRed | Un minuteur atteint son seuil d'alerte rouge. |
messageShown | Un message est affiché. |
Le corps est {"event", "roomId", "timestamp", "payload"}. L'en-tête x-cliqer-timestamp contient l'heure Unix en secondes, et x-cliqer-signature contient sha256= suivi du HMAC-SHA256 en hexadécimal de <timestamp>.<body>, calculé avec votre secret.
# Recompute the signature of a saved body.
printf '%s.%s' "$TIMESTAMP" "$(cat body.json)" \
| openssl dgst -sha256 -hmac "$WHSEC" -hex
import { createHmac, timingSafeEqual } from 'node:crypto'
export function verify(rawBody: string, timestamp: string, signature: string, secret: string) {
const want = `sha256=${createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')}`
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300
return fresh && want.length === signature.length && timingSafeEqual(Buffer.from(want), Buffer.from(signature))
}
import hashlib, hmac, time
def verify(raw_body: bytes, timestamp: str, signature: str, secret: str) -> bool:
mac = hmac.new(secret.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256)
fresh = abs(time.time() - int(timestamp)) < 300
return fresh and hmac.compare_digest("sha256=" + mac.hexdigest(), signature)
Calculez la signature sur le corps brut, exactement tel qu'il a été reçu, avant toute analyse JSON. La fenêtre de cinq minutes est un choix qui vous appartient ; elle empêche de rejouer une ancienne requête.
La livraison se fait en une seule tentative, avec un délai d'expiration de 5 secondes. Les redirections ne sont pas suivies, et une adresse qui pointe vers un réseau privé est ignorée. Si un événement manqué a de l'importance, lisez get_status pour vous remettre à jour.
Liens courts
GET https://cliqer.io/api/timer/link/<code> convertit le code d'un lien court en sa salle : {"ok": true, "data": {"roomId", "link"}}, ou 404 Link not found pour un code inconnu, révoqué ou expiré, ou pour un mauvais mot de passe. Pour un lien protégé par mot de passe, envoyez celui-ci dans l'en-tête x-link-password, jamais dans l'adresse.
Companion et Stream Deck
Il n'existe pas de module Companion ni de plugin Stream Deck pour les salles Cliqer Timer. Le module Generic HTTP de Bitfocus Companion peut appeler les actions ci-dessus. Le minuteur intégré à l'application de bureau Cliqer dispose de sa propre API REST et de la prise en charge de Stream Deck, voir Timer (bureau) et Minuteur de l'hôte.
FAQ
La clé est absente, mal saisie ou ne vous appartient pas : une clé de compte ne fonctionne que sur les salles dont vous êtes propriétaire. Vérifiez que l'en-tête est bien Authorization: Bearer <key>, sans espace superflu.
Le forfait du propriétaire de la salle n'inclut pas l'API Timer. Consultez Forfaits et limites.
Non. L'API requiert une clé pour une salle dont vous êtes propriétaire, et la salle de démo n'appartient à personne.
Vérifiez que l'adresse est en https, accessible depuis Internet, et qu'elle répond en moins de 5 secondes sans redirection. Si vous avez perdu le secret, définissez à nouveau l'adresse ; l'ancien secret cesse alors de fonctionner.
Et ensuite
Importer depuis Stagetimer
Importez un déroulé depuis un CSV Stagetimer, un tableur ou un export Cliqer Timer, et exportez-le à nouveau.
Aperçu des cas d'usage
Découvrez la grande variété de logiciels et de scénarios dans lesquels Cliqer améliore le contrôle de vos présentations et votre flux de travail.