API e integrazioni
Ogni stanza ha un'API HTTP. Avvia e ferma i timer, mostra messaggi, aggiungi tempo e leggi la scaletta da uno script, da un sistema di show control o da qualsiasi cosa in grado di effettuare una richiesta web. Un webhook avvisa il tuo sistema quando un timer parte o termina.


Per iniziare
Crea una chiave API
Apri Chiavi API e fai clic su Crea chiave. Copiala subito: viene mostrata una sola volta. Vedi Team e chiavi API.
Trova l'id della stanza
È la parte dopo /timer/r/ nell'indirizzo della regia, ad esempio https://cliqer.io/timer/r/<room>/control.
Effettua una chiamata
Invia la chiave con ogni richiesta. ping verifica che la stanza esista.
L'API gestisce la stessa stanza della regia: una chiamata dal tuo strumento appare su tutti gli schermi contemporaneamente.
Richieste
Ogni chiamata è https://cliqer.io/api/timer/v1/<room>/<action>. Funzionano GET, POST, PUT e PATCH. I parametri vanno nella query string oppure in un body JSON con POST, PUT e PATCH; se sono presenti in entrambi, prevale il body. Funzionano anche i trattini nel nome dell'azione, quindi add-time equivale a add_time. /api/timer/v0/ accetta le stesse chiamate.
Invia la chiave in uno di questi modi, verificati in quest'ordine:
| Dove | Esempio |
|---|---|
Header Authorization | Authorization: Bearer <key> |
Header x-api-key | x-api-key: <key> |
Query api_key | ?api_key=<key>. Evitalo quando puoi: gli indirizzi finiscono nei log. |
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())
Chiavi e permessi
La chiave API del tuo account può fare tutto nelle stanze di tua proprietà. Una stanza può anche avere chiavi proprie, ognuna con alcuni dei tre permessi:
| Permesso | Consente |
|---|---|
| Lettura | Le azioni get_ e export. |
| Conduzione show | Controlli di avvio e arresto, tempo, blackout, on air e messaggi. |
| Modifica | Eliminazione, importazione, intent raw e webhook. |
Una chiamata che richiede un permesso che la chiave non ha riceve 401. Il segreto di una chiave di stanza viene mostrato una sola volta, al momento della creazione. Per usare l'API è necessario che sia inclusa nel tuo piano, vedi Piani e limiti.
Azioni
timer_id sceglie un timer tramite il suo id; index lo sceglie in base alla posizione, contando da 1. Se li invii entrambi, prevale timer_id. Omettili entrambi per agire sul timer corrente.
| Azione | Restituisce |
|---|---|
get_room | Titolo, data, fuso orario e impostazioni. |
get_status | Cosa è in esecuzione ora. |
get_timers | La scaletta. |
get_messages | I messaggi. |
get_questions | Le domande del pubblico. |
get_connections | I dispositivi connessi. |
get_logs | Il log della stanza. limit, offset. |
export | L'intera stanza come download cliqer-timer-<room>.json. |
| Azione | Parametri | Effetto |
|---|---|---|
start, start_or_stop | timer_id o index | Avvia, oppure alterna avvio e arresto. |
stop | Ferma il timer in esecuzione. | |
start_fresh | timer_id o index | Avvia dalla durata completa. |
select | timer_id o index (ne serve uno) | Lo rende corrente senza avviarlo. |
reset | timer_id o index, autostart, from_memory | Torna alla durata completa. |
next, previous | autostart, from_memory | Si sposta nella scaletta. |
add_time, subtract_time | timer_id, amount | Modifica la durata di un timer. |
jump | amount | Sposta il timer in esecuzione di quella quantità. |
set_remaining | amount | Imposta il tempo rimanente. |
flash | count, message | Fa lampeggiare gli schermi. |
stop_flash | Interrompe il lampeggio. | |
blackout | on | Attiva o disattiva il blackout. |
blackout_on, blackout_off, toggle_blackout | Lo stesso, senza parametro. | |
focus | on | Mette in evidenza il messaggio. |
on_air | on | L'indicatore On air. |
show_message | message_id, focus | Mostra un messaggio. |
toggle_message | message_id | Lo mostra, oppure lo nasconde se è già visibile. |
hide_message | Nasconde il messaggio. |
| Azione | Parametri | Effetto |
|---|---|---|
delete_timer | timer_id | Elimina un timer. |
delete_message | message_id | Elimina un messaggio. |
delete_question | question_id | Elimina una domanda. |
import_csv | csv, replace, date_line, columns, header_row, rows | Importa righe, come in Importare da Stagetimer. |
intent | {"intent": {...}} | Qualsiasi modifica che la regia può fare, in formato JSON. |
webhook | url | Imposta o rimuove il webhook. Vedi sotto. |
| Azione | Parametri | Effetto |
|---|---|---|
ping | Risponde pong se la stanza esiste. | |
submit_question | text (fino a 1000 caratteri), name (fino a 100) | Invia una domanda del pubblico. |
vote_question | question_id | Vota una domanda. |
Le quantità sono 30s, 5m, 1h, 250ms oppure un semplice numero di secondi. seconds funziona al posto di amount, e un segno meno va all'indietro. Gli interruttori come on, autostart e replace interpretano 0, false, off e no come disattivato e qualsiasi altro valore come attivato. Ometti on in blackout per alternarlo.
Risposte
Ogni risposta è in JSON: {"ok": true, "message": "<action>", "data": ...} in caso di successo, {"ok": false, "message": "...", "code": "..."} in caso di errore.
| Stato | Messaggio | Motivo |
|---|---|---|
| 400 | Either timer_id OR index are required | select senza un timer. |
| 400 | amount is required, like 30s, 5m or 1h | Quantità mancante o non leggibile. |
| 400 | Refused: invalid | La stanza non ha potuto applicarla. |
| 401 | Access Denied: Valid API key required | Nessuna chiave, una chiave errata o un permesso mancante. |
| 403 | The API is not in this plan | Il piano della stanza non include l'API. |
| 403 | Refused: forbidden, Refused: readOnly, Refused: limitReached | Non consentito, una stanza in sola lettura o un limite del piano. |
| 404 | Room not found, Unknown action <name>, Timer not found | Controlla l'id della stanza, l'azione o l'id del timer. |
| 409 | Refused: staleEpoch | La stanza è cambiata durante la chiamata. Inviala di nuovo. |
| 429 | Too many requests. Please try again later. | Limite di frequenza. |
| 503 | Refused: authorityOffline | La stanza è nel cestino. Ripristinala prima. |
Limite di frequenza: 100 chiamate al minuto per chiave; le chiamate senza chiave vengono conteggiate per indirizzo. Ogni risposta include RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset (i secondi mancanti all'inizio del minuto successivo).
Webhook
Imposta l'indirizzo
Chiama webhook con un url https. La risposta contiene un secret che inizia con whsec_. Conservalo: viene mostrato una sola volta.
Ricevi gli eventi
Cliqer Timer invia una richiesta POST a quell'indirizzo quando succede qualcosa nella stanza.
Verifica la firma
Verifica ogni richiesta prima di fidarti.
Rimuovilo
Chiama webhook senza url. L'indirizzo e il relativo segreto vengono eliminati entrambi.
| Evento | Quando |
|---|---|
timerStarted | Un timer parte. |
timerEnded | Un timer arriva a zero. |
wrapUpYellow | Un timer raggiunge il punto di chiusura giallo. |
wrapUpRed | Un timer raggiunge il punto di chiusura rosso. |
messageShown | Viene mostrato un messaggio. |
Il body è {"event", "roomId", "timestamp", "payload"}. L'header x-cliqer-timestamp contiene l'ora Unix in secondi, e x-cliqer-signature contiene sha256= seguito dall'HMAC-SHA256 esadecimale di <timestamp>.<body> calcolato con il tuo segreto come chiave.
# 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)
Firma il body grezzo esattamente come è arrivato, prima di qualsiasi parsing JSON. La finestra di cinque minuti è una tua scelta; impedisce che una vecchia richiesta venga riutilizzata.
La consegna prevede un solo tentativo con un timeout di 5 secondi. I redirect non vengono seguiti, e un indirizzo che si risolve in una rete privata viene scartato. Se un evento perso è importante, leggi get_status per rimetterti in pari.
Link brevi
GET https://cliqer.io/api/timer/link/<code> converte il codice di un link breve nella sua stanza: {"ok": true, "data": {"roomId", "link"}}, oppure 404 Link not found per un codice sconosciuto, revocato o scaduto o per una password errata. Per un link con password, inviala nell'header x-link-password, mai nell'indirizzo.
Companion e Stream Deck
Non esiste un modulo Companion né un plugin Stream Deck per le stanze Cliqer Timer. Il modulo Generic HTTP di Bitfocus Companion può chiamare le azioni indicate sopra. Il timer integrato nell'app desktop Cliqer ha una propria API REST e il supporto per Stream Deck, vedi Timer (desktop) e Timer host.
Domande frequenti
La chiave manca, è digitata male o non è tua: una chiave dell'account funziona solo sulle stanze di tua proprietà. Verifica che l'header sia Authorization: Bearer <key> senza spazi in più.
Il piano del proprietario della stanza non include l'API di Timer. Vedi Piani e limiti.
No. L'API richiede una chiave per una stanza di tua proprietà, e la stanza demo non appartiene a nessuno.
Verifica che l'indirizzo sia https e raggiungibile da Internet, e che risponda entro 5 secondi senza redirect. Se hai perso il segreto, impostalo di nuovo; quello vecchio smette di funzionare.
Prossimi passi
Importare da Stagetimer
Importa una scaletta da un CSV di Stagetimer, da un foglio di calcolo o da un export di Cliqer Timer, ed esportala di nuovo.
Panoramica dei casi d'uso
Scopri l'ampia gamma di software e scenari in cui Cliqer migliora il controllo delle tue presentazioni e il tuo flusso di lavoro.