Wopro Schůzka

Dokumentace API

Z vlastní aplikace založíte schůzku, dostanete odkazy pro hostitele a hosty, zjistíte, kdo je uvnitř, necháte si poslat zprávu, když hovor začne a skončí, a stáhnete záznam. Základní adresa je https://schuzka.wopro.cz/api/v1, odpovědi jsou JSON, texty chyb česky.

Vytvořit API klíč Ceník

Začínáme

  1. Přihlaste se účtem Wopro a v aplikaci v části API klíče vytvořte klíč. Zobrazí se celý jen jednou.
  2. Uložte ho na server do proměnné prostředí, nikdy do aplikace v telefonu ani do webu.
  3. Ověřte klíč voláním /ping a založte první schůzku.
export SCHUZKA_KEY=hv_live_...

curl https://schuzka.wopro.cz/api/v1/ping -H "Authorization: Bearer $SCHUZKA_KEY"

curl -X POST https://schuzka.wopro.cz/api/v1/rooms -H "Authorization: Bearer $SCHUZKA_KEY" -H "Content-Type: application/json" -d '{"title": "Konzultace", "hours": 2}'

Ověření

Klíč (tvar hv_live_<prefix>_<tajemství>) posíláte v hlavičce Authorization: Bearer hv_live_…, nebo v hlavičce X-API-Key. Organizace, které schůzky patří, se bere z klíče. Nejvýš 10 aktivních klíčů na organizaci a 120 volání za minutu na klíč. Když klíč unikne, zrušte ho v aplikaci a vytvořte nový.

Aplikace Wopro (Booknu, CRM, Sales, podpora, admin) nepoužívají klíč, ale volají stejné cesty pod /api/v1/service/… s ?service_slug=<služba>&org=<HEX organizace> a hlavičkou X-Service-Secret, stejně jako u Wopro SMS.

Cesty

Metoda a cestaCo dělá
GET /api/v1/pingOvěří klíč, vrátí organizaci a čas.
POST /api/v1/roomsZaloží schůzku, vrátí 201 s odkazy. Stejné external_id vrátí stejnou otevřenou schůzku (200, replayed).
GET /api/v1/roomsSeznam schůzek (?status=active|closed, ?external_id=, ?limit=, stránkování ?before=<kód>). Smazané schůzky v seznamu nejsou.
GET /api/v1/rooms/<kód>Stav (entry: open, finished, not_yet, expired, closed), kdo je uvnitř, minuty, odkazy, čekárna.
PATCH /api/v1/rooms/<kód>Změna názvu, hesla, pravidla vstupu, zavírání prázdné, počtu lidí, prodloužení, trvalé místnosti, zámku.
DELETE /api/v1/rooms/<kód> nebo POST …/endUkončí hovor pro všechny (trvalou místnost jen vyprázdní).
GET /api/v1/rooms/<kód>/participantsKdo je uvnitř podle serveru hovorů, kdo odešel, počty, délka.
GET /api/v1/rooms/<kód>/recordingsZáznamy schůzky a stav nahrávání, viz Záznamy.
POST /api/v1/rooms/<kód>/recordings, POST …/recordings/<id>/stop, DELETE …/recordings/<id>Spuštění, zastavení a smazání záznamu.
GET /api/v1/recordings, GET /api/v1/recordings/<id>, DELETE /api/v1/recordings/<id>Všechny záznamy organizace (filtr status, room, stránkování before), jeden záznam s odkazem ke sdílení, smazání.
POST /api/v1/recordings/<id>/transcript, GET …/transcript, POST …/transcript/sendPřepis a AI zápis záznamu: vyžádat, přečíst, poslat e-mailem, viz Přepis a zápis.
GET /api/v1/usage?from=&to=Účastnické minuty a minuty záznamů po schůzkách a dnech, bezplatná část, cena podle ceníku a stržený kredit (charged_czk).
GET /api/v1/pricingCeník bez ověření: cena účastnické minuty a minuty záznamu, bezplatné minuty měsíčně, nejmenší kredit k založení, zda je účtování zapnuté.

Založení schůzky

curl -X POST "https://schuzka.wopro.cz/api/v1/rooms" \
  -H "Authorization: Bearer $SCHUZKA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Konzultace s Janem Novákem",
    "host": { "name": "Jana Nováková" },
    "starts_at": "2026-10-20T14:00:00+02:00",
    "duration_min": 60,
    "max_participants": 10,
    "access": "anyone",
    "password": "",
    "empty_timeout": 10,
    "guests": [ { "name": "Jan Novák", "email": "[email protected]" } ],
    "send_email": true,
    "external_id": "rezervace-1234",
    "callback_url": "https://www.vasefirma.cz/schuzka-hook"
  }'

