Přejít na obsah

Průvodce

Webhooky

Podepsané účetní události ve vašich systémech: adresy, obsah, podpis, opakování a záznam doručení.

Aktualizováno 30. 10. 2026

Webhook je adresa ve vašem systému, kterou DameDoklad zavolá, když se něco stane: třeba když vystavíte fakturu nebo přijde platba. Nemusíte se tak pořád ptát API, co je nového.

Webhooky spravujete v Nastavení > Webhooky nebo přes API. K založení potřebujete tarif s webhooky, viz ceník.

Založení adresy

Terminal
curl https://api.damedoklad.cz/v1/webhooks \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com/hooks/damedoklad", "events": ["invoice.issued", "received_invoice.*"] }'

Odpověď obsahuje podpisové tajemství secret, které začíná whsec_. Uvidíte ho jen jednou. Když ho ztratíte, vyměňte ho přes POST /v1/webhooks/{id}/rotate-secret; staré tajemství okamžitě přestane platit.

V events uveďte názvy událostí, předponu jako invoice.* nebo * pro všechno. Adresa musí být veřejná: soukromé a místní adresy DameDoklad odmítne a před každým doručením to ověřuje znovu.

Co přijde

Každé doručení je POST s tělem v JSON:

JSON
{
  "id": "evt_6f1c2a9b04d3e8f17a5c0b21",
  "type": "invoice.issued",
  "createdAt": "2026-10-30T09:12:44.120Z",
  "workspaceId": "wsp_…",
  "data": { "row": { "id": "inv_…", "number": "FV2026001", "status": "issued" }, "lines": [] }
}
Pole Význam
id Označení události. Při opakovaném doručení zůstává stejné, takže podle něj poznáte opakování.
type Název události.
createdAt Kdy se událost stala.
workspaceId Firma.
data Co událost říká o objektu. Pole se liší podle události, a když potřebujete víc, načtěte aktuální stav přes API.

Spolu s tím přijdou tyto hlavičky:

Hlavička Význam
X-DameDoklad-Event Název události.
X-DameDoklad-Delivery Označení tohoto doručení, stejné jako v záznamu doručení.
X-DameDoklad-Signature Podpis, viz níže.
User-Agent DameDoklad-Webhooks/1.0

Kontrola podpisu

Hlavička s podpisem vypadá jako t=1793351564,v1=5f8a…. t je čas odeslání v unixových sekundách a v1 je šestnáctkové HMAC SHA-256 textu {t}.{syrové tělo} s vaším tajemstvím jako klíčem. Porovnávejte nad syrovými bajty těla, ještě před zpracováním JSON.

Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((part) => part.split('=')));
  const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
  const same = expected.length === parts.v1.length && timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return same && fresh;
}
Python
import hashlib, hmac, time

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(part.split("=", 1) for part in header.split(","))
    signed = parts["t"].encode() + b"." + raw_body
    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"]) and abs(time.time() - int(parts["t"])) < 300

Pětiminutové okno je naše doporučení proti přehrání zprávy. DameDoklad podepisuje každý pokus s novým t.

Opakování

Jakákoli odpověď 2xx do 15 sekund znamená doručeno. Všechno ostatní se opakuje, celkem nejvýš osmkrát:

Po pokusu Další pokus za
1 1 minutu
2 5 minut
3 30 minut
4 2 hodiny
5 6 hodin
6 12 hodin
7 24 hodin

Po osmém neúspěchu zůstane doručení v záznamu jako failed a můžete ho poslat znovu přes POST /v1/webhook-deliveries/{id}/retry. Záznam najdete přes GET /v1/webhooks/{id}/deliveries.

POST /v1/webhooks/{id}/test hned pošle podepsanou událost webhook.test a vrátí výsledek. Testovací události se neopakují.

Příjem událostí

  • Odpovídejte rychle. Událost si uložte a zpracujte ji až potom.
  • Počítejte s opakováním. Stejná událost může přijít víckrát, proto si evidujte id.
  • Nespoléhejte na pořadí. V případě pochybností si načtěte aktuální stav objektu přes API.
  • Událost odchází až po potvrzení transakce, takže stornovaná operace se nikdy neohlásí.

Události

UdálostKdy nastane
invoice.issuedFaktura byla vystavena.
invoice.stornoFaktura byla stornována.
invoice.payment_addedK faktuře přibyla úhrada.
invoice.payment_removedÚhrada faktury byla odebrána.
received_invoice.recordedPřijatá faktura byla zaevidována.
received_invoice.stornoPřijatá faktura byla stornována.
received_invoice.settledPřijatá faktura byla uhrazena.
credit_note.issuedDobropis byl vystaven.
credit_note.stornoDobropis byl stornován.
credit_note.payment_addedK dobropisu přibyla úhrada.
proforma.issuedZálohová faktura byla vystavena.
proforma.payment_addedK zálohové faktuře přibyla úhrada.
delivery_note.issuedDodací list byl vystaven.
member.invitedNěkdo dostal pozvánku do firmy.
member.joinedNěkdo přijal pozvánku.
member.role_changedZměnila se role člena.
member.removedČlen byl odebrán.
company.updatedZměnily se údaje firmy.
inbox.document_receivedDoklad dorazil do K vyřízení.
inbox.document_finishedDoklad v K vyřízení byl dokončen.

Správa přes API

Webhooky spravujete těmito operacemi: