Fakturujsi REST API
Vítejte v dokumentaci Fakturujsi API. Toto API vám umožňuje programově spravovat faktury, kontakty, výdaje, platby, produkty a webhooky. Všechny endpointy vracejí data ve formátu JSON a používají standardní HTTP metody.
Základní URL: https://www.fakturujsi.cz/api/v1
Autentizace
Všechny požadavky na API musí obsahovat platný API klíč v hlavičce Authorization.
Authorization: Bearer fak_xxxxxxxxxxxxxxxxxxxxxBezpečnost API klíče
API klíč nikdy nesdílejte veřejně. Nepoužívejte ho v klientském JavaScriptu. Vždy ho uchovávejte na serveru v proměnných prostředí.
Scopy (oprávnění)
Každý API klíč má přiřazené scopy, které určují, k čemu má přístup:
invoices:readinvoices:writecontacts:readcontacts:writeexpenses:readexpenses:writepayments:readpayments:writeproducts:readproducts:writewebhooks:readwebhooks:writebank:readreports:readmcp:connectRate limiting
Limity se liší podle vašeho tarifu:
| Tarif | Limit |
|---|---|
| Free / Starter | 100 požadavků / minuta |
| Business / Pro | 1 000 požadavků / minuta |
Při překročení limitu obdržíte odpověď 429 Too Many Requests s hlavičkou Retry-After.
Formát odpovědi
Všechny odpovědi jsou ve formátu JSON. Úspěšné odpovědi mají následující strukturu:
Jednotlivý záznam
{
"data": {
"id": "cm5abc123",
"number": "FV-2026-0001",
"status": "paid"
}
}Kolekce (seznam)
{
"data": [
{
"id": "cm5abc123",
"number": "FV-2026-0001"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 42,
"totalPages": 3
}
}Chybová odpověď
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Neplatná vstupní data",
"details": [
{
"field": "contactId",
"message": "Povinné pole"
},
{
"field": "items",
"message": "Alespoň jedna položka je vyžadována"
}
]
}
}Každá odpověď obsahuje hlavičku X-Request-Id pro sledování požadavků. Při kontaktování podpory prosím uvádějte toto ID.
Faktury
Správa faktur - vytvoření, editace, mazání a listování. Nové faktury automaticky dostávají číslo dle vašich číslovacích řad.
Kontakty
Správa kontaktů (odběratelů a dodavatelů). Kontakty jsou používány ve fakturách a výdajích.
Výdaje
Evidence výdajů a nákladů. Výdaje jsou automaticky klasifikovány pro daňové účely (kontrolní hlášení).
Platby
Evidence plateb k fakturám. Při vytvoření platby se automaticky aktualizuje stav faktury (uhrazená/částečně uhrazená).
Produkty
Katalog produktů a služeb. Produkty lze použít jako položky faktur pro rychlejší vystavování.
Banka
Bankovní účty a transakce (pouze čtení). Číslo účtu a interní nastavení integrace nejsou z bezpečnostních důvodů součástí odpovědí. Zůstatek účtu (balance) je dopočítaný součtem transakcí v době dotazu. Vyžaduje scope bank:read.
Reporty
Finanční reporty (pouze čtení) — tržby, náklady dle kategorií a přehled pohledávek po splatnosti. Vyžaduje scope reports:read.
Webhooky
Správa webhook odběrů. Webhooky umožňují přijímat notifikace o událostech v reálném čase. Každý webhook je podepsán HMAC-SHA256 pro ověření autenticity.
REST Hooks (Zapier / Make)
Endpointy pro automatickou správu webhook odběrů z automatizačních platforem (Zapier, Make, n8n). Používají zjednodušené názvy událostí (např. new_invoice místo invoice.created).
Akce (Actions)
Endpointy pro provádění akcí z automatizačních platforem. Každá akce má zjednodušené schéma vstupních dat optimalizované pro Zapier/Make formuláře.
MCP protokol
Model Context Protocol (MCP) je otevřený standard pro napojení AI asistentů na data a nástroje třetích stran. Fakturujsi vystavuje MCP server na adrese POST /api/mcp/v1 — AI klienti jako Claude.ai, ChatGPT i vlastní agenti se připojí přes OAuth 2.1 (jedním kliknutím, doporučeno) nebo přes API klíč fak_* (CLI/headless) a mohou číst i zapisovat přes JSON-RPC 2.0 nad HTTP (Streamable HTTP).
Dokumentace protokolu: modelcontextprotocol.io. Server vyjednává verzi protokolu v metodě initialize — podporované jsou 2025-06-18 (výchozí, nejnovější), 2025-03-26 a 2024-11-05 (zpětná kompatibilita). Pokud klient pošle nerozpoznanou verzi, server odpoví nejnovější podporovanou. Transport: Streamable HTTP (jedna odpověď na požadavek); SSE streaming ani stdio nejsou potřeba.
Autentizace přes OAuth 2.1 (doporučeno)
Pro AI klienty (Claude.ai, ChatGPT i vlastní agenty) je doporučenou metodou OAuth 2.1 — připojíte se jedním kliknutím, bez kopírování jakéhokoli tajného klíče. Stačí v daném AI klientovi přidat vlastní MCP konektor a zadat adresu serveru:
https://www.fakturujsi.cz/api/mcp/v1Klient pak automaticky projde autorizačním tokem (authorization code + PKCE): otevře se přihlašovací a souhlasná obrazovka Fakturujsi, kde vyberete, ke kterým datům agentovi udělíte přístup. Souhlas je tím oprávněním — přidělené scopy z tokenu řídí, které nástroje agent uvidí. Žádné nastavení v AI Studio > Connections ani tarifní brána se pro OAuth neuplatní.
Odpojení je okamžité: zrušením udělení (grantu) v Nastavení > AI Studio token při dalším požadavku přestane platit. Přístupové tokeny jsou krátkodobé a při každém požadavku se znovu ověřuje platnost grantu i členství uživatele v organizaci.
Discovery endpointy (pro klienty implementující OAuth)
GET /api/mcp/v1— metadata serveru včetně odkazů na autorizaci.- Požadavek bez platného tokenu vrátí
401s hlavičkouWWW-Authenticate, která ukazuje na metadata chráněného zdroje. /.well-known/oauth-protected-resourcea/.well-known/oauth-authorization-server— RFC 9728 / RFC 8414 metadata.- Endpointy autorizačního serveru:
/api/oauth/register(dynamická registrace klienta, RFC 7591),/api/oauth/authorize,/api/oauth/token,/api/oauth/revoke.
MCP přes OAuth rozumí 11 scopům: invoices:read, invoices:write, contacts:read, contacts:write, expenses:read, expenses:write, products:read, payments:read, payments:write, bank:read a reports:read. Uživatel může udělit jen scopy, které dovoluje jeho role v organizaci (např. čtenář neudělí *:write).
Autentizace přes API klíč (CLI / headless / starší integrace)
Alternativně lze MCP endpoint volat se stejnou Bearer autentizací jako REST API — API klíčem ve formátu fak_xxx. Tato cesta se hodí pro CLI a serverové (headless) skripty. Klíč musí mít scope mcp:connect, plus scopy odpovídající nástrojům, které agent bude volat (např. invoices:write pro create_invoice).
U API klíče platí dvojí kontrola oprávnění: kromě scope klíče musí mít daný zdroj v Nastavení > AI Studio > Connections nastavený accessLevel alespoň write (nebo read pro read-only nástroje). Nástroje, které nesplňují accessLevel, se vůbec nezobrazí v tools/list. (U OAuth se naopak sada nástrojů odvozuje přímo ze scopů v tokenu.)
IP allowlist a rate limit
Pro API klíč lze v Nastavení > AI Studio > Connections nastavit pole povolených IP adres (allowedIps) a minutový limit požadavků (rateLimitPerMinute, max 1 000). Prázdné pole allowlistu = povolení všech IP. Exact string match, bez podpory CIDR ve verzi 1. Vynucení je aktivní pouze pokud enforceStrictAccessControl = true (výchozí pro nové organizace).
OAuth připojení používají pevný limit 120 požadavků / minuta na organizaci a vynucují ho vždy. IP allowlist se u OAuth neuplatňuje (cloudoví AI klienti chodí z rotujících IP) — bezpečnostní branou je souhlas a okamžitě odvolatelný grant.
Konfigurace přes API klíč (Claude Desktop / CLI)
V cloudových klientech (Claude.ai, ChatGPT) přidejte Fakturujsi jako vlastní MCP konektor zadáním adresy https://www.fakturujsi.cz/api/mcp/v1 — autentizaci vyřeší OAuth (viz výše). Pro lokální Claude Desktop nebo headless skripty lze použít API klíč v konfiguračním souboru (~/Library/Application Support/Claude/claude_desktop_config.json na macOS, %APPDATA%/Claude/claude_desktop_config.json na Windows):
{
"mcpServers": {
"fakturujsi": {
"url": "https://www.fakturujsi.cz/api/mcp/v1",
"headers": {
"Authorization": "Bearer fak_xxxxxxxxxxxxxxxxxxxxx"
}
}
}
}JSON-RPC metody
| Metoda | Popis |
|---|---|
| initialize | Úvodní handshake — vrátí protocolVersion, capabilities a serverInfo. |
| tools/list | Vrátí seznam nástrojů dostupných podle udělených oprávnění (OAuth scopy v tokenu, nebo scope API klíče + konfigurace organizace). |
| tools/call | Spustí konkrétní nástroj. Vrací textový obsah (serializovaný JSON) nebo chybu. |
| ping | Health check. Vrací prázdný výsledek. |
| notifications/initialized | Notifikace o dokončení inicializace (nevyžaduje odpověď). |
Dostupné nástroje (tools)
Celkem 15 nástrojů — 7 read + 8 write. Které z nich agent uvidí, závisí na oprávněních: u OAuth na scopech v tokenu, u API klíče na scope klíče a konfiguraci exposedResources v organizaci.
| Nástroj | Scope | Access level | Popis |
|---|---|---|---|
| list_invoices | invoices:read | read | Seznam faktur s volitelnými filtry (status, datum) |
| get_invoice | invoices:read | read | Detail jedné faktury včetně položek a plateb |
| list_contacts | contacts:read | read | Seznam kontaktů s volitelným hledáním |
| list_expenses | expenses:read | read | Seznam nákladů s filtry |
| list_bank_transactions | bank:read | read | Seznam bankovních transakcí |
| list_products | products:read | read | Katalog produktů |
| get_revenue_summary | reports:read | read | Souhrn tržeb za období |
| create_invoice | invoices:write | write | Vytvoří fakturu (kontakt lze najít pres email/name) |
| update_invoice | invoices:write | write | Úprava existující faktury (issue_date, due_date, notes, status) |
| mark_invoice_paid | invoices:write | write | Zaznamená platbu a nastaví stav faktury |
| create_contact | contacts:write | write | Nový kontakt (typ určen podle IČO) |
| update_contact | contacts:write | write | Úprava existujícího kontaktu |
| create_expense | expenses:write | write | Nový náklad (kategorizace dle názvu kategorie) |
| update_expense | expenses:write | write | Úprava existujícího nákladu |
| create_payment | payments:write | write | Platba proti konkrétní faktuře |
Příklady (curl)
initialize
curl -X POST "https://www.fakturujsi.cz/api/mcp/v1" \
-H "Authorization: Bearer fak_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "my-agent", "version": "1.0.0" }
}
}'tools/list
curl -X POST "https://www.fakturujsi.cz/api/mcp/v1" \
-H "Authorization: Bearer fak_xxxxx" \
-H "Content-Type: application/json" \
-d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} }'tools/call — create_invoice
curl -X POST "https://www.fakturujsi.cz/api/mcp/v1" \
-H "Authorization: Bearer fak_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "create_invoice",
"arguments": {
"contact_email": "klient@firma.cz",
"items": [
{ "description": "Konzultace", "quantity": 5, "unit_price": 2000, "tax_rate": 21 }
],
"notes": "Automaticky z MCP agenta",
"status": "draft"
}
}
}'Příklad (Python, httpx)
import httpx
MCP_URL = "https://www.fakturujsi.cz/api/mcp/v1"
API_KEY = "fak_xxxxxxxxxxxxxxxxxxxxx"
def mcp_call(method: str, params: dict | None = None, req_id: int = 1):
response = httpx.post(
MCP_URL,
headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
json={"jsonrpc": "2.0", "id": req_id, "method": method, "params": params or {}},
timeout=30,
)
response.raise_for_status()
return response.json()
# 1) Discover tools
tools = mcp_call("tools/list", req_id=1)["result"]["tools"]
print(f"Available tools: {[t['name'] for t in tools]}")
# 2) Create an invoice
result = mcp_call(
"tools/call",
{
"name": "create_invoice",
"arguments": {
"contact_email": "klient@firma.cz",
"items": [{"description": "Konzultace", "quantity": 5, "unit_price": 2000, "tax_rate": 21}],
"status": "draft",
},
},
req_id=2,
)
print(result["result"]["content"][0]["text"])Chybové kódy JSON-RPC
| Kód | HTTP | Význam |
|---|---|---|
| -32001 | 401 | Chybějící/neplatný token — odpověď nese hlavičku WWW-Authenticate pro start OAuth toku |
| -32700 | 400 | Parse error — nevalidní JSON |
| -32601 | 200 | Method/tool not found — neznámá metoda nebo nástroj |
| -32603 | 200/403 | Internal error — MCP server vypnutý nebo interní chyba |
| -32000 | 403 | IP adresa není v allowlistu |
| -32001 | 429 | Překročen rate limit (headers: X-RateLimit-*, Retry-After) |
| -32002 | 403 | Chybějící scope API klíče pro volaný nástroj |
Události webhooků
Přehled všech událostí, na které se můžete odebírat. Každý webhook požadavek obsahuje hlavičku X-Fakturujsi-Signature pro ověření autenticity pomocí HMAC-SHA256.
Ověření podpisu
Každý webhook požadavek obsahuje hlavičku X-Fakturujsi-Signature s HMAC-SHA256 podpisem těla požadavku. Ověřujte tento podpis proti vašemu tajnému klíči (whsec_...).
const crypto = require("crypto");
function verifyWebhookSignature(body, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body, "utf8")
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}| Událost | Popis |
|---|---|
| invoice.created | Nová faktura byla vytvořena |
| invoice.updated | Faktura byla aktualizována |
| invoice.deleted | Faktura byla smazána |
| invoice.paid | Faktura byla plně uhrazena |
| invoice.overdue | Faktura je po splatnosti |
| invoice.sent | Faktura byla odeslána emailem |
| contact.created | Nový kontakt byl vytvořen |
| contact.updated | Kontakt byl aktualizován |
| contact.deleted | Kontakt byl smazán |
| expense.created | Nový výdaj byl zaznamenán |
| expense.updated | Výdaj byl aktualizován |
| expense.deleted | Výdaj byl smazán |
| product.created | Nový produkt byl vytvořen |
| product.updated | Produkt byl aktualizován |
| product.deleted | Produkt byl smazán |
| payment.created | Nová platba byla zaznamenána |
| payment.deleted | Platba byla smazána |
Stavové kódy
Přehled HTTP stavových kódů, které API vrací.
OK
Požadavek úspěšně zpracován.
Created
Zdroj úspěšně vytvořen.
Bad Request
Neplatný požadavek. Chybí povinné parametry nebo mají špatný formát.
Unauthorized
Chybějící nebo neplatný API klíč.
Forbidden
API klíč nemá oprávnění pro požadovanou operaci (chybějící scope).
Not Found
Požadovaný zdroj nebyl nalezen.
Too Many Requests
Překročen limit požadavků. Respektujte hlavičku Retry-After.
Internal Server Error
Interní chyba serveru. Kontaktujte podporu, pokud přetrvává.