API v2 is now available with cursor pagination, batch operations, and improved rate limits. View v2 documentation →

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.

HTTPS only
JSON format
Rate limiting
Webhook notifikace

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_xxxxxxxxxxxxxxxxxxxxx

Bezpeč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:read
invoices:write
contacts:read
contacts:write
expenses:read
expenses:write
payments:read
payments:write
products:read
products:write
webhooks:read
webhooks:write
bank:read
reports:read
mcp:connect

Rate limiting

Limity se liší podle vašeho tarifu:

TarifLimit
Free / Starter100 požadavků / minuta
Business / Pro1 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/v1

Klient 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í 401 s hlavičkou WWW-Authenticate, která ukazuje na metadata chráněného zdroje.
  • /.well-known/oauth-protected-resource a /.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

MetodaPopis
initializeÚvodní handshake — vrátí protocolVersion, capabilities a serverInfo.
tools/listVrá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/callSpustí konkrétní nástroj. Vrací textový obsah (serializovaný JSON) nebo chybu.
pingHealth check. Vrací prázdný výsledek.
notifications/initializedNotifikace 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ástrojScopeAccess levelPopis
list_invoicesinvoices:readreadSeznam faktur s volitelnými filtry (status, datum)
get_invoiceinvoices:readreadDetail jedné faktury včetně položek a plateb
list_contactscontacts:readreadSeznam kontaktů s volitelným hledáním
list_expensesexpenses:readreadSeznam nákladů s filtry
list_bank_transactionsbank:readreadSeznam bankovních transakcí
list_productsproducts:readreadKatalog produktů
get_revenue_summaryreports:readreadSouhrn tržeb za období
create_invoiceinvoices:writewriteVytvoří fakturu (kontakt lze najít pres email/name)
update_invoiceinvoices:writewriteÚprava existující faktury (issue_date, due_date, notes, status)
mark_invoice_paidinvoices:writewriteZaznamená platbu a nastaví stav faktury
create_contactcontacts:writewriteNový kontakt (typ určen podle IČO)
update_contactcontacts:writewriteÚprava existujícího kontaktu
create_expenseexpenses:writewriteNový náklad (kategorizace dle názvu kategorie)
update_expenseexpenses:writewriteÚprava existujícího nákladu
create_paymentpayments:writewritePlatba 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ódHTTPVýznam
-32001401Chybějící/neplatný token — odpověď nese hlavičku WWW-Authenticate pro start OAuth toku
-32700400Parse error — nevalidní JSON
-32601200Method/tool not found — neznámá metoda nebo nástroj
-32603200/403Internal error — MCP server vypnutý nebo interní chyba
-32000403IP adresa není v allowlistu
-32001429Překročen rate limit (headers: X-RateLimit-*, Retry-After)
-32002403Chybě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álostPopis
invoice.createdNová faktura byla vytvořena
invoice.updatedFaktura byla aktualizována
invoice.deletedFaktura byla smazána
invoice.paidFaktura byla plně uhrazena
invoice.overdueFaktura je po splatnosti
invoice.sentFaktura byla odeslána emailem
contact.createdNový kontakt byl vytvořen
contact.updatedKontakt byl aktualizován
contact.deletedKontakt byl smazán
expense.createdNový výdaj byl zaznamenán
expense.updatedVýdaj byl aktualizován
expense.deletedVýdaj byl smazán
product.createdNový produkt byl vytvořen
product.updatedProdukt byl aktualizován
product.deletedProdukt byl smazán
payment.createdNová platba byla zaznamenána
payment.deletedPlatba byla smazána

Stavové kódy

Přehled HTTP stavových kódů, které API vrací.

200

OK

Požadavek úspěšně zpracován.

201

Created

Zdroj úspěšně vytvořen.

400

Bad Request

Neplatný požadavek. Chybí povinné parametry nebo mají špatný formát.

401

Unauthorized

Chybějící nebo neplatný API klíč.

403

Forbidden

API klíč nemá oprávnění pro požadovanou operaci (chybějící scope).

404

Not Found

Požadovaný zdroj nebyl nalezen.

429

Too Many Requests

Překročen limit požadavků. Respektujte hlavičku Retry-After.

500

Internal Server Error

Interní chyba serveru. Kontaktujte podporu, pokud přetrvává.