# Вебхуки

> Эндпоинты вебхуков Slicer API — добавить адрес и получить секрет подписи, изменить, удалить, отправить проверочное событие и посмотреть журнал доставок.

Источник: https://docs.slicer.media/api/reference/webhooks/

Вебхуки сообщают вашему серверу о событиях: готова загрузка, закончился монтаж или экспорт, опубликован ролик. Нужна область `webhooks`. Формат событий, подпись и её проверка — в руководстве [Вебхуки](https://docs.slicer.media/api/webhooks/).

## Добавить вебхук

`POST /v1/webhooks`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Тело запроса `CreateWebhookRequest`

| Поле | Тип | Описание |
| --- | --- | --- |
| `url` _(обязательное)_ | `string (uri)` | — ≤ 2048 |
| `events` _(обязательное)_ | `string[]` |     |
| `description` | `string` | — ≤ 200 |

### Запрос

**curl**

```bash
curl -X POST "https://api.slicer.media/v1/webhooks" \
  -H "Authorization: Bearer $SLICER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","events":["upload.ready"]}'
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "url": "https://example.com/hook",
    "events": [
      "upload.ready"
    ]
  }),
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.post(
    "https://api.slicer.media/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
    json={
        "url": "https://example.com/hook",
        "events": ["upload.ready"],
    },
)
body = response.json()
```

### Ответ

**Поля ответа: `CreatedWebhook` (2)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `webhook` _(обязательное)_ | `Webhook` |     |
| `secret` _(обязательное)_ | `string` | Секрет подписи `whsec_…` — показывается один раз |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "webhook": {
      "id": "6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
      "url": "https://example.com/hook",
      "events": [
        "upload.ready"
      ],
      "description": "string",
      "enabled": true,
      "disabledReason": "string",
      "failures": 1,
      "lastDeliveryAt": "2026-10-16T09:30:00Z",
      "createdAt": "2026-10-16T09:30:00Z"
    },
    "secret": "whsec_…"
  }
}
```

## Список вебхуков

`GET /v1/webhooks`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/webhooks" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks', {
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.get(
    "https://api.slicer.media/v1/webhooks",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

Пример ответа:

```json
{
  "ok": true,
  "data": [
    {
      "id": "6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
      "url": "https://example.com/hook",
      "events": [
        "upload.ready"
      ],
      "description": "string",
      "enabled": true,
      "disabledReason": "string",
      "failures": 1,
      "lastDeliveryAt": "2026-10-16T09:30:00Z",
      "createdAt": "2026-10-16T09:30:00Z"
    }
  ]
}
```

## Вебхук

`GET /v1/webhooks/{id}`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20', {
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.get(
    "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

**Поля ответа: `Webhook` (9)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |
| `url` _(обязательное)_ | `string (uri)` |     |
| `events` _(обязательное)_ | `string[]` |     |
| `description` _(обязательное)_ | `string \| null` |     |
| `enabled` _(обязательное)_ | `boolean` |     |
| `disabledReason` _(обязательное)_ | `string \| null` |     |
| `failures` _(обязательное)_ | `integer` | Неудачных доставок подряд |
| `lastDeliveryAt` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "id": "6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    "url": "https://example.com/hook",
    "events": [
      "upload.ready"
    ],
    "description": "string",
    "enabled": true,
    "disabledReason": "string",
    "failures": 1,
    "lastDeliveryAt": "2026-10-16T09:30:00Z",
    "createdAt": "2026-10-16T09:30:00Z"
  }
}
```

## Изменить вебхук

`PATCH /v1/webhooks/{id}`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |

### Тело запроса `UpdateWebhookRequest`

| Поле | Тип | Описание |
| --- | --- | --- |
| `url` | `string (uri)` | — ≤ 2048 |
| `events` | `string[]` |     |
| `description` | `string \| null` | — ≤ 200 |
| `enabled` | `boolean` |     |

### Запрос

**curl**

```bash
curl -X PATCH "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20" \
  -H "Authorization: Bearer $SLICER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","events":["upload.ready"]}'
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "url": "https://example.com/hook",
    "events": [
      "upload.ready"
    ]
  }),
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.patch(
    "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
    json={
        "url": "https://example.com/hook",
        "events": ["upload.ready"],
    },
)
body = response.json()
```

### Ответ