Pole: title, host.name (a u aplikací Wopro host.user_hex), starts_at s duration_min (vstup 15 minut před začátkem, odkaz platí 2 hodiny po konci; pozvaní dostanou připomínku e-mailem před začátkem), nebo hours (platnost od teď, 0 = bez omezení, jinak 1 až 24), max_participants (2 až 10, s povolenými většími schůzkami víc), access (anyone, wopro, org, invited, waiting), password (4 až 12 znaků), empty_timeout (5 až 120 minut), persistent (trvalá místnost), guests (nejvýš 50), send_email, external_id, callback_url (https).

Odpověď 201:

{
  "ok": true,
  "room": "abcd-efgh-ijkl",
  "url": "https://schuzka.wopro.cz/m/abcd-efgh-ijkl",
  "host_url": "https://schuzka.wopro.cz/m/abcd-efgh-ijkl?h=<klíč hostitele>",
  "guest_urls": [ { "email": "[email protected]", "name": "Jan Novák", "url": "https://schuzka.wopro.cz/m/abcd-efgh-ijkl?g=<klíč hosta>", "email_sent": true } ],
  "entry": "not_yet", "valid_from": "2026-10-20T13:45:00+02:00", "expires_at": "2026-10-20T17:00:00+02:00",
  "has_password": false, "access": "anyone", "empty_timeout": 10, "persistent": false, "locked": false,
  "callback_secret": "<64 znaků, jen tentokrát>"
}

Odkaz host_url dává práva hostitele i bez přihlášení (ztlumit, vyhodit, zamknout, nahrávat, ukončit) a obchází heslo; posílejte ho jen tomu, kdo hovor vede. Odkaz url pošlete hostům; s heslem jde přidat ?p=heslo. Soubor do kalendáře je na /ics/<kód> (s ?g= pro pozvaného).

Když odejde poslední člověk, schůzka je do minuty ve stavu finished (Skončila); stejným odkazem jde znovu otevřít, dokud odkaz platí a dokud ji po empty_timeout minutách nezavře server.

Příklad v PHP

$odpoved = json_decode(file_get_contents('https://schuzka.wopro.cz/api/v1/rooms', false, stream_context_create(['http' => [
    'method'  => 'POST',
    'header'  => "Authorization: Bearer hv_live_...\r\nContent-Type: application/json\r\n",
    'content' => json_encode(['title' => 'Konzultace', 'hours' => 2, 'external_id' => 'rezervace-1234']),
    'ignore_errors' => true,
]])), true);
if (!empty($odpoved['ok'])) {
    $odkazProHosty = $odpoved['url'];
    $odkazProHostitele = $odpoved['host_url'];
}

Záznamy

Nahrávání spustí hostitel v hovoru, na stránce schůzky, nebo vaše aplikace (POST …/recordings s {"mode": "video"} pro složený obraz 720p, nebo "audio" jen pro zvuk). Všichni v hovoru vidí, že se nahrává; kdo vstupuje, souhlasí s tím na vstupní obrazovce. Nahrávání má na serveru omezenou kapacitu: když je obsazené, přijde 409 recording_busy s polem since, zkuste to za chvíli.

GET …/recordings vrací items (id, mode, status, délka, velikost, page_url, play_url a download_url platné hodinu, expires_at) a recording (on, active, busy). GET /api/v1/recordings vrací všechny záznamy organizace a GET /api/v1/recordings/<id> navíc share_url, veřejnou stránku s přehrávačem pro lidi bez účtu, která platí 7 dní. Odkazy vedou přes aplikaci schuzka.wopro.cz/zaznam/<id>/…, podporují přeskakování a po smazání záznamu přestanou platit. Hotový záznam ohlásí zpětné volání recording.ready. Záznamy se samy mažou po 30 dnech; DELETE …/recordings/<id> ho smaže hned.

Přepis a zápis

POST /api/v1/recordings/<id>/transcript vyžádá přepis hotového záznamu a z něj zápis: shrnutí, na čem jste se dohodli, úkoly (kdo, co, do kdy) a otevřené otázky. Zpracování běží na pozadí, hodinová schůzka bývá hotová do pěti minut a dokončení ohlásí zpětné volání transcript.ready. GET …/transcript vrací status (pending, running, summary, ready, failed), summary, segments s časy v sekundách od začátku záznamu, celý text (?text=0 je vynechá) a odkazy txt_url, srt_url, vtt_url platné 24 hodin. POST …/transcript/send s {"to": ["[email protected]"]} pošle zápis e-mailem, nejvýš 30 adresám. Cena je 0,60 Kč za minutu záznamu, přepisy vyžádané aplikacemi Wopro se neúčtují. Přepis i zápis dělá umělá inteligence, může obsahovat chyby.

