Přeskočit na obsah

Pro vývojáře

Stavte na Mets

REST API a podepsané webhooky pro schůzky, nahrávky, přepisy a shrnutí od AI. Vaše data zůstávají v EU.

Rychlý start

Od nuly ke schůzce ve třech krocích

Není potřeba žádné SDK. Obyčejné HTTPS a JSON.

  1. 1

    Vytvořte API klíč

    Otevřete Nastavení, Pro vývojáře a vytvořte klíč jen s oprávněními, která potřebujete. Zobrazí se pouze jednou.

  2. 2

    Zavolejte API

    Pošlete klíč jako token Bearer. Vytvářejte schůzky, vypisujte nahrávky, získávejte přepisy a shrnutí.

  3. 3

    Naslouchejte událostem

    Přidejte koncový bod webhooku a reagujte, když schůzka skončí nebo je hotový přepis, případně se dotazujte na kanál událostí.

Vytvoření schůzkybash
curl -X POST https://mets.ulewicz.space/api/v1/public/meetings \
  -H "Authorization: Bearer $METS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Weekly sync",
    "scheduled_at": "2026-11-03T09:00:00+01:00",
    "duration_minutes": 30,
    "settings": { "waiting_room": true, "transcription_auto": true }
  }'

# -> 201 { "id": "…", "code": "abc-defg-hjk", "join_url": "https://mets.ulewicz.space/m/abc-defg-hjk", … }
Výpis nahrávekbash
curl https://mets.ulewicz.space/api/v1/public/meetings/abc-defg-hjk/recordings \
  -H "Authorization: Bearer $METS_API_KEY"

# -> { "data": [ { "id": "…", "kind": "video", "status": "ready",
#                  "duration_seconds": 1834, "download_url": "https://…" } ] }

Webhooky

Zjistěte v tu chvíli, kdy se něco stane

Každé doručení je podepsaný požadavek HTTPS POST. Neúspěšná doručení se opakují s exponenciálním odstupem, celkem pětkrát.

  • meeting.startedPřipojil se první účastník a schůzka běží.
  • meeting.endedSchůzka skončila.
  • recording.readyNahrávka byla zpracována a lze ji stáhnout.
  • transcript.readyPřepis je kompletní.
  • summary.readyShrnutí od AI je k dispozici.
  • registration.createdNěkdo se zaregistroval na jeden z Vašich webinářů.
Doručení webhookuhttp
POST https://your-server.example/webhooks/mets
X-Mets-Event: meeting.ended
X-Mets-Delivery: 7c0f…
X-Mets-Timestamp: 1790000000
X-Mets-Signature: sha256=9f2b…

{
  "id": "evt_1042",
  "type": "meeting.ended",
  "created_at": "2026-11-03T09:31:07Z",
  "data": { "meeting": { "id": "…", "code": "abc-defg-hjk", "title": "Weekly sync", "status": "ended" } }
}

Ověřujte každý požadavek

Mets podepisuje tělo požadavku tajným klíčem Vašeho koncového bodu: X-Mets-Signature má podobu sha256= následované HMAC-SHA256 z časového razítka, tečky a nezpracovaného těla. Porovnávejte v konstantním čase a odmítejte časová razítka starší než pět minut.

Ověření webhooku (Node.js)node.js
import crypto from "node:crypto";

// Express: use express.raw({ type: "application/json" }) so you get the exact bytes.
export function verify(rawBody, headers, secret) {
  const ts = headers["x-mets-timestamp"];
  const expected =
    "sha256=" + crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  const given = headers["x-mets-signature"] ?? "";
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300; // reject replays
  return (
    fresh &&
    given.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected))
  );
}
Ověření webhooku (Python)python
import hashlib, hmac, time

