API i integracje
Każdy pokój ma API HTTP. Uruchamiaj i zatrzymuj timery, wyświetlaj wiadomości, dodawaj czas i odczytuj harmonogram ze skryptu, systemu sterowania show lub z czegokolwiek, co potrafi wysłać żądanie HTTP. Webhook informuje Twój system, gdy timer startuje lub się kończy.


Pierwsze kroki
Utwórz klucz API
Otwórz Klucze API i kliknij Utwórz klucz. Skopiuj go od razu: jest wyświetlany tylko raz. Zobacz Zespół i klucze API.
Znajdź identyfikator pokoju
To część po /timer/r/ w adresie panelu sterowania, na przykład https://cliqer.io/timer/r/<room>/control.
Wykonaj wywołanie
Wysyłaj klucz z każdym żądaniem. ping sprawdza, czy pokój istnieje.
API steruje tym samym pokojem co panel sterowania: wywołanie z Twojego narzędzia pojawia się od razu na każdym ekranie.
Żądania
Każde wywołanie ma postać https://cliqer.io/api/timer/v1/<room>/<action>. Działają GET, POST, PUT i PATCH. Parametry podajesz w query stringu albo w treści JSON przy POST, PUT i PATCH; gdy parametr jest w obu miejscach, pierwszeństwo ma treść. Myślniki w nazwie akcji też działają, więc add-time to add_time. /api/timer/v0/ przyjmuje te same wywołania.
Wyślij klucz w jeden z poniższych sposobów, sprawdzanych w tej kolejności:
| Gdzie | Przykład |
|---|---|
Nagłówek Authorization | Authorization: Bearer <key> |
Nagłówek x-api-key | x-api-key: <key> |
Parametr zapytania api_key | ?api_key=<key>. Unikaj go, jeśli możesz: adresy trafiają do logów. |
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())
Klucze i uprawnienia
Klucz API Twojego konta może wszystko w pokojach, których jesteś właścicielem. Pokój może mieć też własne klucze, a każdy z nich ma wybrane spośród trzech uprawnień:
| Uprawnienie | Pozwala na |
|---|---|
| Odczyt | Akcje get_ i export. |
| Prowadzenie show | Sterowanie odtwarzaniem, czas, blackout, On air i wiadomości. |
| Edycja | Usuwanie, import, surowe intencje i webhook. |
Wywołanie wymagające uprawnienia, którego klucz nie ma, otrzymuje 401. Sekret klucza pokoju jest wyświetlany tylko raz, przy jego tworzeniu. Aby w ogóle korzystać z API, Twój plan musi je obejmować, zobacz Plany i limity.
Akcje
timer_id wybiera timer po identyfikatorze; index wybiera go po pozycji, licząc od 1. Gdy wysłane są oba, wygrywa timer_id. Pomiń oba, aby działać na bieżącym timerze.
| Akcja | Zwraca |
|---|---|
get_room | Tytuł, datę, strefę czasową i ustawienia. |
get_status | To, co jest teraz uruchomione. |
get_timers | Harmonogram. |
get_messages | Wiadomości. |
get_questions | Pytania od publiczności. |
get_connections | Połączone urządzenia. |
get_logs | Log pokoju. limit, offset. |
export | Cały pokój do pobrania jako cliqer-timer-<room>.json. |
| Akcja | Parametry | Działanie |
|---|---|---|
start, start_or_stop | timer_id lub index | Uruchamia lub przełącza. |
stop | Zatrzymuje uruchomiony timer. | |
start_fresh | timer_id lub index | Uruchamia od pełnej długości. |
select | timer_id lub index (jeden jest wymagany) | Ustawia jako bieżący bez uruchamiania. |
reset | timer_id lub index, autostart, from_memory | Przywraca pełną długość. |
next, previous | autostart, from_memory | Przechodzi po harmonogramie. |
add_time, subtract_time | timer_id, amount | Zmienia długość timera. |
jump | amount | Przesuwa uruchomiony timer o podaną wartość. |
set_remaining | amount | Ustawia pozostały czas. |
flash | count, message | Włącza miganie ekranów. |
stop_flash | Zatrzymuje miganie. | |
blackout | on | Włącza lub wyłącza blackout. |
blackout_on, blackout_off, toggle_blackout | To samo, bez parametru. | |
focus | on | Wyróżnia wiadomość. |
on_air | on | Napis On air. |
show_message | message_id, focus | Wyświetla wiadomość. |
toggle_message | message_id | Wyświetla ją lub ukrywa, jeśli jest widoczna. |
hide_message | Ukrywa wiadomość. |
| Akcja | Parametry | Działanie |
|---|---|---|
delete_timer | timer_id | Usuwa timer. |
delete_message | message_id | Usuwa wiadomość. |
delete_question | question_id | Usuwa pytanie. |
import_csv | csv, replace, date_line, columns, header_row, rows | Importuje wiersze, jak w Import ze Stagetimer. |
intent | {"intent": {...}} | Dowolna zmiana, którą może wprowadzić panel sterowania, w formacie JSON. |
webhook | url | Ustawia lub usuwa webhook. Zobacz niżej. |
| Akcja | Parametry | Działanie |
|---|---|---|
ping | Odpowiada pong, jeśli pokój istnieje. | |
submit_question | text (do 1000 znaków), name (do 100) | Wysyła pytanie od publiczności. |
vote_question | question_id | Oddaje głos na pytanie. |
Wartości czasu to 30s, 5m, 1h, 250ms lub sama liczba sekund. Zamiast amount działa też seconds, a znak minus cofa czas. Przełączniki takie jak on, autostart i replace traktują 0, false, off i no jako wyłączone, a wszystko inne jako włączone. Pomiń on w blackout, aby go przełączyć.
Odpowiedzi
Każda odpowiedź to JSON: {"ok": true, "message": "<action>", "data": ...} w razie powodzenia, {"ok": false, "message": "...", "code": "..."} w razie błędu.
| Status | Komunikat | Przyczyna |
|---|---|---|
| 400 | Either timer_id OR index are required | select bez timera. |
| 400 | amount is required, like 30s, 5m or 1h | Brak wartości czasu lub wartość nieczytelna. |
| 400 | Refused: invalid | Pokój nie mógł tego zastosować. |
| 401 | Access Denied: Valid API key required | Brak klucza, błędny klucz lub brak uprawnienia. |
| 403 | The API is not in this plan | Plan pokoju nie obejmuje API. |
| 403 | Refused: forbidden, Refused: readOnly, Refused: limitReached | Brak zgody, pokój tylko do odczytu lub limit planu. |
| 404 | Room not found, Unknown action <name>, Timer not found | Sprawdź identyfikator pokoju, akcję lub identyfikator timera. |
| 409 | Refused: staleEpoch | Stan pokoju zmienił się w trakcie wywołania. Wyślij je ponownie. |
| 429 | Too many requests. Please try again later. | Limit żądań. |
| 503 | Refused: authorityOffline | Pokój jest w koszu. Najpierw go przywróć. |
Limit żądań: 100 wywołań na minutę na klucz; wywołania bez klucza liczone są na adres. Każda odpowiedź zawiera RateLimit-Limit, RateLimit-Remaining i RateLimit-Reset (liczbę sekund do rozpoczęcia kolejnej minuty).
Webhooki
Ustaw adres
Wywołaj webhook z adresem url typu https. Odpowiedź zawiera secret zaczynający się od whsec_. Zapisz go: jest wyświetlany tylko raz.
Odbieraj zdarzenia
Cliqer Timer wysyła POST na ten adres, gdy w pokoju coś się dzieje.
Sprawdź podpis
Zweryfikuj każde żądanie, zanim mu zaufasz.
Usuń webhook
Wywołaj webhook bez url. Adres i jego sekret zostaną usunięte.
| Zdarzenie | Kiedy |
|---|---|
timerStarted | Timer startuje. |
timerEnded | Timer dochodzi do zera. |
wrapUpYellow | Timer osiąga żółty próg zakończenia. |
wrapUpRed | Timer osiąga czerwony próg zakończenia. |
messageShown | Wiadomość zostaje wyświetlona. |
Treść ma postać {"event", "roomId", "timestamp", "payload"}. Nagłówek x-cliqer-timestamp zawiera czas uniksowy w sekundach, a x-cliqer-signature zawiera sha256= i szesnastkowy HMAC-SHA256 z <timestamp>.<body>, obliczony z Twoim sekretem jako kluczem.
# 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)
Obliczaj podpis z surowej treści dokładnie w takiej postaci, w jakiej dotarła, przed jakimkolwiek parsowaniem JSON. Pięciominutowe okno to Twój wybór; chroni przed ponownym odtworzeniem starego żądania.
Dostarczenie to jedna próba z 5-sekundowym limitem czasu. Przekierowania nie są obsługiwane, a adres wskazujący na sieć prywatną jest odrzucany. Jeśli pominięte zdarzenie ma znaczenie, odczytaj get_status, aby nadrobić zaległości.
Krótkie linki
GET https://cliqer.io/api/timer/link/<code> zamienia kod krótkiego linku na jego pokój: {"ok": true, "data": {"roomId", "link"}} albo 404 Link not found w przypadku nieznanego, unieważnionego lub wygasłego kodu albo błędnego hasła. Hasło do linku wysyłaj w nagłówku x-link-password, nigdy w adresie.
Companion i Stream Deck
Nie ma modułu Companion ani wtyczki Stream Deck dla pokoi Cliqer Timer. Moduł Generic HTTP w Bitfocus Companion może wywoływać powyższe akcje. Własny timer aplikacji desktopowej Cliqer ma swoje REST API i obsługę Stream Deck, zobacz Timer (aplikacja desktopowa) i Timer hosta.
Najczęstsze pytania
Brakuje klucza, ma literówkę albo nie należy do Ciebie: klucz konta działa tylko w pokojach, których jesteś właścicielem. Sprawdź, czy nagłówek ma postać Authorization: Bearer <key> bez dodatkowych spacji.
Plan właściciela pokoju nie obejmuje Timer API. Zobacz Plany i limity.
Nie. API wymaga klucza do pokoju, którego jesteś właścicielem, a pokój demo nie należy do nikogo.
Sprawdź, czy adres używa https, jest dostępny z internetu i odpowiada w ciągu 5 sekund bez przekierowania. Jeśli zgubisz sekret, ustaw adres ponownie; stary sekret przestanie działać.
Co dalej
Import z aplikacji Stagetimer
Wczytaj harmonogram z pliku CSV ze Stagetimer, z arkusza kalkulacyjnego lub z eksportu Cliqer Timer, a potem wyeksportuj go z powrotem.
Przegląd zastosowań
Poznaj szeroki wachlarz oprogramowania i scenariuszy, w których Cliqer usprawnia sterowanie prezentacją i Twój sposób pracy.