Inloggen

Realtime via WebSocket

Bedien een Cliqer-ruimte vanuit je eigen software als een presentatieclicker op afstand, met dia's, de timer, een laserpointer en berichten aan de host

Maak verbinding met wss://cliqer.io/ws om een Cliqer-ruimte vanuit je eigen software of showcontrolsysteem te bedienen, net als een presentatieclicker op afstand: wissel van dia, bedien de timer van de host, wijs aan met een laserstip en stuur de host berichten. Je app neemt als presentator deel aan de ruimte; de ruimte zelf wordt altijd gehost door de Cliqer-desktopapp.

Authenticatie: maak verbinding met een sessietoken: de cookie session_token (browsers sturen die automatisch mee), een queryparameter ?token= of een Authorization: Bearer-header. Het token wordt gecontroleerd bij het verbinden, niet bij elke opdracht: open dus wanneer het verloopt een nieuwe verbinding met een nieuw token en neem opnieuw deel. Zonder token kun je verbinding maken, maar kun je de API niet gebruiken. Team-API-sleutels (cliqer_...) authenticeren alleen de REST-endpoints; op deze socket is een sleutel geen sessietoken.

Verbinding

# WebSocket connections require a WebSocket client
# Using websocat for testing:
websocat "$WS_URL/ws?token=YOUR_ACCESS_TOKEN"

De server stuurt connected met je clientId zodra de verbinding is opgezet. Wacht daarop voordat je iets verstuurt: een bericht dat eerder binnenkomt, wordt geweigerd met een error en de verbinding wordt gesloten.


Verbinding en verloop in de ruimte

Dianavigatie

Bedien de dia's in een ruimte vanuit je eigen software, net als een presentatieclicker op afstand. Je app neemt als presentator deel aan de ruimte, dus de host ziet hem in de presentatorlijst onder zijn presenterName en bedient hem zoals elke andere presentator: de operator kan zijn clicks uitschakelen, hem verwijderen of hem blokkeren.

  • Maak verbinding met een sessietoken (?token=, een Authorization: Bearer-header of de cookie session_token). Team-API-sleutels werken alleen op de REST-endpoints, niet op deze socket.
  • Het abonnement van de eigenaar van de ruimte moet de Client API bevatten: de API-add-on bij Presenter, Studio HD en Studio 4K, inbegrepen bij Studio 8K en Enterprise.
  • Dia- en timeropdrachten worden alleen uitgevoerd zolang de host clicks van je verbinding toestaat.

Deelnemen aan de ruimte

{ "type": "joinRoom", "payload": { "room": "ABC123", "presenterName": "Show control", "api": true } }
  • Stuur dit na het connected-event: de server weigert alles wat daarvoor binnenkomt.
  • presenterName is de naam die de host ziet (standaard API). Je app is altijd een presentator in de ruimte, nooit de host.
  • Wacht op een clicksEnabled-event met payload true voordat je opdrachten verstuurt. De host stuurt dit zodra hij je verbinding heeft ingesteld, en opnieuw telkens wanneer de operator je clicks in- of uitschakelt.
  • Bewaar de presenterKey uit joinedRoom en stuur die mee in joinRoom wanneer je opnieuw verbinding maakt, zodat de host je clickrechten behoudt.
  • Stuur elke 15 seconden het tekstframe ping om de verbinding open te houden. De server antwoordt met het tekstframe pong (geen JSON).

Opdrachten versturen

{ "type": "webAction", "payload": { "action": "goto", "slide": 5, "id": "a3" } }
actionExtra veldWat het doet
nextVolgende dia (of animatiestap)
prevVorige dia (of animatiestap)
firstEerste dia
lastLaatste dia
gotoslide: geheel getal van 1 tot en met 9999Naar die dia gaan
blackouton: true of falseHet scherm zwart maken, of weer tonen
  • id is optioneel: 1 tot 64 letters, cijfers, _, ., : of -. Het komt terug in het resultaat. Gebruik voor elke opdracht een nieuwe id: de host negeert een opdracht waarvan hij de id in de afgelopen 5 seconden al van je verbinding heeft ontvangen, zodat een herhaalpoging van dezelfde opdracht maar één keer wordt uitgevoerd.
  • first, last, goto en blackout worden alleen uitgevoerd op een host waarvan het laatste controls-event ze in nav vermeldt. Een host die geen controls-event stuurt, ondersteunt alleen next en prev. Met meerdere hosts in de ruimte voert elke host de opdrachten uit die hij ondersteunt.
  • next of prev terwijl het scherm zwart is, toont het scherm weer zonder van dia te wisselen.
  • Een goto voorbij de laatste dia wordt genegeerd.
  • Stuur maximaal 10 opdrachten per seconde, dia- en timeropdrachten samen. De host negeert ook een herhaling van dezelfde opdracht binnen 50 milliseconden.

