# Opakování a selhání

> Jak Emailit opakuje neúspěšné požadavky webhooků, kdy vám pošle e-mail a vypne endpoint a jak neúspěšné požadavky prohlížet a znovu odeslat.

Když váš endpoint požadavek webhooku nepřijme, Emailit si události ponechá a zkouší je odeslat znovu podle plánu, který trvá něco přes tři dny. Tato stránka tento plán uvádí, vysvětluje, jaké e-maily Emailit posílá a kdy endpoint vypne, a ukazuje, jak neúspěšné požadavky prohlížet a znovu odeslat.

## Co se považuje za selhání

Požadavek selže, když váš endpoint:

- Vrátí jakýkoli stav mimo rozsah `200`–`299`, včetně přesměrování (`3xx`).
- Neodpoví do 30 sekund.
- Není dostupný: chyby DNS, odmítnutá spojení, chyby TLS nebo URL, která se přeloží na soukromou IP adresu.

Selhání se týká celé dávky: všechny události v požadavku se opakují společně.

## Plán opakování

Po každém neúspěšném pokusu Emailit před dalším pokusem počká:

| Pokus | Čekání po předchozím pokusu | Čas od prvního pokusu |
| --- | --- | --- |
| 1 | Odešle se během několika sekund po události | 0 |
| 2 | 5 minut | 5 minut |
| 3 | 30 minut | 35 minut |
| 4 | 2 hodiny | 2 hodiny 35 minut |
| 5 | 5 hodin | 7 hodin 35 minut |
| 6 | 12 hodin | 19 hodin 35 minut |
| 7 | 12 hodin | 1 den 7 hodin |
| 8 | 12 hodin | 1 den 19 hodin |
| 9 | 12 hodin | 2 dny 7 hodin |
| 10 | 12 hodin | 2 dny 19 hodin |
| 11 | 12 hodin | 3 dny 7 hodin |