Zpětná volání

Když při založení pošlete callback_url, dostanete podepsaný POST s JSON při začátku hovoru (room.started), při konci (room.finished, s počty a minutami), při ukončení (room.closed, u trvalé místnosti room.emptied), u hotového záznamu (recording.ready, v data id, mode, duration_seconds, size_bytes, expires_at a download_url platný 24 hodin) a u hotového zápisu (transcript.ready, v data recording_id, summary a odkazy na přepis). Hlavička X-Schuzka-Signature: t=<čas>,v1=<podpis>, podpis je HMAC SHA-256 z "<čas>.<tělo>" tajemstvím callback_secret z odpovědi na založení. Odpovězte 2xx; jinak to zkusíme znovu po 1, 5, 15 a 60 minutách.

$telo = file_get_contents('php://input');
[$t, $v1] = sscanf($_SERVER['HTTP_X_SCHUZKA_SIGNATURE'] ?? '', 't=%d,v1=%s');
if (!hash_equals(hash_hmac('sha256', $t . '.' . $telo, $tajemstvi), (string) $v1)) {
    http_response_code(401); exit;
}
$udalost = json_decode($telo, true);   // $udalost['event'], $udalost['room']['room'], $udalost['data']

Limity

Limity chrání službu před zneužitím a platí pro web i API stejně; správce Wopro je může organizaci upravit.

  • Nejvýš 20 otevřených schůzek najednou na organizaci (429 too_many_open_rooms) a 5 trvalých místností (429 too_many_persistent).
  • Délka schůzky není omezená (hours: 0), probíhající hovor konec platnosti neukončí. V základu nejvýš 10 lidí, větší schůzky povolí organizace v Nastavení. Prázdná schůzka se zavře po empty_timeout minutách (výchozí 15) od posledního odchodu; dokud nikdo nepřišel, nezavře se (po 30 dnech bez návštěvy se uklidí).
  • Zakládání: 10 schůzek za hodinu na uživatele nebo službu, pětinásobek na organizaci; klíč zákazníka navíc 100 schůzek za den (429 daily_limit) a 120 volání za minutu (429 rate_limited, hlavička Retry-After).
  • Vstupy do schůzky: 60 za 10 minut z jedné adresy, 10 pokusů o heslo za 10 minut.
  • S účtováním: založení chce zůstatek aspoň 1 Kč (402 insufficient_credit), při nule se hovor ukončí.

Chyby

Při chybě přijde {"ok": false, "error": "kód", "message": "česky"}. Kódy: missing_api_key, invalid_api_key (401), not_found (404), bad_max_participants, bad_starts_at, bad_duration, bad_hours, bad_access, bad_password_length, bad_empty_timeout, bad_callback_url (422), insufficient_credit (402, s balance_czk a topup_url), recording_busy, recording_active, room_not_open (409), room_closed (410), rate_limited, daily_limit, too_many_open_rooms, too_many_persistent (429), livekit_unavailable, storage_unavailable (502), billing_unavailable, recording_off, recording_not_configured (503).

Vložení na web

Jeden řádek skriptu vloží tlačítko, které otevře schůzku v nové kartě, nebo rámeček se schůzkou přímo na stránce:

<script src="https://schuzka.wopro.cz/assets/embed.js" data-code="abcd-efgh-ijkl" data-mode="button" data-label="Připojit se k videohovoru" data-color="#4f46e5"></script>
<script src="https://schuzka.wopro.cz/assets/embed.js" data-code="abcd-efgh-ijkl" data-mode="iframe" data-height="640"></script>

Vlastní značku (název, logo, barva) a vlastní doménu pro odkazy nastavíte v aplikaci v části Nastavení; doména musí mířit záznamem CNAME na schuzka.wopro.cz a zapínáme ji na vyžádání.

Ceník

Platí organizace, která schůzku založila: účastnická minuta 0,05 Kč od první minuty (minuty zdarma platí jen pro schůzky z aplikace), nahrávání zdarma, úložiště záznamů 0,50 Kč za GB a měsíc, přepis se zápisem podle ceníku. Hosté neplatí nic, schůzky založené aplikacemi Wopro se neúčtují. Účtování z kreditu je zapnuté.