Přeskočit na hlavní obsah

Veřejné API

Helpdesk nabízí jediné veřejné API: koncový bod GraphQL. Každá operace ve schématu je dosažitelná i mimo prohlížeč pomocí osobního přístupového tokenu (Personal Access Token, PAT).

Tato stránka je smlouva — co je stabilní, jak se ověřit, co udělují oprávnění a jakou podobu mají chyby. CLI hdmx je postavené nad ním a verzování API popisuje, jak se toto rozhraní vyvíjí.

Koncový bod​

POST https://<your-host>/backend/<subdomain>/api/<version>/graphql
  • <subdomain> identifikuje váš účet (stejný identifikátor, s nímž se přihlašujete).
  • <version> je datovaná verze API, například 2026-07 — viz verzování API. Segment s verzí můžete také vynechat a volat …/backend/<subdomain>/graphql; požadavek pak obslouží nejstarší podporovaná verze a každá odpověď vám sdělí, která verze odpověděla.

Ověřování​

Osobní přístupový token pošlete jako přihlašovací údaj typu Bearer:

Authorization: Bearer hdmx_<random>

PAT má dlouhou životnost (s povinnou platností do určitého data), nese oprávnění, je omezený na IP adresy a lze jej zneplatnit. Je vázaný na jeden účet: předložení tokenu na subdoméně jiného účtu je odmítnuto s HTTP 401.

Vytvoření tokenu​