Pokud selže i 11. pokus, požadavek dostane stav **Failed** a automaticky se už neopakuje. Ještě 7 dní ho ale můžete [odeslat znovu](#resend-failed-requests).

Každý pokus se znovu podepíše s novým časovým razítkem. Události, které dorazí, zatímco starší požadavky čekají na opakování, se odesílají ve vlastních dávkách, takže jedna problémová událost nezablokuje novější.

## E-mailová upozornění

Emailit pošle vlastníkovi workspace e-mail ve dvou případech:

| Kdy | E-mail |
| --- | --- |
| Požadavek selže potřetí (asi 35 minut po prvním selhání) | Upozornění, že webhook selhává. Odešle se jednou za incident. Další dostanete, jen pokud po úspěšném doručení dojde k novým selháním, nebo po 4 dnech. |
| Webhook se automaticky vypne | Upozornění, že byl webhook vypnut, s posledním stavovým kódem. |

## Automatické vypnutí

Pokud webhook od svého nejstaršího neúspěšného požadavku 3 dny nic úspěšně nedoručil, Emailit ho při dalším neúspěšném pokusu vypne. V praxi se to stane zhruba při 11. pokusu prvního neúspěšného požadavku, nebo dřív, pokud nové události dál selhávají.

Dokud je webhook vypnutý:

- Nové události se pro něj do fronty nezařazují. V [proudu událostí](/cs/docs/logs/events/) se ale dál zaznamenávají.
- Požadavky, které čekaly na opakování, dál čekají a pokračují, jakmile webhook zapnete.
- Stránka webhooku ukazuje stav **Disabled**.

Pokud ho chcete znovu zapnout, vyberte v nabídce akcí webhooku **Enable webhook**, nebo zavolejte endpoint [Úprava webhooku](/cs/docs/api-reference/webhooks/update/) s `{"enabled": true}`. Webhook zapne také **Retry failed** a opakování jednoho požadavku.

## Karta Requests

Otevřete webhook v **Email API → Webhooks** a na jeho kartě **Requests** uvidíte požadavky od nejnovějšího:

| Sloupec | Popis |
| --- | --- |
| **Event type** | Událost v požadavku. |
| **Event ID** | ID `evt_`, stejná hodnota, jakou váš endpoint dostává jako `event_id`. |
| **Created** | Kdy se požadavek zařadil do fronty. |
| **Attempts** | Kolik pokusů o doručení zatím selhalo. |
| **Status** | **Pending** (ještě se nezkoušel), **Attempting** (alespoň jednou selhal, bude se opakovat), **Delivered**, nebo **Failed** (opakování se vyčerpala). |

Filtrovat můžete podle **Status code**, **Event** nebo **Created**. Testovací události z **Send test** se tu nezobrazují.

U požadavku ve stavu **Failed** vyberte **View** a otevře se **Failure reason**: stavový kód, který váš endpoint vrátil (`0`, když nepřišla žádná HTTP odpověď), kdy byl požadavek vytvořen a kdy selhal, a prvních 2 000 znaků těla odpovědi.

## Znovu odešlete neúspěšné požadavky

Znovu odeslat můžete požadavky ve stavu **Failed**, jejichž poslední selhání nastalo během posledních 7 dní. Znovu odeslané požadavky se vrátí do stavu **Pending** a začnou nový cyklus opakování od 1. pokusu. Doručení není okamžité: převezme je další doručovací běh během několika sekund.

### Zopakujte jeden požadavek

Na kartě **Requests** vyberte v řádku neúspěšného požadavku **Retry**. Tlačítko se zobrazuje jen u neúspěšných požadavků z posledních 7 dní.

Endpoint API je [Opakování jednoho požadavku](/cs/docs/api-reference/webhooks/retry-request/), `POST /v2/webhooks/{id}/requests/{request_id}/retry`, a vrací `{"retried": 1, "id": "whr_…"}`. Přijímá jen požadavky ve stavu **Failed** a pro ostatní vrací `400`. ID požadavků (`whr_…`) nevypisuje žádný veřejný endpoint, takže pro automatizaci přes API použijte raději **Retry failed**.

### Zopakujte neúspěšné požadavky

Otevřete nabídku akcí webhooku a vyberte **Retry failed**. Všechny požadavky, které selhaly během posledních 7 dní, se znovu zařadí do fronty a webové rozhraní zobrazí „Queued 3 failed request(s) for retry“ se skutečným počtem, nebo „No failed requests in the last 7 days“.

Přes API zavolejte [Opakování neúspěšných požadavků](/cs/docs/api-reference/webhooks/retry-failed/):

```bash
curl -X POST https://api.emailit.com/v2/webhooks/wh_2xGk8Hd3RvN6qT1mWsB9cL4pZ7e/retry-failed \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

```json
{ "retried": 42 }
```

## Obnovte provoz po výpadku

1. **Opravte endpoint.** Pomocí **View** u neúspěšného požadavku zjistíte, co váš endpoint vrátil.

2. **Ověřte, že funguje.** Použijte **Send test** z nabídky akcí, nebo přes API [Odeslání testovací události](/cs/docs/api-reference/webhooks/test/), a zkontrolujte, že dostanete `2xx`.

3. **Zapněte webhook**, pokud ho Emailit vypnul.

4. **Znovu odešlete neúspěšné požadavky.** Vyberte **Retry failed** a do fronty se znovu zařadí všechny požadavky, které selhaly během posledních 7 dní. Požadavky, které jsou stále ve stavu **Attempting**, se opakují podle vlastního plánu.

5. **Doplňte mezery.** Události, které nastaly, zatímco byl webhook vypnutý, se do fronty nikdy nezařadily, a selhání starší než 7 dní nelze znovu odeslat. Načtěte je za dotčené období přes [API událostí](/cs/docs/logs/events/#reconcile-missed-webhook-events) a zpracujte ty, které vám chybějí.

Protože se při opakování znovu odesílají celé dávky, udělejte svůj handler idempotentní: ukládejte si každé `event_id` a události, které jste už zpracovali, přeskakujte. Viz [Požadavky webhooků](/cs/docs/webhooks/webhook-requests/#duplicates).

## Uchovávání

Požadavky webhooků se řídí dobou uchovávání pro **Logs**, takže starší řádky z karty **Requests** postupně mizí.

| | Pay as you go | Pro | Business | Custom |
| --- | --- | --- | --- | --- |
| Uchovávání logů požadavků | 7 dní | 30 dní | 30 dní | Flexibilní |

## Související

  - [Požadavky webhooků](/cs/docs/webhooks/webhook-requests/)
  - [Události](/cs/docs/logs/events/)

---
Zdroj: https://emailit.com/cs/docs/webhooks/retries-and-failures/