Wat elke presentatieapp momenteel ondersteunt:

Presentatieappnext, prevfirst, lastgotoblackout
PowerPoint op WindowsJaJaJaJa
PowerPoint op MacJaJaNeeNee
KeynoteJaNeeNeeJa
Google Slides (browserextensie verbonden)JaJaNeeNee
vMixJaNeeNeeNee
Actief vensterJaNeeNeeNee

Het controls-event is het actuele antwoord voor de host die je bedient: lees nav daaruit in plaats van uit deze tabel.

# One connection: wait for `connected`, join as an API client, give the host a
# moment to set it up, then send commands. Replies print as they arrive.
( sleep 2
  echo '{"type":"joinRoom","payload":{"room":"ABC123","presenterName":"Show control","api":true}}'
  sleep 3
  echo '{"type":"webAction","payload":{"action":"next","id":"a1"}}'
  sleep 1
  echo '{"type":"webAction","payload":{"action":"prev","id":"a2"}}'
  sleep 1 ) | websocat "$WS_URL/ws?token=YOUR_SESSION_TOKEN"

Resultaten en events

Elke opdracht wordt beantwoord met een webActionResult of een error.

{ "type": "webActionResult", "payload": { "action": "next", "id": "a1", "hosts": 1 } }

hosts is het aantal hosts waaraan de opdracht is afgeleverd. Het bewijs dat de opdracht is uitgevoerd, is het volgende slide-event van de host; blackout wijzigt ook blackout in het volgende controls-event van de host. Een opdracht die de host niet uitvoert (clicks uitgeschakeld, een opdracht die hij niet ondersteunt, een goto voorbij de laatste dia) krijgt wel een resultaat, maar geen slide-event.

errorWanneer
auth_requiredjoinRoom met api: true op een verbinding zonder sessietoken
not_api_clientEen opdracht van een verbinding die niet met api: true aan een ruimte heeft deelgenomen, of nadat die de ruimte heeft verlaten
invalid_web_actionOnbekende action, of een ontbrekende of ongeldige slide, on of id
invalid_timer_actionOnbekende timer-action, of een ontbrekende of ongeldige minutes of id
invalid_messageEen bericht zonder text, of langer dan 1000 tekens
invalid_presenter_mouseEen aanwijzerpositie buiten 0 tot en met 1
rate_limitedMeer dan 10 dia- en timeropdrachten in één seconde, of meer dan 5 berichten in 10 seconden
no_hostEr is geen host met de ruimte verbonden
host_update_requiredElke host in de ruimte draait een oudere Cliqer-versie die geen opdrachten van de API kan aannemen
api_not_in_planHet abonnement van de eigenaar van de ruimte bevat de Client API niet

Fouten bevatten een leesbaar message en, als de opdracht correct was opgebouwd, de action en id van de opdracht:

{ "type": "error", "error": "invalid_web_action", "payload": { "message": "Unknown or incomplete webAction. Use next, prev, first, last, goto with slide, or blackout with on.", "action": "goto", "id": "a3" } }

Events van een host bevatten de id van die host in hostId:

EventPayload
clicksEnabledtrue wanneer de host je opdrachten aanneemt, false wanneer de operator je clicks heeft uitgeschakeld
controls{ app, nav, blackout, timer }: de presentatieapp, de extra dia-opdrachten die deze ondersteunt (first, last, goto, blackout), of het scherm zwart is en of de host timeropdrachten aanneemt
slide{ number, current, total, title, notes } na elke opdracht die de host heeft uitgevoerd (number is "4/12", total is null als de app het niet doorgeeft), of null als de host geen presentatie geopend heeft
countdownDe tijd die de timer van de host toont, zoals "4:59" ("-0:12" bij overtijd), elke seconde zolang hij loopt, of null wanneer hij stopt
countdownPhase{ phase, blink }: phase is idle, talk, warning (minder dan een minuut over), overtime of paused, en blink geeft aan of de timer van de host knippert
messageFromHostEen antwoord van de hostoperator, zie Berichten aan de host

Je ontvangt ook de eigen events van de ruimte (clientJoined, clientLeft en andere); negeer de events die je niet gebruikt. Als de operator je verbinding verwijdert of blokkeert, ontvang je logout met reason: "kicked".

Timer

Bedien de timer in de Cliqer-app van de host met dezelfde opdrachten die een Stream Deck of Bitfocus Companion stuurt.