def verify(raw_body: bytes, headers: dict, secret: str) -> bool:
    ts = headers["X-Mets-Timestamp"]
    mac = hmac.new(secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    expected = "sha256=" + mac
    fresh = abs(time.time() - int(ts)) < 300  # reject replays
    return fresh and hmac.compare_digest(expected, headers["X-Mets-Signature"])

Automatizace

Zapier, Make a n8n bez kódu

Pollingové triggery a odchozí webhooky – stejné události, které vidíte v aplikaci. K tomu oznámení do Slacku a Teams.

Pollingové triggery

GET /api/v1/public/triggers/{event}?since= vrátí události po Vašem posledním kurzoru. Bez since dostanete ty nejnovější – ideální pro ukázková data.

  • meeting.started
  • meeting.ended
  • recording.ready
  • transcript.ready
  • summary.ready
  • registration.created
  • Zapier: aplikace v integrations/zapier (ověření API klíčem, 6 triggerů, akce: vytvořit schůzku, zaregistrovat účastníka).
  • n8n: balíček uzlu integrations/n8n (Mets + Mets Trigger).
  • Make: modul HTTP + podepsané odchozí webhooky.
  • Slack a Teams: Nastavení → Integrace → Oznámení do kanálů.
Polling triggerubash
# newest first (first poll / sample), then follow next_cursor
curl -s -H "Authorization: Bearer $METS_API_KEY" \
  "https://mets.ulewicz.space/api/v1/public/triggers/summary.ready?limit=5"

curl -s -H "Authorization: Bearer $METS_API_KEY" \
  "https://mets.ulewicz.space/api/v1/public/triggers/registration.created?since=evt_1234&slug=my-webinar"

MCP

Schůzky pro AI agenty (MCP)

Server Model Context Protocol (Streamable HTTP). Claude, Cursor a další agenti čtou přepisy, vyhledávají ve schůzkách a plánují nové.

Nástroje

Endpoint: POST https://mets.ulewicz.space/api/v1/mcp. Zdroje: mets://meetings/{id}/transcript a /summary.

  • list_meetingsSeznam schůzek (filtr podle stavu).
  • get_meetingPodrobnosti schůzky podle ID nebo kódu.
  • get_transcriptPřepis ve formě prostého textu, volitelně přeložený.
  • get_summaryAI shrnutí: TL;DR, rozhodnutí, úkoly.
  • search_contentFulltextové hledání v přepisech a chatu.
  • ask_meetingsDotaz v přirozeném jazyce (RAG) s citacemi.
  • list_tasksÚkoly ze schůzek a odkazy na správce úkolů.
  • create_meetingOkamžitá schůzka s odkazem pro připojení.
  • schedule_meetingNaplánovat schůzku na zadaný čas.

Ověřte se API klíčem (Nastavení → Vývojáři). Nástroje, které uvidíte, závisejí na oprávněních klíče.

Claude Desktop (claude_desktop_config.json)json
{
  "mcpServers": {
    "mets": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://mets.ulewicz.space/api/v1/mcp",
        "--header", "Authorization: Bearer ${METS_API_KEY}"
      ],
      "env": { "METS_API_KEY": "mets_sk_..." }
    }
  }
}
Cursor (.cursor/mcp.json)json
{
  "mcpServers": {
    "mets": {
      "url": "https://mets.ulewicz.space/api/v1/mcp",
      "headers": { "Authorization": "Bearer mets_sk_..." }
    }
  }
}
Claude Codebash
claude mcp add --transport http mets https://mets.ulewicz.space/api/v1/mcp \
  --header "Authorization: Bearer mets_sk_..."
Surové volání JSON-RPCbash
curl -s https://mets.ulewicz.space/api/v1/mcp \
  -H "Authorization: Bearer $METS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"ask_meetings","arguments":{"question":"What did we decide about pricing?"}}}'

Vložení

Vložte schůzku Mets do svého produktu

SDK nezávislé na frameworku vykreslí místnost v iframe a komunikuje s Vaší stránkou přes malý, verzovaný protokol postMessage.

  1. 1

    Povolte své originy

    Místnost mohou vkládat pouze stránky z uvedených originů. Seznam vynucuje prohlížeč pomocí CSP frame-ancestors.

  2. 2

    Připojte SDK

    Načtěte značku script, modul ES nebo komponentu React a nasměrujte ji na kód schůzky nebo embed token.

  3. 3

    Vydávejte tokeny na svém serveru

    Pomocí svého API klíče vytvořte krátkodobý token pro pojmenovaného hosta, aby se kód ani klíč nikdy nedostaly do prohlížeče.

Povolit nadřazené originyhttp
curl -X PUT https://mets.ulewicz.space/api/v1/public/meetings/abc-defg-hjk/embed-origins \
  -H "Authorization: Bearer mets_sk_..." \
  -H "Content-Type: application/json" \
  -d '{ "origins": ["https://app.example.com", "https://*.example.com"] }'
Značka scripthtml
<div id="meeting" style="height: 640px"></div>
<script src="https://mets.ulewicz.space/embed/mets-embed.js"></script>
<script>
  const meeting = MetsEmbed.MetsMeeting.create({
    container: "#meeting",
    meetingCode: "abc-defg-hjk",
    name: "Anna",            // pre-filled guest name
    locale: "en",
    theme: "dark",
    features: { chat: true, participants: true },
    onEvent: (e) => console.log(e.type, e),
  });

  meeting.on("joined", (e) => console.log("in the room as", e.participant.name));
  meeting.on("participant-count", (e) => console.log(e.count, "people"));
  document.querySelector("#mute").onclick = () => meeting.mute();
</script>
Modul EStypescript
npm install @mets/embed

