Повторы и расписание
Событие доставлено, когда ваш эндпоинт ответил 2xx в течение 15 секунд. Всё остальное — другой статус,
таймаут, отказ в соединении — повторяется. Редиректы не выполняются.
Расписание
Заголовок раздела «Расписание»| Попытка | После предыдущей |
|---|---|
| 2 | 10 секунд |
| 3 | 30 секунд |
| 4–7 | 1, 2, 5, 10 минут |
| 8–10 | 15, 30 минут, 1 час |
| дальше | каждый час, пока не пройдёт 24 часа с первой попытки |
Retry-After дольше следующей паузы учитывается, но не больше часа. Через 24 часа доставка переходит в
failed. 410 Gone сразу завершает доставку как failed и выключает эндпоинт.
События, доставки и попытки хранятся 30 дней.
Повторная отправка доставки
Заголовок раздела «Повторная отправка доставки»Доставленную или неудавшуюся доставку можно отправить снова — то же событие, тот же webhook-id, новое
расписание — после того как вы исправили эндпоинт:
#!/usr/bin/env bash# One delivery: the exact body sent and every attempt.set -euo pipefail. "$(dirname "$0")/../../signed-request.sh"
delivery_id=$(mka_required DELIVERY_ID)mka_request GET "/v1/webhook-deliveries/$delivery_id"// One delivery: the exact body sent and every attempt.import { print, request, required } from "../../signed-request.mjs";
const deliveryId = required("DELIVERY_ID");const answer = await request("GET", `/v1/webhook-deliveries/${deliveryId}`);print(answer);<?php// One delivery: the exact body sent and every attempt.
declare(strict_types=1);
require __DIR__ . '/../../signed_request.php';
$deliveryId = mka_required('DELIVERY_ID');mka_show(mka_request('GET', "/v1/webhook-deliveries/{$deliveryId}"));"""One delivery: the exact body sent and every attempt."""from signed_request import request, required, show
delivery_id = required("DELIVERY_ID")show(request("GET", f"/v1/webhook-deliveries/{delivery_id}"))//go:build ignore
// One delivery: the exact body sent and every attempt.package main
import ( "docs.processing.yolotech.cc/examples/signedrequest")
func main() { deliveryID := signedrequest.Required("DELIVERY_ID") signedrequest.Show(signedrequest.Request("GET", "/v1/webhook-deliveries/"+deliveryID, nil, ""))}#!/usr/bin/env bash# Send a delivered or failed event again, under the same event ID.set -euo pipefail. "$(dirname "$0")/../../signed-request.sh"
delivery_id=$(mka_required DELIVERY_ID)mka_request POST "/v1/webhook-deliveries/$delivery_id/retry"// Send a delivered or failed event again, under the same event ID.import { print, request, required } from "../../signed-request.mjs";
const deliveryId = required("DELIVERY_ID");const answer = await request("POST", `/v1/webhook-deliveries/${deliveryId}/retry`);print(answer);<?php// Send a delivered or failed event again, under the same event ID.
declare(strict_types=1);
require __DIR__ . '/../../signed_request.php';
$deliveryId = mka_required('DELIVERY_ID');mka_show(mka_request('POST', "/v1/webhook-deliveries/{$deliveryId}/retry"));"""Send a delivered or failed event again, under the same event ID."""from signed_request import request, required, show
delivery_id = required("DELIVERY_ID")show(request("POST", f"/v1/webhook-deliveries/{delivery_id}/retry"))//go:build ignore
// Send a delivered or failed event again, under the same event ID.package main
import ( "docs.processing.yolotech.cc/examples/signedrequest")
func main() { deliveryID := signedrequest.Required("DELIVERY_ID") signedrequest.Show(signedrequest.Request("POST", "/v1/webhook-deliveries/"+deliveryID+"/retry", nil, ""))}Доставка, которая ещё идёт по расписанию, — это 409 delivery_not_retryable.
Пауза эндпоинта
Заголовок раздела «Пауза эндпоинта»Пока эндпоинт выключен, события ждут и уходят, как только его снова включат, — ничего не теряется.
#!/usr/bin/env bash# Turn the endpoint off (ENABLED=false) or on; events wait while it is off.set -euo pipefail. "$(dirname "$0")/../../signed-request.sh"
body=$(cat <<JSON{ "enabled": ${ENABLED:-true}}JSON)mka_request POST "/v1/webhook-endpoint/status" "$body"// Turn the endpoint off (ENABLED=false) or on; events wait while it is off.import { print, request } from "../../signed-request.mjs";
const answer = await request("POST", "/v1/webhook-endpoint/status", { body: { enabled: process.env.ENABLED !== "false", },});print(answer);<?php// Turn the endpoint off (ENABLED=false) or on; events wait while it is off.
declare(strict_types=1);
require __DIR__ . '/../../signed_request.php';
mka_show(mka_request( 'POST', '/v1/webhook-endpoint/status', [ 'enabled' => getenv('ENABLED') !== 'false', ],));"""Turn the endpoint off (ENABLED=false) or on; events wait while it is off."""import os
from signed_request import request, show
show(request( "POST", "/v1/webhook-endpoint/status", body={ "enabled": os.environ.get("ENABLED") != "false", },))//go:build ignore
// Turn the endpoint off (ENABLED=false) or on; events wait while it is off.package main
import ( "os"
"docs.processing.yolotech.cc/examples/signedrequest")
func main() { signedrequest.Show(signedrequest.Request("POST", "/v1/webhook-endpoint/status", map[string]any{ "enabled": os.Getenv("ENABLED") != "false", }, ""))}Смена секрета
Заголовок раздела «Смена секрета»#!/usr/bin/env bash# Replace the signing secret; the old one keeps signing for an hour.set -euo pipefail. "$(dirname "$0")/../../signed-request.sh"
body=$(cat <<JSON{ "expire_current_in": 3600}JSON)mka_request POST "/v1/webhook-endpoint/secret/roll" "$body"// Replace the signing secret; the old one keeps signing for an hour.import { print, request } from "../../signed-request.mjs";
const answer = await request("POST", "/v1/webhook-endpoint/secret/roll", { body: { expire_current_in: 3600, },});print(answer);<?php// Replace the signing secret; the old one keeps signing for an hour.
declare(strict_types=1);
require __DIR__ . '/../../signed_request.php';
mka_show(mka_request( 'POST', '/v1/webhook-endpoint/secret/roll', [ 'expire_current_in' => 3600, ],));"""Replace the signing secret; the old one keeps signing for an hour."""from signed_request import request, show
show(request( "POST", "/v1/webhook-endpoint/secret/roll", body={ "expire_current_in": 3600, },))//go:build ignore
// Replace the signing secret; the old one keeps signing for an hour.package main
import ( "docs.processing.yolotech.cc/examples/signedrequest")
func main() { signedrequest.Show(signedrequest.Request("POST", "/v1/webhook-endpoint/secret/roll", map[string]any{ "expire_current_in": 3600, }, ""))}Ответ содержит новый секрет один раз. До previous_secret_expires_at — через expire_current_in секунд,
не больше суток, 0 — сразу — каждое событие подписывается обоими секретами, поэтому вы переключаете серверы
без потери доставок. Новая смена до этого момента отбрасывает более старый секрет.
Удаление эндпоинта
Заголовок раздела «Удаление эндпоинта»#!/usr/bin/env bash# Remove the endpoint; events stop going anywhere.set -euo pipefail. "$(dirname "$0")/../../signed-request.sh"
mka_request DELETE "/v1/webhook-endpoint"// Remove the endpoint; events stop going anywhere.import { print, request } from "../../signed-request.mjs";
const answer = await request("DELETE", "/v1/webhook-endpoint");print(answer);<?php// Remove the endpoint; events stop going anywhere.
declare(strict_types=1);
require __DIR__ . '/../../signed_request.php';
mka_show(mka_request('DELETE', '/v1/webhook-endpoint'));"""Remove the endpoint; events stop going anywhere."""from signed_request import request, show
show(request("DELETE", "/v1/webhook-endpoint"))//go:build ignore
// Remove the endpoint; events stop going anywhere.package main
import ( "docs.processing.yolotech.cc/examples/signedrequest")
func main() { signedrequest.Show(signedrequest.Request("DELETE", "/v1/webhook-endpoint", nil, ""))}Доставки в пути завершаются неудачей. Новый эндпоинт получает новый секрет.