Pro vývojáře9 min5 kroků

Migrace z iDoklad API: kam přejít a jak na to

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 v3U násPoznámka
IssuedInvoicesGET/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).
ProformaInvoicesPOST /api/v2/invoices s type: "proforma" nebo "advance"Zálohové a proforma doklady nejsou samostatný zdroj — rozlišuje je pole type.
CreditNotesPOST /api/v2/invoices s type: "credit_note"Dobropis je stejný zdroj s jinou hodnotou type.
ContactsGET/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.
PaymentsGET/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íkGET/POST /api/v2/products, GET/PUT/DELETE /api/v2/products/{id}Varianty jsou jen ke čtení: GET /api/v2/products/{id}/variants.
NumericSequencesBez 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.
AttachmentsBez přímého ekvivalentuVeřejné API zatím nemá endpoint pro nahrávání příloh k dokladům.
BatchPOST /api/v2/batchAž 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_xxxxxxxxxxxxxxxxxxxxx

Scopy

Každý klíč nese vlastní sadu oprávnění. Chybějící scope vrací 403 FORBIDDEN se jménem toho, který chybí:

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

Uká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 cursor z pole pagination.nextCursor předchozí odpovědi. limit je max. 100 (výchozí 20). Celkový počet se nepočítá, dokud si o něj neřeknete přes include_total=true.
  • Řazení jde přes sort s volitelnou předponou - pro sestupné pořadí, například -createdAt.
  • Chyby mají jednotný tvar { error: { code, message, requestId } } s kódy VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, RATE_LIMITED, CONFLICT, PLAN_REQUIRED, BATCH_LIMIT_EXCEEDED a INTERNAL_ERROR. Do logu si ukládejte requestId — jde i v hlavičce X-Request-Id na 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.deleted

Pokud 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.

TarifZa minutuZa den
Starter605 000
Business20050 000
Premium500200 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-resource a /.well-known/oauth-authorization-server.
  • 15 nástrojů — 7 čtecích a 8 zapisujících, od list_invoices a get_revenue_summary po create_invoice a mark_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; podporujeme 2025-06-18 (výchozí), 2025-03-26 a 2024-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

1

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.

2

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.

3

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.

4

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.

5

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.

Další průvodci