API ושילובים
לכל חדר יש HTTP API. אפשר להפעיל ולעצור טיימרים, להציג הודעות, להוסיף זמן ולקרוא את סדר ההופעה מסקריפט, ממערכת בקרת הופעה או מכל דבר שיכול לשלוח בקשת רשת. webhook מודיע למערכת שלכם כשטיימר מתחיל או מסתיים.


תחילת העבודה
יצירת מפתח API
לפתוח את מפתחות API וללחוץ על יצירת מפתח. להעתיק אותו עכשיו: הוא מוצג פעם אחת בלבד. ראו צוות ומפתחות API.
איתור מזהה החדר
זה החלק שאחרי /timer/r/ בכתובת של חדר הבקרה, לדוגמה https://cliqer.io/timer/r/<room>/control.
שליחת קריאה
לשלוח את המפתח עם כל בקשה. ping בודק שהחדר קיים.
ה-API מפעיל את אותו חדר כמו חדר הבקרה: קריאה מהכלי שלכם מופיעה בכל המסכים בבת אחת.
בקשות
כל קריאה היא https://cliqer.io/api/timer/v1/<room>/<action>. GET, POST, PUT ו-PATCH עובדים כולם. הפרמטרים נשלחים במחרוזת השאילתה, או בגוף JSON ב-POST, PUT ו-PATCH; כשיש ערך בשניהם, הגוף גובר. גם מקפים בשם הפעולה עובדים, כך ש-add-time הוא add_time. /api/timer/v0/ מקבל את אותן קריאות.
שולחים את המפתח באחת מהדרכים הבאות, שנבדקות לפי הסדר הזה:
| מיקום | דוגמה |
|---|---|
כותרת Authorization | Authorization: Bearer <key> |
כותרת x-api-key | x-api-key: <key> |
שאילתת api_key | ?api_key=<key>. עדיף להימנע ממנה כשאפשר: כתובות נשמרות ביומנים. |
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())
מפתחות והרשאות
מפתח ה-API של החשבון שלכם יכול לעשות הכול בחדרים שבבעלותכם. לחדר יכולים להיות גם מפתחות משלו, ולכל אחד מהם חלק משלוש הרשאות:
| הרשאה | מאפשרת |
|---|---|
| קריאה | פעולות ה-get_ ו-export. |
| ניהול הופעה | הפעלה ועצירה, זמן, האפלה, On air והודעות. |
| עריכה | מחיקה, ייבוא, intents גולמיים וה-webhook. |
קריאה שדורשת הרשאה שאין למפתח מקבלת 401. הסוד של מפתח חדר מוצג פעם אחת, כשהוא נוצר. כדי להשתמש ב-API בכלל, ה-API צריך להיות כלול בתוכנית שלכם, ראו תוכניות ומגבלות.
פעולות
timer_id בוחר טיימר לפי המזהה שלו; index בוחר אותו לפי מיקום, בספירה מ-1. כששניהם נשלחים, timer_id גובר. בלי אף אחד מהם, הפעולה חלה על הטיימר הנוכחי.
| פעולה | מחזירה |
|---|---|
get_room | כותרת, תאריך, אזור זמן והגדרות. |
get_status | מה רץ עכשיו. |
get_timers | סדר ההופעה. |
get_messages | ההודעות. |
get_questions | שאלות הקהל. |
get_connections | מכשירים מחוברים. |
get_logs | יומן החדר. limit, offset. |
export | החדר כולו כהורדה של cliqer-timer-<room>.json. |
| פעולה | פרמטרים | מה היא עושה |
|---|---|---|
start, start_or_stop | timer_id או index | מפעילה, או מחליפה מצב. |
stop | עוצרת את הטיימר הפעיל. | |
start_fresh | timer_id או index | מפעילה מהאורך המלא. |
select | timer_id או index (חובה אחד מהם) | הופכת אותו לנוכחי בלי להפעיל. |
reset | timer_id או index, autostart, from_memory | חזרה לאורך המלא. |
next, previous | autostart, from_memory | מעבר בסדר ההופעה. |
add_time, subtract_time | timer_id, amount | משנה את האורך של טיימר. |
jump | amount | מקפיצה את הטיימר הפעיל בכמות הזו. |
set_remaining | amount | קובעת את הזמן שנותר. |
flash | count, message | מהבהבת את המסכים. |
stop_flash | מפסיקה את ההבהוב. | |
blackout | on | הפעלה או כיבוי של האפלה. |
blackout_on, blackout_off, toggle_blackout | אותו דבר, בלי פרמטר. | |
focus | on | מיקוד בהודעה. |
on_air | on | שלט On air. |
show_message | message_id, focus | מציגה הודעה. |
toggle_message | message_id | מציגה אותה, או מסתירה אותה אם היא מוצגת. |
hide_message | מסתירה את ההודעה. |
| פעולה | פרמטרים | מה היא עושה |
|---|---|---|
delete_timer | timer_id | מוחקת טיימר. |
delete_message | message_id | מוחקת הודעה. |
delete_question | question_id | מוחקת שאלה. |
import_csv | csv, replace, date_line, columns, header_row, rows | מייבאת שורות, כמו בייבוא מ-Stagetimer. |
intent | {"intent": {...}} | כל שינוי שחדר הבקרה יכול לבצע, כ-JSON. |
webhook | url | מגדירה או מנקה את ה-webhook. פרטים בהמשך. |
| פעולה | פרמטרים | מה היא עושה |
|---|---|---|
ping | עונה pong אם החדר קיים. | |
submit_question | text (עד 1000 תווים), name (עד 100) | שולחת שאלה מהקהל. |
vote_question | question_id | מצביעה על שאלה. |
כמויות הן 30s, 5m, 1h, 250ms, או מספר שניות בלי יחידה. seconds עובד במקום amount, וסימן מינוס מזיז אחורה. מתגים כמו on, autostart ו-replace מפרשים 0, false, off ו-no ככבוי וכל ערך אחר כפועל. בלי on ב-blackout, ההאפלה מחליפה מצב.
תגובות
כל תשובה היא JSON: {"ok": true, "message": "<action>", "data": ...} בהצלחה, {"ok": false, "message": "...", "code": "..."} בכישלון.
| סטטוס | הודעה | סיבה |
|---|---|---|
| 400 | Either timer_id OR index are required | select בלי טיימר. |
| 400 | amount is required, like 30s, 5m or 1h | כמות חסרה או לא קריאה. |
| 400 | Refused: invalid | החדר לא הצליח להחיל את השינוי. |
| 401 | Access Denied: Valid API key required | אין מפתח, מפתח שגוי או הרשאה חסרה. |
| 403 | The API is not in this plan | בתוכנית של החדר אין API. |
| 403 | Refused: forbidden, Refused: readOnly, Refused: limitReached | פעולה אסורה, חדר לקריאה בלבד, או מגבלת תוכנית. |
| 404 | Room not found, Unknown action <name>, Timer not found | יש לבדוק את מזהה החדר, את הפעולה או את מזהה הטיימר. |
| 409 | Refused: staleEpoch | החדר התקדם בזמן הקריאה. יש לשלוח אותה שוב. |
| 429 | Too many requests. Please try again later. | מגבלת קצב. |
| 503 | Refused: authorityOffline | החדר נמצא באשפה. יש לשחזר אותו קודם. |
מגבלת קצב: 100 קריאות בדקה לכל מפתח; קריאות בלי מפתח נספרות לפי כתובת. כל תשובה כוללת RateLimit-Limit, RateLimit-Remaining ו-RateLimit-Reset (מספר השניות עד שהדקה מתחילה מחדש).
Webhooks
הגדרת הכתובת
לקרוא ל-webhook עם url מסוג https. התשובה כוללת secret שמתחיל ב-whsec_. לשמור אותו: הוא מוצג פעם אחת בלבד.
קבלת אירועים
Cliqer Timer שולח POST לכתובת הזו כשמשהו קורה בחדר.
בדיקת החתימה
לאמת כל בקשה לפני שסומכים עליה.
ניקוי
לקרוא ל-webhook בלי url. הכתובת והסוד שלה נמחקים שניהם.
| אירוע | מתי |
|---|---|
timerStarted | טיימר מתחיל. |
timerEnded | טיימר מגיע לאפס. |
wrapUpYellow | טיימר מגיע לנקודת התראת הסיום הצהובה שלו. |
wrapUpRed | טיימר מגיע לנקודת התראת הסיום האדומה שלו. |
messageShown | הודעה מוצגת. |
הגוף הוא {"event", "roomId", "timestamp", "payload"}. הכותרת x-cliqer-timestamp מכילה את זמן Unix בשניות, ו-x-cliqer-signature מכילה sha256= ואחריו HMAC-SHA256 בהקסדצימלי של <timestamp>.<body>, עם הסוד שלכם כמפתח.
# 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)
יש לחשב את החתימה על הגוף הגולמי בדיוק כפי שהגיע, לפני כל פענוח JSON. חלון חמש הדקות הוא לבחירתכם; הוא מונע שליחה חוזרת של בקשה ישנה.
המסירה היא ניסיון אחד עם זמן קצוב של 5 שניות. אין מעקב אחר הפניות, וכתובת שמתפרשת לרשת פרטית נדחית. אם אירוע שהוחמץ חשוב, אפשר לקרוא את get_status כדי להשלים את הפער.
קישורים מקוצרים
GET https://cliqer.io/api/timer/link/<code> ממיר קוד של קישור מקוצר לחדר שלו: {"ok": true, "data": {"roomId", "link"}}, או 404 Link not found עבור קוד לא מוכר, מבוטל או שפג תוקפו, או סיסמה שגויה. בקישור עם סיסמה, יש לשלוח אותה בכותרת x-link-password, אף פעם לא בכתובת.
Companion ו-Stream Deck
אין מודול Companion או פלאגין Stream Deck לחדרי Cliqer Timer. המודול Generic HTTP של Bitfocus Companion יכול לקרוא לפעולות שלמעלה. לטיימר של אפליקציית Cliqer לשולחן העבודה יש REST API משלו ותמיכה ב-Stream Deck, ראו Timer (שולחן עבודה) ו-טיימר המארח.
שאלות נפוצות
המפתח חסר, הוקלד לא נכון, או שהוא לא שלכם: מפתח חשבון עובד רק בחדרים שבבעלותכם. יש לוודא שהכותרת היא Authorization: Bearer <key> בלי רווחים מיותרים.
בתוכנית של בעל החדר אין Timer API. ראו תוכניות ומגבלות.
לא. ה-API דורש מפתח לחדר שבבעלותכם, וחדר ההדגמה לא שייך לאף אחד.
יש לוודא שהכתובת היא https, שהיא נגישה מהאינטרנט ושהיא עונה תוך 5 שניות בלי הפניה. אם הסוד אבד, יש להגדיר אותה מחדש; הסוד הישן מפסיק לעבוד.