Přehled REST API

Všechny MCP nástroje odpovídají 1:1 REST endpointům. REST API použijte přímo pro CI/CD pipeline, integrace bez MCP, obsluhu webhooků, automatizaci na serveru nebo z jakéhokoli HTTP klienta.

Základní adresa: https://api.briefgate.dev

Požadavky i odpovědi jsou v JSON (Content-Type: application/json). Všechna časová razítka jsou v ISO 8601 a v UTC.


Autentizace

API klíč posílejte v každém požadavku jako Bearer token:

Authorization: Bearer bg_live_xxxxx

Prefixy klíčů

Prefix Prostředí Chování
bg_live_ Produkce Posílá klientům skutečné e-maily a SMS.
bg_test_ Sandbox E-maily jdou do testovací schránky v dashboardu, SMS se tiše zahodí. Webhooky se spouštějí normálně.

Správa API klíčů

POST   /v1/keys         Vytvořit nový klíč
GET    /v1/keys         Vypsat všechny klíče
DELETE /v1/keys/:id     Zneplatnit klíč

Vytvoření klíče:

bash
curl -X POST https://api.briefgate.dev/v1/keys \
  -H "Authorization: Bearer bg_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "CI/CD pipeline",
    "mode": "live",
    "scopes": ["intakes:read", "intakes:write"]
  }'

Dostupné scopy: admin, intakes:read, intakes:write, secrets:read. Scope admin zahrnuje všechny ostatní. Klíč vytvořený přes API zdědí nejvýš scopy klíče, kterým byl vytvořen.


Formát chyb

Všechny chyby vracejí JSON:

json
{
  "error": "not_found",
  "message": "Intake in_8f3k not found or does not belong to this account.",
  "request_id": "req_abc123"
}

Když se obracíte na podporu, přiložte request_id.

Chybové kódy

HTTP stav Hodnota error Význam
400 invalid_request Vadný JSON nebo chybějící povinné pole. Podrobnosti jsou v message.
401 unauthorized Chybějící nebo neplatný API klíč.
403 forbidden Klíč nemá pro tuhle operaci potřebný scope.
404 not_found Zdroj neexistuje nebo patří jinému účtu.
409 conflict Zdroj se stejným identifikátorem už existuje (třeba duplicitní idempotency_key v době platnosti). Vrátí stávající zdroj.
410 gone Zdroj existoval, ale byl trvale smazán nebo spotřebován (třeba token k přístupu po prvním odhalení).
413 payload_too_large Nahraný soubor překračuje zadané max_bytes nebo tvrdý limit účtu.
422 unprocessable Požadavek je strukturálně v pořádku, ale významově ne (třeba min_count větší než max_count).
429 rate_limited Příliš mnoho požadavků. Před dalším pokusem se řiďte hlavičkou Retry-After (v sekundách).
402 quota_exceeded Vyčerpaná měsíční kvóta na intake nebo úložiště.
402 plan_required Funkce není v aktuálním tarifu k dispozici.
500 internal_error Neočekávaná chyba serveru. Je bezpečné to zkusit znovu s rostoucí prodlevou.

Intakes

POST /v1/intakes

Založí nový intake a pošle klientovi odkaz na jeho portál.

Hlavičky požadavku

Hlavička Popis
Idempotency-Key Nepovinná. Jedinečný řetězec (doporučujeme UUID). Když už s tímhle klíčem intake vznikl, vrátí se původní (HTTP 200) místo vytvoření duplikátu.

Hlavní pole požadavku

