iDoklad ukončuje API v2 k 8. 9. 2026. Ať už integraci přepíšete na jejich v3, nebo ji přenesete jinam, přepis kódu vás čeká tak jako tak — otázka je jen, na čem budete stavět dál. Tenhle průvodce je mapa pro druhou variantu: co u nás odpovídá kterému zdroji, jak se autentizujete, jak fungují naše webhooky a jaké platí limity.
Co se přesně mění
Podle oznámení iDokladu přestanou integrace postavené na v2 po 8. 9. 2026 komunikovat. Týká se to e-shopů, můstků a middlewaru, účetních a ERP systémů i pluginů třetích stran. Pokud vám integraci dodává někdo jiný, první krok je zeptat se ho, jestli ji na v3 přepisuje — když ano, není co řešit. Souvislosti jsme rozepsali v článku konec iDoklad API v2.
Mapování zdrojů: iDoklad v3 → Fakturujsi API v2
Naše aktuální REST API je v2 na adrese https://www.fakturujsi.cz/api/v2. Strojově čitelná specifikace je na /api/v2/openapi.json (OpenAPI 3.1), interaktivní dokumentace na /docs/api/v2. Kde ekvivalent nemáme, je to v tabulce napsané — ne obcházené.
| Zdroj v iDoklad v3 | U nás | Poznámka |
|---|---|---|
| IssuedInvoices | GET/POST /api/v2/invoices, GET/PUT/DELETE /api/v2/invoices/{id} | Navíc GET /api/v2/invoices/{id}/pdf a POST /api/v2/invoices/{id}/send (odeslání e-mailem). |
| ProformaInvoices | POST /api/v2/invoices s type: "proforma" nebo "advance" | Zálohové a proforma doklady nejsou samostatný zdroj — rozlišuje je pole type. |
| CreditNotes | POST /api/v2/invoices s type: "credit_note" | Dobropis je stejný zdroj s jinou hodnotou type. |
| Contacts | GET/POST /api/v2/contacts, GET/PUT/DELETE /api/v2/contacts/{id} | Filtry type (person/company), country a fulltext search přes jméno, e-mail nebo IČO. |
| Payments | GET/POST /api/v2/payments, GET/PUT/DELETE /api/v2/payments/{id} | Platba se váže na fakturu přes invoiceId; seznam lze filtrovat parametrem invoice_id. |
| Items / ceník | GET/POST /api/v2/products, GET/PUT/DELETE /api/v2/products/{id} | Varianty jsou jen ke čtení: GET /api/v2/products/{id}/variants. |
| NumericSequences | Bez přímého ekvivalentu | Číselné řady se spravují v aplikaci, ne přes API. Konkrétní řadu ale při vytváření faktury vyberete polem numberSeriesId; bez něj se číslo přidělí z výchozí řady automaticky. |
| Attachments | Bez přímého ekvivalentu | Veřejné API zatím nemá endpoint pro nahrávání příloh k dokladům. |
| Batch | POST /api/v2/batch | Až 25 operací v jednom požadavku, provádějí se sekvenčně; každá položka nese vlastní status a body. |
Nad rámec tabulky nabízí starší v1 ještě bankovní účty a transakce (/api/v1/bank/accounts, /api/v1/bank/transactions) a hotové reporty (/api/v1/reports/revenue, overdue, expenses) — popsané v dokumentaci v1. Pro novou integraci sahejte po v2: má kurzorové stránkování, dávkové operace a jednotný formát chyb.
Autentizace
iDoklad v3 jede na OAuth2 (Authorization Code i Client Credentials). U nás máte dvě cesty a každá je vhodná na něco jiného:
API klíč (server-to-server)
Statický Bearer token ve tvaru fak_.... Bez expirace tokenů a bez refresh koloběhu — klíč vytvoříte v nastavení, přidělíte mu scopy, volitelně datum expirace, a kdykoli ho zrušíte. V databázi je uložený jako SHA-256 otisk, celý klíč vidíte jen při vytvoření.
OAuth 2.1 (pro AI klienty přes MCP)
Authorization Code + PKCE, dynamická registrace klienta podle RFC 7591 a discovery podle RFC 9728 / RFC 8414. Používá se pro připojení AI asistentů k našemu MCP serveru — detaily níže.
Klíč se posílá v hlavičce Authorization:
Authorization: Bearer fak_xxxxxxxxxxxxxxxxxxxxxScopy
Každý klíč nese vlastní sadu oprávnění. Chybějící scope vrací 403 FORBIDDEN se jménem toho, který chybí:
invoices:readinvoices:writecontacts:readcontacts:writeexpenses:readexpenses:writepayments:readpayments:writeproducts:readproducts:writewebhooks:readwebhooks:writebank:readreports:readmcp:connectUkázka: vystavení faktury
Povinná pole jsou contactId, issueDate, dueDate a aspoň jedna položka. Číslo dokladu ani variabilní symbol neposíláte — přidělí se z číselné řady na serveru, v jedné transakci s vložením faktury.
curl -X POST "https://www.fakturujsi.cz/api/v2/invoices" \
-H "Authorization: Bearer fak_xxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"contactId": "3f1c1b02-9b3d-4a7e-9f11-2c8d5e6a7b90",
"issueDate": "2026-09-09",
"dueDate": "2026-09-23",
"currency": "CZK",
"status": "issued",
"items": [
{
"description": "Vyvoj integrace",
"quantity": 8,
"unit": "h",
"unitPrice": 1500,
"taxRate": 21
}
]
}'Odpověď je zabalená v klíči data. Peněžní částky chodí jako řetězce, aby se cestou neztratila přesnost:
{
"data": {
"id": "8c0f4d21-5a6b-4c3d-8e9f-1a2b3c4d5e6f",
"number": "20260042",
"status": "issued",
"currency": "CZK",
"subtotal": "12000.00",
"taxTotal": "2520.00",
"total": "14520.00"
}
}Na co si dát pozor při přepisu
- Stránkování je kurzorové, ne stránkové: posíláte
cursorz polepagination.nextCursorpředchozí odpovědi.limitje max. 100 (výchozí 20). Celkový počet se nepočítá, dokud si o něj neřeknete přesinclude_total=true. - Řazení jde přes
sorts volitelnou předponou-pro sestupné pořadí, například-createdAt. - Chyby mají jednotný tvar
{ error: { code, message, requestId } }s kódyVALIDATION_ERROR,UNAUTHORIZED,FORBIDDEN,NOT_FOUND,RATE_LIMITED,CONFLICT,PLAN_REQUIRED,BATCH_LIMIT_EXCEEDEDaINTERNAL_ERROR. Do logu si ukládejterequestId— jde i v hlavičceX-Request-Idna každé odpovědi. - Validace kontaktů: IČO se ověřuje proti
^\d{8}$, DIČ proti^CZ\d{8,10}$. - Cizí měny: když u nekorunové faktury neposlete
exchangeRate, dohledá se kurz k datu vystavení a dopočítá se částka v CZK.
Webhooky
Odběry se spravují přes /api/v2/webhooks (GET, POST, PUT, DELETE) a otestovat doručení jde kdykoli přes POST /api/v2/webhooks/{id}/test. Podpisový secret dostanete jen jednou, při vytvoření odběru.
Jak vypadá doručení
Na vaši URL přijde POST s tělem { event, entityId, data, timestamp } a s těmito hlavičkami:
X-Fakturujsi-Signature: sha256=<hex>— HMAC-SHA256 syrového těla požadavku vaším secretem. Ověřte ho porovnáním v konstantním čase, než tělo zpracujete.X-Fakturujsi-Event— jméno události.X-Fakturujsi-Delivery— ID doručení; použijte ho jako klíč idempotence.
Na odpověď čekáme 10 sekund. Cokoli jiného než 2xx se opakuje — celkem až 6 pokusů s odstupem 1 minuta, 5 minut, 15 minut, 1 hodina a 4 hodiny. Endpoint proto pište idempotentně a odpovídejte rychle; těžkou práci si zařaďte do fronty.
Události, na které se lze přihlásit
invoice.createdinvoice.updatedinvoice.deletedinvoice.paidinvoice.overdueinvoice.sentcontact.createdcontact.updatedcontact.deletedexpense.createdexpense.updatedexpense.deletedproduct.createdproduct.updatedproduct.deletedpayment.createdpayment.deletedPokud stavíte konektor pro Zapier nebo Make, hodí se REST hooks: POST /api/v1/hooks/subscribe a /api/v1/hooks/unsubscribe. Kompletní popis obou je v dokumentaci API.
Limity a tarify
Limity API v2 se počítají ve dvou oknech současně — minutovém i denním — a v hlavičkách X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset vidíte ten přísnější z nich. Při překročení dostanete 429 s hlavičkou Retry-After.
| Tarif | Za minutu | Za den |
|---|---|---|
| Starter | 60 | 5 000 |
| Business | 200 | 50 000 |
| Premium | 500 | 200 000 |
Čtěte na rovinu: vytvoření API klíče u nás vyžaduje tarif Business nebo vyšší — na tarifu Zdarma a Starter si klíč nezaložíte. Tarif Zdarma navíc API v2 odmítá i na úrovni endpointů (PLAN_REQUIRED). Bez tarifní bariéry je u nás jenom MCP: čtení funguje už na tarifu Zdarma, viz sekce níže. Aktuální ceny najdete na našem ceníku.
Rozdíl, který v praxi rozhoduje o architektuře, není ani tak výška limitu jako jeho okno. iDoklad podle svého ceníku počítá požadavky měsíčně: tarif Oblíbený má 7 500 požadavků za měsíc, tarif Prémiový 75 000 za měsíc, a nejnižší placený tarif API neobsahuje vůbec. Měsíční kvóta znamená, že jeden špatně napsaný cyklus na začátku měsíce vám může vyčerpat rozpočet na zbytek období. Denní okno se naproti tomu vyresetuje druhý den.
Údaje o tarifech iDokladu vycházejí z jeho veřejného ceníku na idoklad.cz/cenik ověřeného k 26. 8. 2026. Ceny tam jsou uváděné bez DPH a liší se podle toho, jestli platíte měsíčně, čtvrtletně, nebo ročně; nabídka se může měnit, aktuální stav si ověřte přímo u zdroje.
MCP: co dostanete navíc oproti REST
Kromě REST API vystavujeme MCP server (Model Context Protocol) na POST /api/mcp/v1. Je to JSON-RPC 2.0 přes Streamable HTTP — díky němu se na vaše fakturační data napojí Claude.ai, ChatGPT i vlastní agent, aniž byste pro ně psali jediný řádek integračního kódu.
- Připojení na jedno kliknutí: v AI klientovi zadáte adresu serveru a projdete OAuth 2.1 tokem (authorization code + PKCE). Žádný secret nikam nekopírujete. Podporovaná je dynamická registrace klienta (RFC 7591) i discovery přes
/.well-known/oauth-protected-resourcea/.well-known/oauth-authorization-server. - 15 nástrojů — 7 čtecích a 8 zapisujících, od
list_invoicesaget_revenue_summarypocreate_invoiceamark_invoice_paid. Agent uvidí jen ty, na které mu token dává scope. - Čtení už na tarifu Zdarma. Zápisové scopy se pod tarifem Business z tokenu automaticky odřezávají, čtecí projdou vždy — a kontroluje se to při každém požadavku, takže i po změně tarifu platí okamžitě.
- Odvolatelné kdykoli: zrušením souhlasu v nastavení token při dalším požadavku přestane platit. OAuth připojení mají pevný limit 120 požadavků za minutu na organizaci.
- Verze protokolu se vyjednává v metodě
initialize; podporujeme2025-06-18(výchozí),2025-03-26a2024-11-05.
Kompletní popis — JSON-RPC metody, tabulka nástrojů se scopy, ukázky v curl i Pythonu, chybové kódy — je v sekci MCP protokol v dokumentaci API.
Postup přepisu krok za krokem
Zinventarizujte, co integrace opravdu volá
Projděte logy nebo kód a sepište seznam zdrojů, které skutečně používáte. Většina integrací sáhne na dva až tři: vystavené faktury, kontakty a platby. Zbytek tabulky výše pak řešit nemusíte.
Založte účet a vydejte si API klíč
Registrace je zdarma. Pro REST API pak potřebujete tarif Business nebo vyšší; klíč vytvoříte v nastavení, přidělíte mu jen ty scopy, které integrace opravdu potřebuje, a uložíte ho do proměnné prostředí — nikdy do repozitáře ani do klientského JavaScriptu.
Přemapujte volání podle tabulky
Nejčastější tři změny: proforma a dobropis nejsou samostatné zdroje (rozhoduje pole type), stránkování je kurzorové místo stránkového, a částky chodí jako řetězce. Číslo dokladu si nepřidělujte sami — server ho přidělí z číselné řady v jedné transakci s vložením faktury.
Přepojte události na naše webhooky
Vytvořte odběr přes POST /api/v2/webhooks, secret z odpovědi si uložte (podruhé se nezobrazí) a v endpointu ověřujte hlavičku X-Fakturujsi-Signature. Doručení otestujete bez čekání na reálnou událost přes POST /api/v2/webhooks/{id}/test.
Přeneste data a pusťte to naostro
Historii faktur a kontaktů nemusíte přehrávat přes API — import z iDokladu má vlastní cestu, popsanou na stránce přechod z iDokladu. Nové doklady pak nechte chvíli téct do obou systémů a porovnejte výstupy, než starou integraci vypnete.
Časté dotazy
Přepis kódu vás čeká tak jako tak
Než ho odpracujete, mrkněte, co u nás dostanete navíc — a jestli se vám vyplatí přepisovat rovnou k nám. Registrace je zdarma a čtení přes MCP na ní funguje hned.