Webhooky
Registrujte endpointy, které přijímají podepsaná oznámení o událostech.
Vytvoření webhooku
Vytvoří endpoint webhooku ve vašem workspace. Emailit na URL posílá odpovídající události v dávkách po nejvýše 100 jako pole JSON podepsané tajným klíčem webhooku secret. Formát požadavku popisuje stránka Požadavky webhooků. Vyžaduje API klíč s oprávněním full.
/webhooksTělo požadavku
namestringPovinnéNázev webhooku. Musí být ve workspace jedinečný; v ostatních endpointech pro webhooky ho můžete použít místo ID.
urlstringPovinnéEndpoint, který přijímá události. Přijímají se URL s http i https; v produkci používejte https.
Emailit při uložení přeloží název hostitele a odmítne localhost, privátní, link-local a další rezervované IP adresy. Při doručování se přesměrování nesledují, takže použijte konečné URL.
all_eventsbooleanPosílat všechny typy událostí, včetně typů přidaných později. Výchozí hodnota je false. Při true se events ignoruje.
enabledbooleanJestli Emailit webhooku doručuje události. Výchozí hodnota je true.
eventsstring[]Typy událostí, které se mají posílat, například ["email.delivered", "email.bounced"]. Viz Typy událostí. Výchozí hodnota je [], což spolu s all_events: false znamená, že webhook nedostane nic.
Názvy událostí se nevalidují. Typ s překlepem se uloží, ale nikdy neodpovídá žádné události.
filterobject | nullFiltr obsahu. Emailit posílá jen události, jejichž objekt odpovídá pravidlům. Dostupné v tarifech Pro, Business a Custom; filtr s pravidly vrací v tarifu Pay as you go 403.
filter.matchstringall (výchozí) pošle událost, když odpovídají všechna pravidla. any ji pošle, když odpovídá alespoň jedno pravidlo.
filter.rulesobject[]Nejvýše 25 pravidel.
filter.rules[].fieldstringPovinnéCesta k poli objektu události zapsaná s tečkami, například to, status, meta.plan nebo u událostí prokliku a otevření email.campaign.id. Úvodní payload. se ignoruje.
filter.rules[].operatorstringPovinnéequals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, is_set, is_not_set, in nebo not_in. Textové operátory porovnávají hodnoty jako řetězce; greater_than a less_than porovnávají čísla.
filter.rules[].valueanyHodnota k porovnání. Povinná u všech operátorů kromě is_set a is_not_set. U in a not_in použijte pole.
Odpověď
Vrací 201 Created s objektem webhooku včetně tajného klíče secret (whsec_ a za ním 64 hexadecimálních znaků). Tajným klíčem ověřujte podpisy požadavků. Znovu ho načtete endpointem Načtení webhooku a vyměníte endpointem Výměna tajného klíče.
| Stavový kód | Kdy |
|---|---|
400 |
Chybí name nebo url, URL je neplatné, nelze ho přeložit nebo odkazuje na blokovanou adresu, nebo je neplatný filtr. |
403 |
Filtr má pravidla a váš tarif filtry webhooků nezahrnuje. Tělo je {"error": "plan_required", "required_plan": "pro"}. |
409 |
Webhook s tímto názvem už existuje. Tělo obsahuje pole existing s id a name existujícího webhooku. |
422 |
Workspace dosáhl limitu webhooků svého tarifu. Tělo obsahuje usage.used a usage.limit. Viz Limity a kvóty. |
{
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events",
"url": "https://api.acme.com/webhooks/emailit",
"all_events": false,
"enabled": true,
"events": ["email.delivered", "email.bounced"],
"filter": null,
"filters_allowed": true,
"last_used_at": null,
"created_at": "2026-10-01T09:41:05.302000+00:00",
"updated_at": "2026-10-01T09:41:05.302000+00:00",
"secret": "whsec_175a02aca3fb7dc3107ca21e4224a73d058cacc628356a39e020422aec3ca434"
}{
"error": "URL resolves to a private/reserved IP address"
}{
"error": "plan_required",
"required_plan": "pro"
}{
"error": "Webhook with this name already exists",
"existing": {
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events"
}
}{
"error": "Pay as you go includes 3 webhook endpoints.",
"usage": {
"used": 3,
"limit": 3
}
}{
"name": "Enterprise bounces",
"url": "https://api.acme.com/webhooks/emailit",
"events": ["email.bounced", "email.complained"],
"filter": {
"match": "all",
"rules": [
{ "field": "meta.plan", "operator": "equals", "value": "enterprise" },
{ "field": "to", "operator": "not_contains", "value": "@acme.com" }
]
}
}Načtení webhooku
Vrací jeden webhook dohledaný podle ID, nebo podle názvu. Je to jediný čtecí endpoint, který vrací tajný klíč secret. Vyžaduje API klíč s oprávněním full.
/webhooks/:idParametry v cestě
idstringPovinnéID webhooku (wh_…), nebo název webhooku zakódovaný pro URL.
Odpověď
Vrací 200 OK s objektem webhooku včetně secret a filters_allowed (jestli váš tarif webhooku povoluje filtr obsahu). last_used_at je čas posledního úspěšného doručení, nebo null, pokud se zatím nic nedoručilo.
Pokud žádný webhook neodpovídá, vrací 404 s error: "Webhook not found".
{
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events",
"url": "https://api.acme.com/webhooks/emailit",
"all_events": false,
"enabled": true,
"events": ["email.delivered", "email.bounced"],
"filter": {
"match": "all",
"rules": [
{ "field": "meta.plan", "operator": "equals", "value": "enterprise" }
]
},
"filters_allowed": true,
"last_used_at": "2026-10-01T10:02:17.845000+00:00",
"created_at": "2026-10-01T09:41:05.302000+00:00",
"updated_at": "2026-10-01T09:41:05.302000+00:00",
"secret": "whsec_175a02aca3fb7dc3107ca21e4224a73d058cacc628356a39e020422aec3ca434"
}{
"error": "Webhook not found"
}Úprava webhooku
Upraví webhook. Pošlete jen pole, která chcete změnit; alespoň jedno je povinné. Tajný klíč se nemění; vyměníte ho endpointem Výměna tajného klíče. Vyžaduje API klíč s oprávněním full.
/webhooks/:idParametry v cestě
idstringPovinnéID webhooku (wh_…), nebo název webhooku zakódovaný pro URL.
Tělo požadavku
namestringNový název. Musí být ve workspace jedinečný.
urlstringNové URL endpointu, http, nebo https. Validuje se stejně jako při vytvoření.
all_eventsbooleantrue posílá všechny typy událostí a vymaže seznam events. Pokud nastavíte false, pošlete také events, jinak webhook nedostane nic.
enabledbooleanfalse doručování zastaví a true ho obnoví. Události, které nastanou, když je webhook vypnutý, se pro něj nezařadí do fronty a později se neodešlou.
eventsstring[]Nahradí seznam typů událostí. Ignoruje se, dokud je all_events true. Názvy se nevalidují.
filterobject | nullNahradí filtr obsahu, ve stejném formátu jako při vytvoření. Pokud ho chcete odebrat, pošlete null. Filtr s pravidly vyžaduje tarif Pro, Business nebo Custom.
Odpověď
Vrací 200 OK s upraveným webhookem. Neobsahuje secret; ten načtete endpointem Načtení webhooku.
| Stavový kód | Kdy |
|---|---|
400 |
Tělo neobsahuje žádné z výše uvedených polí, nebo je neplatné URL či filtr. |
403 |
Filtr má pravidla a váš tarif filtry webhooků nezahrnuje (plan_required). |
404 |
Parametru id neodpovídá žádný webhook. |
409 |
Nový název už používá jiný webhook. |
{
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events",
"url": "https://api.acme.com/webhooks/emailit",
"all_events": false,
"enabled": false,
"events": ["email.delivered", "email.bounced"],
"filter": null,
"filters_allowed": true,
"last_used_at": "2026-10-01T10:02:17.845000+00:00",
"created_at": "2026-10-01T09:41:05.302000+00:00",
"updated_at": "2026-10-01T10:15:40.000000+00:00"
}{
"error": "No valid fields provided for update. Provide at least one of: name, url, all_events, enabled, events, filter"
}{
"error": "Webhook not found"
}{
"error": "Another webhook with this name already exists"
}Výpis webhooků
Vrací webhooky ve vašem workspace od nejnovějších a počet webhooků, který váš tarif povoluje. Tajné klíče seznam neobsahuje. Vyžaduje API klíč s oprávněním full.
/webhooksParametry dotazu
pageintegerČíslo stránky, začíná na 1. Výchozí hodnota je 1.
limitintegerPočet webhooků na stránce, od 1 do 100. Výchozí hodnota je 10.
searchstringHledá v názvu nebo URL webhooku bez ohledu na velikost písmen.
matchstringHodnota all (výchozí) vyžaduje shodu se všemi filtry. S hodnotou or stačí shoda s kterýmkoli filtrem. Viz Filtrování.
orderstringKlíč řazení pro tento výpis. Viz klíče řazení níže.
directionstringasc, nebo desc.
Filtry a řazení
Filtry výpisů jsou jedna úroveň parametrů dotazu ve tvaru key.condition=value. Parametry match, order a direction a seznam podmínek pro každý typ najdete na stránce Filtrování.
Klíče filtrů
| Klíč | Typ | Podmínky | Poznámky |
|---|---|---|---|
name | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
url | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
enabled | boolean | exact, not_exact | |
created_at | date | exact, before, after, empty, not_empty |
Klíče řazení
V parametru order předejte jeden z těchto klíčů a v parametru direction hodnotu asc, nebo desc: name, url, enabled, created_at
Odpověď
Vrací 200 OK s webhooky v poli data, next_page_url a previous_page_url (na začátku a na konci seznamu null) a objekt usage: used je počet webhooků ve workspace, limit je maximum vašeho tarifu a filters_allowed udává, jestli váš tarif zahrnuje filtry obsahu.
{
"data": [
{
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events",
"url": "https://api.acme.com/webhooks/emailit",
"all_events": false,
"enabled": true,
"events": ["email.delivered", "email.bounced"],
"filter": null,
"filters_allowed": true,
"last_used_at": "2026-10-01T10:02:17.845000+00:00",
"created_at": "2026-10-01T09:41:05.302000+00:00",
"updated_at": "2026-10-01T10:02:17.845000+00:00"
}
],
"next_page_url": null,
"previous_page_url": null,
"usage": {
"used": 1,
"limit": 10,
"filters_allowed": true
}
}{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid API key"
}Smazání webhooku
Trvale smaže webhook a jeho odběry událostí. Pokud chcete doručování zastavit jen dočasně, místo toho upravte webhook a nastavte enabled: false. Vyžaduje API klíč s oprávněním full.
/webhooks/:idParametry v cestě
idstringPovinnéID webhooku (wh_…), nebo název webhooku zakódovaný pro URL.
Odpověď
Vrací 200 OK s id a name smazaného webhooku a deleted: true. Pokud žádný webhook neodpovídá, vrací 404 s error: "Webhook not found".
{
"object": "webhook",
"id": "wh_2xLb3Kp9Qr1Vt7Mn5Ws0Yd4Hc8e",
"name": "Production events",
"deleted": true
}{
"error": "Webhook not found"
}Odeslání testovací události
Pošle na URL webhooku ukázkovou událost zvoleného typu a vrátí odpověď vašeho endpointu. Použijte ho ke kontrole, že je váš endpoint dosažitelný a správně ověřuje podpisy. Vyžaduje API klíč s oprávněním full.
Požadavek má stejný formát, hlavičky a podpis jako skutečné doručení: pole JSON s jednou událostí, jejíž event_id začíná na evt_test_, podepsané aktuálním tajným klíčem webhooku. Odešle se, i když je webhook vypnutý nebo daný typ neodebírá, neukládá se jako požadavek webhooku a neopakuje se. Ukázková data jsou pevně daná a neodkazují na skutečné objekty.
Z jedné IP adresy můžete poslat 5 testovacích událostí za minutu; další vracejí 429.
/webhooks/{id}/testParametry v cestě
idstringpovinnéwh_…), nebo název webhooku.Parametry v těle požadavku
typestringpovinné| Zdroj | Typy událostí |
|---|---|
email.accepted, email.scheduled, email.delivered, email.bounced, email.attempted, email.failed, email.rejected, email.clicked, email.loaded, email.complained, email.received, email.suppressed, email.canceled, email.unsubscribed, email.resubscribed |
|
| Doména | domain.created, domain.updated, domain.deleted |
| Seznam kontaktů | audience.created, audience.updated, audience.deleted |
| Odběratel | subscriber.created, subscriber.updated, subscriber.deleted |
| Kontakt | contact.created, contact.updated, contact.deleted |
| Šablona | template.created, template.updated, template.deleted |
| Blokace | suppression.created, suppression.updated, suppression.deleted |
| Ověření e-mailu | email_verification.created, email_verification.updated, email_verification_list.created, email_verification_list.updated |
| Kampaň | campaign.created, campaign.updated, campaign.deleted, campaign.scheduled, campaign.queued, campaign.sending, campaign.testing, campaign.sent, campaign.canceled, campaign.archived |
Význam jednotlivých událostí najdete na stránce Typy událostí.
Odpověď
okbooleantrue, pokud váš endpoint odpověděl stavovým kódem 2xx.status_codeinteger0, pokud se Emailit nemohl připojit, požadavku po 30 sekundách vypršel časový limit, endpoint přesměroval (přesměrování se nesledují) nebo URL odkazuje na blokovanou adresu.bodystringtypestringpayloadobject[]Pokud type chybí nebo je neznámý, vrací 400, pokud webhook neexistuje, vrací 404, a když překročíte limit pro testy, vrací 429.
{
"ok": true,
"status_code": 200,
"type": "email.delivered",
"payload": [
{
"event_id": "evt_test_3G0pUekgBm1uIxi9m4C380H70Zq",
"type": "email.delivered",
"object": {
"id": "eml_test_001",
"email_id": 12345,
"message_id": "<test-token@mydomain.com>",
"from": "sender@mydomain.com",
"to": "recipient@example.com",
"subject": "Test email",
"status": "delivered",
"delivered_at": "2026-01-15T10:30:00.000Z"
},
"data": {
"object": {
"id": "eml_test_001",
"email_id": 12345,
"message_id": "<test-token@mydomain.com>",
"from": "sender@mydomain.com",
"to": "recipient@example.com",
"subject": "Test email",
"status": "delivered",
"delivered_at": "2026-01-15T10:30:00.000Z"
}
}
}
],
"body": "{\"received\":true}"
}{
"error": "Unknown event type"
}{
"statusCode": 429,
"error": "Too Many Requests",
"message": "Rate limit exceeded, retry in 1 minute"
}Výměna tajného klíče
Vygeneruje pro webhook nový tajný klíč a vrátí ho. Vyžaduje API klíč s oprávněním full.
Starý tajný klíč se přestane používat okamžitě: každý požadavek odeslaný po výměně, včetně opakování dřívějších událostí, je podepsaný novým tajným klíčem. Žádné přechodné období není, takže tajný klíč na svém endpointu aktualizujte hned po výměně, nebo během přechodu krátce přijímejte oba. Viz Ověření podpisu webhooků.
/webhooks/{id}/reset-secretParametry v cestě
idstringpovinnéwh_…), nebo název webhooku.Odpověď
Vrací objekt webhooku s novým secret (whsec_ a za ním 64 hexadecimálních znaků). Pokud webhook neexistuje, vrací 404.
{
"object": "webhook",
"id": "wh_3NGa6raJ3s1VJ75lO9km6Dqg4cQ",
"name": "Order notifications",
"url": "https://acme.com/webhooks/emailit",
"all_events": false,
"enabled": true,
"events": ["email.delivered", "email.bounced", "email.complained"],
"filter": null,
"last_used_at": "2026-10-01T12:58:40.000000+00:00",
"created_at": "2026-08-14T09:12:03.000000+00:00",
"updated_at": "2026-10-01T13:20:11.000000+00:00",
"secret": "whsec_a0a593d006bdec5aff2f21e88afd543ba239431acbe7d8dc7a9723d76e0a64e2"
}{
"error": "Webhook not found"
}Opakování neúspěšných požadavků
Znovu zařadí k doručení všechny požadavky tohoto webhooku, které za posledních 7 dní trvale selhaly. Vyžaduje API klíč s oprávněním full.
Požadavek trvale selže po posledním automatickém opakování (11 pokusů během několika dní; viz Opakování a selhání). Znovu zařazené požadavky začínají od začátku s úplným plánem opakování a doručí se během několika sekund. Pokud se do fronty zařadí alespoň jeden požadavek a webhook byl vypnutý, například po 3 dnech nepřetržitých chyb, znovu se zapne.
Nejdřív opravte svůj endpoint, jinak požadavky selžou znovu. Pokud chcete zopakovat jen jeden požadavek, použijte endpoint Opakování jednoho požadavku.
/webhooks/{id}/retry-failedParametry v cestě
idstringpovinnéwh_…), nebo název webhooku.Odpověď
retriedinteger0, pokud nebylo co opakovat; zapnutí nebo vypnutí webhooku se v tom případě nemění.Pokud webhook neexistuje, vrací 404.
{
"retried": 37
}{
"error": "Webhook not found"
}Opakování jednoho požadavku
Znovu zařadí k doručení jeden trvale neúspěšný požadavek webhooku s novým plánem opakování. Pokud byl webhook vypnutý, znovu se zapne. Vyžaduje API klíč s oprávněním full.
Takto lze zopakovat jen požadavky, které vyčerpaly svá automatická opakování; požadavky, které ještě čekají nebo se opakují, vracejí 400. ID požadavků (whr_…) najdete na kartě Requests u webhooku v sekci Email APIWebhooks. Pokud chcete zopakovat vše za posledních 7 dní najednou, použijte endpoint Opakování neúspěšných požadavků.
/webhooks/{id}/requests/{request_id}/retryParametry v cestě
idstringpovinnéwh_…), nebo název webhooku.request_idstringpovinnéwhr_…).Odpověď
retriedinteger1.idstring| Stavový kód | Kdy |
|---|---|
400 |
Požadavek trvale neselhal, nebo nemá žádnou událost k opětovnému odeslání. |
404 |
Webhook neexistuje, nebo mu požadavek nepatří. |
{
"retried": 1,
"id": "whr_3tWVVMd2eHv3R9B5DWTLtwwU05X"
}{
"error": "Only permanently failed requests can be retried"
}{
"error": "Webhook request not found"
}