Pole Typ Povinné Popis
project_name string Ano Název projektu srozumitelný člověku.
client.email string Ano E-mailová adresa klienta.
client.name string Ne Jméno klienta pro oslovení.
client.language string Ne cs, sk, pl, de, es, en. Když chybí, použije se default_language účtu, pak angličtina.
email_copy object Ne Přebije předmět a úvodní text pro tenhle intake. Viz chase.md.
items array Ano Definice položek. Viz item-types.md.
chase_schedule string Ne default, gentle, aggressive, custom nebo off.
chase_interval integer Ne Jak často upomínat, jen s chase_schedule: "custom". Používá se spolu s chase_interval_unit. Výchozí: každé 3 dny. S jiným rozvrhem vrátí 422.
chase_interval_unit string Ne minutes, hours nebo days (výchozí days). Výsledný interval musí být aspoň 5 minut a nejvýš 90 dní.
respect_quiet_hours boolean Ne Držet upomínky v okně 8:00–19:00 podle klienta. Výchozí true.
max_reminders integer | string Ne Počet upomínek, než se intake označí za zaseknutý (1–1000, výchozí 3, nebo "unlimited").
chase_at_time string Ne Místní denní hodina upomínky ve formátu HH:MM. Vyžaduje chase_schedule: "custom" s intervalem v celých dnech.
due_date string Ne Datum v ISO 8601, které uvidí klient.
send boolean Ne false založí koncept bez odeslání. Odeslat později můžete přes POST /v1/intakes/:id/send. Výchozí true.
retention object Ne Jak dlouho držet data po dokončení. { mode: "days"|"on_delivery", days?: number, anonymize?: boolean }. Výchozí: smazat 90 dní po intake.completed. U intake s přístupy použijte mode: "on_delivery" — obsah zmizí zhruba 24 hodin po vyzvednutí výsledků.

Rozvrhy upomínek

Rozvrh Upomínky
default za 2, 5 a 9 dní, pak jednou týdně
gentle za 3 a 8 dní, pak jednou za dva týdny
aggressive za 1, 3 a 5 dní, pak obden
custom Každých chase_interval chase_interval_unit (výchozí každé 3 dny), první jeden interval po pozvánce
off Žádné automatické upomínky

Odpověď (HTTP 201)

json
{
  "intake_id": "in_8f3kQmR2",
  "portal_url": "https://p.briefgate.dev/8f3kqmr2?t=Ky7Nn2xQ0pW4vBhLm8sTdRfGjEcAuZoI",
  "status": "sent",
  "items": [
    { "key": "logo",       "status": "pending" },
    { "key": "hero_copy",  "status": "pending" }
  ]
}

Kompletní příklad s curl

bash
curl -X POST https://api.briefgate.dev/v1/intakes \
  -H "Authorization: Bearer bg_live_xxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: bella-napoli-website-2024" \
  -d '{
    "project_name": "Bella Napoli — Website",
    "client": {
      "email": "[email protected]",
      "name": "Marco Esposito",
      "language": "en"
    },
    "items": [
      {
        "key": "logo",
        "label": "Restaurant logo",
        "help": "SVG or PNG, transparent background, minimum 512px.",
        "type": "image",
        "required": true,
        "constraints": {
          "formats": ["svg", "png"],
          "min_width": 512,
          "transparent_background": true
        }
      },
      {
        "key": "hero_copy",
        "label": "Hero section tagline",
        "type": "longtext",
        "required": true,
        "constraints": { "max_chars": 400 }
      },
      {
        "key": "opening_hours",
        "label": "Opening hours",
        "type": "structured",
        "required": true,
        "schema": {
          "type": "object",
          "required": ["mon_fri", "sat", "sun"],
          "properties": {
            "mon_fri": { "type": "string" },
            "sat":     { "type": "string" },
            "sun":     { "type": "string" }
          }
        }
      },
      {
        "key": "photos",
        "label": "Food and interior photos",
        "type": "file_list",
        "required": true,
        "constraints": {
          "formats": ["jpg", "png", "heic"],
          "min_count": 5,
          "max_count": 15
        }
      }
    ],
    "chase_schedule": "default",
    "due_date": "2024-04-01"
  }'

GET /v1/intakes

Vypíše intake s volitelnými filtry.

Parametry dotazu