import { MetsMeeting } from "@mets/embed";

const meeting = MetsMeeting.create({
  container: document.getElementById("meeting")!,
  joinToken, // from your server, see below
  onEvent: (e) => { if (e.type === "left") showThanks(); },
});
Reacttsx
npm install @mets/embed @mets/embed-react

import { MetsMeeting } from "@mets/embed-react";

export function Room({ joinToken }: { joinToken: string }) {
  const ref = useRef<MetsMeetingHandle>(null);
  return (
    <div style={{ height: 640 }}>
      <MetsMeeting ref={ref} joinToken={joinToken} locale="en" onEvent={(e) => console.log(e)} />
      <button onClick={() => ref.current?.mute()}>Mute</button>
    </div>
  );
}
Embed token na straně serveruhttp
# server side — the browser never sees the meeting code or your API key
curl -X POST https://mets.ulewicz.space/api/v1/public/embed/tokens \
  -H "Authorization: Bearer mets_sk_..." \
  -H "Content-Type: application/json" \
  -d '{ "meeting": "abc-defg-hjk", "name": "Anna Kowalska", "ttl_seconds": 600,
        "features": { "chat": false } }'

# 201
{ "token": "mets_et_eyJj...", "expires_at": "2026-10-09T12:10:00Z",
  "embed_url": "https://mets.ulewicz.space/en/embed/mets_et_eyJj...", "embeddable": true }

Události (z iframe do stránky)

  • readyVložená stránka se spustila a přijímá příkazy.
  • joinedHost vstoupil do místnosti (údaje o účastníkovi a schůzce).
  • leftHost odešel, byl odebrán nebo schůzka skončila (s uvedením důvodu).
  • participant-countPočet lidí aktuálně v místnosti.
  • recordingNahrávání bylo spuštěno nebo zastaveno (active, mode).
  • mediaMístní mikrofon nebo kamera byly zapnuty či vypnuty.
  • errorSchůzka není dostupná (nenalezena, skončila, zrušena).

Příkazy (ze stránky do iframe)

  • muteZtlumit místní mikrofon, nebo kameru pomocí kind: "video".
  • unmuteZnovu zapnout mikrofon (nebo kameru).
  • leaveOpustit schůzku.
  • toggleChatOtevřít nebo zavřít panel chatu.
  • setThemePřepnout mezi světlým, tmavým a systémovým motivem.
Protokol postMessagejs
// iframe -> host page (posted to exactly one validated origin)
{ source: "mets-embed", v: 1, dir: "event", type: "joined",
  participant: { identity, name, role }, meeting: { code, title } }

// host page -> iframe (accepted only from an allow-listed origin)
{ source: "mets-embed", v: 1, dir: "command", type: "setTheme", theme: "dark" }

Ve výchozím stavu zamčeno

Bez povolených originů nemůže místnost nikdo vložit. Události se odesílají na jediný ověřený origin, příkazy se přijímají pouze z něj a embed tokeny jsou podepsané, rychle vyprší a pevně určují jméno hosta.

Reference

Vše, co potřebujete, nic navíc

Dvanáct koncových bodů pokrývá schůzky, nahrávky, přepisy, shrnutí, registrace na webináře a události.

Základní URL: https://mets.ulewicz.space/api/v1/public
  • GET/me—
  • GET/meetingsmeetings:read
  • POST/meetingsmeetings:write
  • GET/meetings/{id}meetings:read
  • PATCH/meetings/{id}meetings:write
  • DELETE/meetings/{id}meetings:write
  • GET/meetings/{id}/participantsmeetings:read
  • GET/meetings/{id}/recordingsrecordings:read
  • GET/meetings/{id}/transcripttranscripts:read
  • GET/meetings/{id}/summarytranscripts:read
  • POST/webinars/{slug}/registrationswebinars:write
  • GET/eventsmeetings:read

API klíče s omezeným rozsahem

Authorization: Bearer mets_sk_…. Klíče nesou jen oprávnění, která jim udělíte, lze je omezit na organizaci, nastavit jim platnost nebo je kdykoli odvolat.

Férové limity požadavků

120 požadavků za minutu a špičky 20 za sekundu na klíč. Každá odpověď obsahuje hlavičky X-RateLimit.

OpenAPI 3

Kompletní strojově čitelné schéma a interaktivní konzole pro vyzkoušení požadavků.

Otevřít interaktivní referenci

API je součástí tarifu Business

Veřejné API a webhooky jsou součástí tarifu Business, bez poplatků za jednotlivé požadavky. Potřebujete vyšší limity nebo individuální smlouvu? Napište nám.

Nasaďte svou první integraci ještě dnes

Vytvořte si účet, vygenerujte klíč a odešlete první požadavek během několika minut.