Tokeny si vytvářejte a spravujte sami v aplikaci pro agenty v sekci Settings → API tokens:

  1. Klikněte na New token.
  2. Dejte mu název, podle kterého ho později poznáte.
  3. Zvolte platnost (nejvýše 365 dní — možnost „nikdy" neexistuje).
  4. Nastavte zásady přístupu — zapněte přesně ty zdroje, které tento token potřebuje, pro čtení nebo pro čtení i zápis. Ve výchozím stavu není povolen žádný přístup.
  5. Přidejte na seznam povolených alespoň jednu IP adresu nebo CIDR (povinné — viz Seznam povolených IP). Formulář za vás může doplnit vaši aktuální IP adresu.
  6. Zkontrolujte a vytvořte. Celý token se zobrazí právě jednou — zkopírujte si ho ihned. Ukládá se pouze otisk, takže ho nelze znovu zobrazit; pokud ho ztratíte, proveďte rotaci tokenu a získejte nový.

Později můžete u tokenu upravit zásady přístupu i seznam povolených IP, provést jeho rotaci (vydat nový tajný klíč, zatímco starý ještě krátkou dobu funguje, abyste přešli bez výpadku) a zneplatnit ho. U každého tokenu vidíte, kdy a odkud byl naposledy použit, a k tomu záznam nedávné aktivity.

Oprávnění​

Přístup je hrubozrnný a členěný podle rodin zdrojů. Token nese pevnou sadu oprávnění; každá operace nejvyšší úrovně jedno z nich kontroluje.

OprávněníUděluje
tickets:readČtení tiketů, zpráv, konceptů, historie, příloh a reportů
tickets:writeVytváření / úprava / mazání tiketů, publikování zpráv, nahrávání příloh. Zahrnuje tickets:read
chat:readČtení chatů, konverzací, zpráv a relací
chat:writeOdesílání zpráv agenta, připojení / opuštění / uzavření / znovuotevření konverzací. Zahrnuje chat:read
customers:readČtení záznamů zákazníků
customers:writeVytváření / úprava / slučování záznamů zákazníků. Zahrnuje customers:read
settings:readČtení nastavení účtu (oddělení, stavy, priority, schránky — bez tajných údajů)

Pole s přihlašovacími údaji schránek (uživatelská jména, hesla a servery IMAP/SMTP) se tokenu nikdy nevracejí, bez ohledu na oprávnění — tyto tajné údaje patří vašemu poskytovateli e-mailu a zůstávají mimo dosah veřejného API.

Klasifikace chyb​

Odpovědi GraphQL používají errors[].extensions.code:

KódVýznamHTTP
SCOPE_DENIEDTokenu chybí potřebné oprávnění. extensions.valid_values vypisuje oprávnění, která by operaci umožnila200
RATE_LIMITEDLimit požadavků pro token je vyčerpán. extensions.retryAfter je počet sekund do obnovení a hlavička Retry-After nese totéž číslo429
INVALID_API_TOKENToken nebyl nalezen, má chybný formát nebo je z jiného důvodu nepoužitelný200

Zneplatněné tokeny, tokeny s prošlou platností, nesoulad účtů a odmítnutí podle seznamu povolených IP jsou odmítnuty ještě před spuštěním dotazu a projeví se jako HTTP 401 bez těla GraphQL. Kód 401 u požadavku s tokenem berte jako „tento token už pro tento požadavek není platný — zkontrolujte jeho platnost, oprávnění a seznam povolených IP".

Limity požadavků​

Každý požadavek s tokenem nese hlavičky:

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 96
X-RateLimit-Reset: 1715692800

Výchozí limit je 120 požadavků za minutu na token. Každý požadavek stojí 1, ať už čte, nebo zapisuje. Překročení vrátí HTTP 429 s hlavičkou Retry-After a extensions.code = "RATE_LIMITED"; slušně se chovající klient počká do okamžiku obnovení.

Seznam povolených IP​

Každý svépomocí vytvořený token musí nést alespoň jednu IP adresu nebo CIDR — tokeny „z libovolné IP" neexistují. Zdrojová IP každého požadavku se porovnává se seznamem tokenu; neshoda je odmítnuta s HTTP 401 a extensions.sub_code = "ip_not_allowed".

  • Přijímají se IPv4, IPv6 i rozsahy CIDR. Pro jediného hostitele použijte /32 (IPv4) nebo /128 (IPv6).
  • Rozsahy se při uložení ověřují a normalizují.
  • Seznam povolených lze po vytvoření upravovat — úprava nemění tajný klíč.

Token používejte ze stabilního výstupního bodu: běhového prostředí CI, naplánované úlohy, pevného kancelářského NAT nebo vlastních serverů ve známém rozsahu IP. Uniklý token je odkudkoli mimo svůj seznam povolených k ničemu.

Aktivita tokenu​

Každý ověřený požadavek, který token provede, se zaznamenává: čas, název operace, zdrojová IP, výsledek (úspěch, chyba, překročení limitu, odepřené oprávnění, zneplatnění nebo prošlá platnost) a doba odezvy. To je stopa, kterou je třeba prověřit, pokud se token chová nečekaně.

Verzování a ukončování podpory​

API je verzováno datovanými verzemi YYYY-MM. Zafixujte si jednu v URL a zůstane stabilní nejméně 12 měsíců; ukončení podpory se ohlašuje přímo v komunikaci dříve, než cokoli, co používáte, zmizí. Úplné zásady najdete v části Verzování API.

Průzkum schématu​

Schéma se popisuje samo: použijte standardní introspekci GraphQL proti verzovanému koncovému bodu a vygenerujte si typy nebo si rozhraní prohlédněte. Interaktivní GraphQL Playground je dostupné na …/backend/<subdomain>/playground.

Rychlý start s curl​

Příklady předpokládají hostitele helpdesk.example.com, subdoménu acme, verzi 2026-07 a token v proměnné $TOKEN.

Načtení aktuálního uživatele (libovolné oprávnění)​

curl -sS https://helpdesk.example.com/backend/acme/api/2026-07/graphql \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"{ currentUser { id email firstname lastname } }"}'

Výpis nedávných tiketů (tickets:read)​

curl -sS https://helpdesk.example.com/backend/acme/api/2026-07/graphql \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "query ($first: Int!) {
ticketList(first: $first) {
edges { node { code subject status { name } updatedAt } }
}
}",
"variables": { "first": 10 }
}'

Publikování veřejné odpovědi (tickets:write)​

curl -sS https://helpdesk.example.com/backend/acme/api/2026-07/graphql \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "mutation ($input: SaveTicketInput!) {
saveTicket(input: $input) {
ticket { code }
error { code message }
}
}",
"variables": {
"input": {
"id": "TICKET-UUID-HERE",
"message": "Thanks — fixing this now.",
"messageType": "PUBLIC"
}
}
}'

Pro každodenní práci obaluje celé toto rozhraní CLI hdmx do pohodlných příkazů.