**Поля ответа: `Webhook` (9)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |
| `url` _(обязательное)_ | `string (uri)` |     |
| `events` _(обязательное)_ | `string[]` |     |
| `description` _(обязательное)_ | `string \| null` |     |
| `enabled` _(обязательное)_ | `boolean` |     |
| `disabledReason` _(обязательное)_ | `string \| null` |     |
| `failures` _(обязательное)_ | `integer` | Неудачных доставок подряд |
| `lastDeliveryAt` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "id": "6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    "url": "https://example.com/hook",
    "events": [
      "upload.ready"
    ],
    "description": "string",
    "enabled": true,
    "disabledReason": "string",
    "failures": 1,
    "lastDeliveryAt": "2026-10-16T09:30:00Z",
    "createdAt": "2026-10-16T09:30:00Z"
  }
}
```

## Удалить вебхук

`DELETE /v1/webhooks/{id}`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |

### Запрос

**curl**

```bash
curl -X DELETE "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.delete(
    "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

**Поля ответа: `object` (2)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |
| `deleted` _(обязательное)_ | `boolean` |     |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "id": "6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20",
    "deleted": true
  }
}
```

## Отправить проверочное событие \`ping\`

`POST /v1/webhooks/{id}/test`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |

### Запрос

**curl**

```bash
curl -X POST "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/test" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/test', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.post(
    "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/test",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

**Поля ответа: `WebhookDelivery` (9)**

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` |     |
| `eventId` _(обязательное)_ | `string` |     |
| `type` _(обязательное)_ | `string` |     |
| `status` _(обязательное)_ | `string` | — `pending` · `succeeded` · `failed` |
| `attempts` _(обязательное)_ | `integer` |     |
| `responseStatus` _(обязательное)_ | `integer \| null` |     |
| `error` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |
| `deliveredAt` _(обязательное)_ | `string \| null` |     |

Пример ответа:

```json
{
  "ok": true,
  "data": {
    "id": 42,
    "eventId": "string",
    "type": "string",
    "status": "pending",
    "attempts": 1,
    "responseStatus": 1,
    "error": "string",
    "createdAt": "2026-10-16T09:30:00Z",
    "deliveredAt": "2026-10-16T09:30:00Z"
  }
}
```

## Последние 100 доставок

`GET /v1/webhooks/{id}/deliveries`

- **Области доступа:** `webhooks`
- **Лимит:** обычный

### Параметры пути

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |

### Запрос

**curl**

```bash
curl "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/deliveries" \
  -H "Authorization: Bearer $SLICER_TOKEN"
```

**JavaScript**

```js
const response = await fetch('https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/deliveries', {
  headers: {
    Authorization: `Bearer ${process.env.SLICER_TOKEN}`,
  },
});
const { ok, data, error } = await response.json();
```

**Python**

```python
import os
import requests

response = requests.get(
    "https://api.slicer.media/v1/webhooks/6f1c2a4e-8b3d-4c1a-9e2f-3b5d7a9c1e20/deliveries",
    headers={"Authorization": f"Bearer {os.environ['SLICER_TOKEN']}"},
)
body = response.json()
```

### Ответ

Пример ответа:

```json
{
  "ok": true,
  "data": [
    {
      "id": 42,
      "eventId": "string",
      "type": "string",
      "status": "pending",
      "attempts": 1,
      "responseStatus": 1,
      "error": "string",
      "createdAt": "2026-10-16T09:30:00Z",
      "deliveredAt": "2026-10-16T09:30:00Z"
    }
  ]
}
```

## Схемы

`Webhook`

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `string (uuid)` |     |
| `url` _(обязательное)_ | `string (uri)` |     |
| `events` _(обязательное)_ | `string[]` |     |
| `description` _(обязательное)_ | `string \| null` |     |
| `enabled` _(обязательное)_ | `boolean` |     |
| `disabledReason` _(обязательное)_ | `string \| null` |     |
| `failures` _(обязательное)_ | `integer` | Неудачных доставок подряд |
| `lastDeliveryAt` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |

`CreatedWebhook`

| Поле | Тип | Описание |
| --- | --- | --- |
| `webhook` _(обязательное)_ | `Webhook` |     |
| `secret` _(обязательное)_ | `string` | Секрет подписи `whsec_…` — показывается один раз |

`WebhookDelivery`

| Поле | Тип | Описание |
| --- | --- | --- |
| `id` _(обязательное)_ | `integer` |     |
| `eventId` _(обязательное)_ | `string` |     |
| `type` _(обязательное)_ | `string` |     |
| `status` _(обязательное)_ | `string` | — `pending` · `succeeded` · `failed` |
| `attempts` _(обязательное)_ | `integer` |     |
| `responseStatus` _(обязательное)_ | `integer \| null` |     |
| `error` _(обязательное)_ | `string \| null` |     |
| `createdAt` _(обязательное)_ | `string` | Дата и время ISO 8601, UTC |
| `deliveredAt` _(обязательное)_ | `string \| null` |     |