Parametr Popis
status Filtr podle stavu: draft, sent, in_progress, completed, archived.
client_email Filtr na konkrétního klienta.
limit Počet výsledků na stránku (výchozí 20, maximum 100).
offset Posun pro stránkování (výchozí 0).

Odpověď

json
{
  "total": 47,
  "intakes": [
    {
      "id": "in_8f3kQmR2",
      "projectName": "Bella Napoli — Website",
      "clientEmail": "[email protected]",
      "status": "in_progress",
      "createdAt": "2024-03-15T10:22:00Z"
    }
  ]
}

Poznámka: Výpis vrací pole intake v camelCase (surová podoba z databáze). Pro plně naformátovaný stavový objekt použijte GET /v1/intakes/:id/status.


GET /v1/intakes/:id

Vrátí kompletní definici intake včetně všech definic položek a metadat.


GET /v1/intakes/:id/status

Lehký stavový endpoint. Vrátí stavy položek, historii upomínek a postup, bez obsahu souborů a podepsaných adres.

Odpověď

json
{
  "status": "in_progress",
  "due_date": "2024-04-01",
  "client_last_seen": "2024-03-16T14:05:33Z",
  "progress": {
    "submitted": 2,
    "total": 4,
    "outstanding": 2,
    "percent": 50
  },
  "items": [
    { "key": "logo",          "status": "approved",       "submitted_at": "2024-03-16T10:00:00Z", "label": "Restaurant logo" },
    { "key": "hero_copy",     "status": "needs_revision", "submitted_at": "2024-03-16T11:00:00Z", "label": "Hero section tagline" },
    { "key": "opening_hours", "status": "pending",        "submitted_at": null,                   "label": "Opening hours" },
    { "key": "photos",        "status": "submitted",      "submitted_at": "2024-03-16T12:00:00Z", "label": "Food and interior photos" }
  ],
  "chases": [
    { "channel": "email", "sent_at": "2024-03-17T09:00:00Z", "status": "sent",      "attempt_no": 1 },
    { "channel": "email", "sent_at": null,                   "status": "scheduled", "attempt_no": 2 }
  ]
}

GET /v1/intakes/:id/results

Vrátí otypované výsledky schválených položek. U souborů a obrázků jsou podepsané adresy s platností 24 hodin.

Parametry dotazu

Parametr Typ Popis
only_new boolean Vrátí jen položky schválené od posledního volání tohoto endpointu.
include_pending boolean Zahrne i položky ve stavu submitted, které ještě nejsou schválené.

POST /v1/intakes/:id/items

Přidá položky do existujícího intake. Klientovi přijde e-mail.

Tělo požadavku

json
{
  "items": [
    {
      "key": "favicon",
      "label": "Favicon",
      "type": "image",
      "required": true,
      "constraints": { "formats": ["png","svg"], "min_width": 32 }
    }
  ]
}

Odpověď

json
{
  "intake_id": "in_8f3kQmR2",
  "items_added": [
    { "key": "favicon", "status": "pending" }
  ]
}

POST /v1/intakes/:id/revision

Vyžádá opravu konkrétní položky.

Tělo požadavku

json
{
  "item_key": "logo",
  "note": "The logo appears blurry at 320px. Please re-export at minimum 512px, ideally as SVG."
}

Odpověď

json
{
  "intake_id": "in_8f3kQmR2",
  "item_key": "logo",
  "status": "needs_revision",
  "client_notified": true
}

POST /v1/intakes/:id/chase

Ručně odešle upomínku mimo automatický rozvrh.

Tělo požadavku

json
{
  "channel": "sms"
}

channel je nepovinný, výchozí je email. sms použijte pro eskalaci po odrazu e-mailů nebo když chcete klienta zastihnout jinou cestou.


POST /v1/intakes/:id/send

Odešle klientovi intake ve stavu konceptu. Platí jen tehdy, když je status roven draft.


DELETE /v1/intakes/:id

