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_xxxxxPrefixy 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:
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:
{
"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)
{
"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
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ěď
{
"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ěď
{
"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
{
"items": [
{
"key": "favicon",
"label": "Favicon",
"type": "image",
"required": true,
"constraints": { "formats": ["png","svg"], "min_width": 32 }
}
]
}Odpověď
{
"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
{
"item_key": "logo",
"note": "The logo appears blurry at 320px. Please re-export at minimum 512px, ideally as SVG."
}Odpověď
{
"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
{
"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žekVytvoření šablony
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álostRegistrace webhooku
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éhoOdpověď o spotřebě
{
"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. |