{ "type": "timerAction", "payload": { "action": "set", "minutes": 25, "id": "t1" } }
actionWat het doet
startDe timer starten, of verdergaan na stop
stopDe timer pauzeren
resetDe timer stoppen en terugzetten naar de ingestelde tijd
plus1, plus2, plus51, 2 of 5 minuten toevoegen
minus1, minus2, minus51, 2 of 5 minuten aftrekken
preset5, preset10, preset15, preset20De timer stoppen en 5, 10, 15 of 20 minuten instellen
setDe timer stoppen en minutes instellen, een geheel getal van 1 tot en met 999
  • Elke opdracht wordt beantwoord met een timerActionResult ({ action, id, hosts }, hosts zoals bij dia's) of een error. Het bewijs dat de opdracht is uitgevoerd, is het volgende countdown- of countdownPhase-event van de host.
  • De timer werkt alleen op een host waarvan het laatste controls-event timer: true bevat. Hosts met een oudere Cliqer-versie melden dit niet en negeren timeropdrachten.
  • Voor timeropdrachten gelden dezelfde regels als voor dia-opdrachten: de host voert ze alleen uit zolang hij clicks van je verbinding toestaat, en ze delen het budget van 10 opdrachten per seconde.
  • De timerinstellingen van de host blijven gewoon gelden: een timer die is ingesteld om op te tellen, telt op, en een timer die een verbonden hardwaretimer volgt, neemt zijn tijd over van dat apparaat.

Laserpointer

Toon een laserstip op het gedeelde scherm van de host, zoals de telefoon van een presentator dat doet.

{ "type": "presenterMouse", "payload": { "mouse": { "x": 0.5, "y": 0.25 } } }
  • x en y zijn de positie op het gedeelde scherm, gemeten vanaf de linkerbovenhoek, van 0 tot en met 1.
  • Stuur { "pressed": false } als payload om de stip te verbergen. Anders verdwijnt hij 30 tot 90 seconden na je laatste positie.
  • De stip is alleen zichtbaar zolang de host een scherm deelt en Laserpointer heeft ingeschakeld. De kleur hangt af van je presenterName.
  • Stuur maximaal 30 posities per seconde. Extra posities worden zonder foutmelding genegeerd en er is geen resultaatevent.

Berichten aan de host

Stuur een bericht naar de hostoperator. Het verschijnt in de presentatorchat van de host, net als een bericht van de telefoon van een presentator, en de antwoorden van de operator komen terug als messageFromHost.

# Join as an API client, then send a message. Replies print as they arrive.
( sleep 2
  echo '{"type":"joinRoom","payload":{"room":"ABC123","presenterName":"Show control","api":true}}'
  sleep 3
  echo '{"type":"messageToHosts","payload":{"text":"Two minutes to the break","id":"m1"}}'
  sleep 30 ) | websocat "$WS_URL/ws?token=YOUR_SESSION_TOKEN"

Antwoord van de host:

{
  "type": "messageFromHost",
  "payload": {
    "fromClientId": "host_abc123",
    "fromPresenterName": "Stage PC",
    "originalPayload": { "text": "Thanks, got it" }
  },
  "hostId": "host_abc123"
}
  • text bevat 1 tot 1000 tekens. Stuur maximaal 5 berichten per 10 seconden.
  • Elk bericht wordt beantwoord met een messageToHostsResult ({ id, hosts }) of een error.
  • De operator ziet het bericht onder je presenterName, en de host toont een melding als de instelling Meldingen aan staat.

Overzicht van events

Uitgaande events (client → server)

EventBeschrijving
joinRoomAls API-client deelnemen aan een ruimte met api: true (zie Dianavigatie)
webActionDiabediening (zie Dianavigatie)
timerActionTimerbediening (zie Timer)
presenterMousePositie van de laserpointer (zie Laserpointer)
messageToHostsEen bericht naar de hostoperator sturen (zie Berichten aan de host)
logoutDe ruimte verlaten; de verbinding blijft open en kan opnieuw deelnemen

Inkomende events (server → client)

EventBeschrijving
connectedVerzonden bij het openen, met { clientId, userId, isAuthenticated }
joinedRoomSuccesvol deelgenomen aan de ruimte
clientJoinedIemand is de ruimte binnengekomen
clientLeftIemand heeft de ruimte verlaten
webActionResultEen webAction is afgeleverd bij de hosts van de ruimte
timerActionResultEen timerAction is afgeleverd bij de hosts van de ruimte
messageToHostsResultEen messageToHosts is afgeleverd bij de hosts van de ruimte
clicksEnabledOf een host je opdrachten aanneemt
controlsWat de presentatieapp en de timer van een host ondersteunen
slideDe huidige dia van een host na een opdracht
countdownDe tijd op de timer van een host
countdownPhaseDe fase van de timer van een host
messageFromHostEen bericht van de hostoperator
logoutDe operator heeft je verbinding verwijderd of geblokkeerd (reason: "kicked")
errorFoutmelding