Trvale smaže intake i všechny nahrané soubory. Akce je nevratná. Při úspěchu vrací HTTP 204.


Templates

Uloží definici intake jako znovupoužitelnou šablonu, ať u opakujících se typů projektů nemusíte položky zadávat znovu.

GET   /v1/templates        Vypsat všechny šablony
POST  /v1/templates        Vytvořit šablonu z pole definic položek

Vytvoření šablony

bash
curl -X POST https://api.briefgate.dev/v1/templates \
  -H "Authorization: Bearer bg_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Restaurant Website",
    "items": [...]
  }'

Slug šablony pak v define_intake (nebo POST /v1/intakes) předáte jako "template": "web-restaurant" místo ručního výčtu items. Pole se jmenuje template a bere slug, ne id.


Webhooks

BriefGate spouští webhooky při změnách stavu intake. Každý obsah webhooku obsahuje intake_id, event a occurred_at.

GET    /v1/webhooks              Vypsat nastavené endpointy
POST   /v1/webhooks              Zaregistrovat nový endpoint
DELETE /v1/webhooks/:id          Odebrat endpoint
POST   /v1/webhooks/:id/test     Poslat na endpoint testovací událost

Registrace webhooku

bash
curl -X POST https://api.briefgate.dev/v1/webhooks \
  -H "Authorization: Bearer bg_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourapp.com/webhooks/briefgate",
    "events": ["intake.complete", "item.submitted", "item.approved"],
    "secret": "whsec_your_signing_secret"
  }'

Každý požadavek webhooku BriefGate podepisuje pomocí HMAC-SHA256 v hlavičce X-BriefGate-Signature. Než obsah zpracujete, ověřte podpis svým secret.

Události

Událost Spustí se, když
item.submitted Klient nahrál nebo vyplnil položku.
intake.completed Byly odeslány všechny povinné položky.
client.viewed Klient otevřel svůj portál.
chase.bounced Upomínka se natvrdo odrazila nebo byla nahlášena jako spam.
intake.stalled Intake vyčerpal povolený počet upomínek, aniž by byl dokončen.

Tahle pětice je jediná přijímaná; cokoli jiného se při registraci endpointu odmítne. Obsahy jednotlivých událostí najdete v webhooks.md.


Účet a fakturace

GET   /v1/account               Údaje o účtu a aktuální tarif
PATCH /v1/account               Změna nastavení účtu (název, výchozí jazyk a další)
GET   /v1/usage                 Spotřeba za aktuální období proti limitům tarifu
GET   /v1/audit                 Stránkovaný auditní log akcí API a uživatelů
POST  /v1/billing/checkout      Založení Stripe Checkout session pro přechod na vyšší tarif
POST  /v1/billing/portal        Založení session zákaznického portálu Stripe pro správu předplatného

Odpověď o spotřebě

json
{
  "period": "2024-03",
  "intakes": { "used": 12, "limit": 50 },
  "storage_bytes": { "used": 524288000, "limit": 5368709120 },
  "sms_messages": { "used": 3, "limit": 100 }
}

Veřejné endpointy

Tyhle endpointy nevyžadují autentizaci a jsou určené ke strojovému zpracování.

Endpoint Popis
GET /pricing.json Strojově čitelné tarify, limity a příznaky funkcí. Agent podle nich pozná, jaký tarif doporučit, nebo si před zakládáním intake ověří kvótu.
GET /v1/openapi.json Specifikace OpenAPI 3.1 pro celé API. Naimportujte do Postmanu, vygenerujte SDK nebo předejte agentovi, ať si API projde sám.
GET /healthz Liveness sonda. Vrací HTTP 200 s {"status":"ok"}, pokud proces API běží.
GET /readyz Readiness sonda. Vrací HTTP 200 jen tehdy, když je v pořádku proces API i všechny závislosti (databáze, objektové úložiště, poštovní provider). Během nasazování a výpadků vrací HTTP 503.