mirror of
https://github.com/strapi/strapi.git
synced 2025-07-23 17:10:08 +00:00
270 lines
6.5 KiB
Markdown
270 lines
6.5 KiB
Markdown
# Webhooks
|
|
|
|
## What is a webhook
|
|
|
|
Webhook is a construct used by an application to notify other applications that an event occurred. More precisely, webhook is a user-defined HTTP callback. Using a webhook is a good way to tell third party providers to start some processing (CI, build, deployment ...).
|
|
|
|
The way a webhook works is by delivering information to a receiving application through HTTP requests (typically POST requests).
|
|
|
|
## How to use
|
|
|
|
To access the webhook configuration panel, go to `Settings` > `Webhooks`.
|
|
|
|

|
|
|
|
### Create a webhook
|
|
|
|
Click on `Add new webhook` and fill in the form.
|
|
|
|

|
|
|
|
### Trigger a webhook
|
|
|
|
You can test out a webhook with a test event: `trigger-test`. Open the webhook you want to trigger.
|
|
|
|

|
|
|
|
Click on the `Trigger` button.
|
|
|
|

|
|
|
|
You will see the trigger request appear and get the result.
|
|
|
|

|
|
|
|
### Enable or disable a webhook
|
|
|
|
You can enable or disable a webhook from the list view directly.
|
|
|
|

|
|
|
|
### Update a webhook
|
|
|
|
You can edit any webhook by clicking on the `pen` icon in the webhook list view.
|
|
|
|

|
|
|
|
### Delete a webhook
|
|
|
|
You can delete a webhook by clicking on the `trash` icon.
|
|
|
|

|
|
|
|
## Available events
|
|
|
|
By default Strapi webhooks can be triggered by the following events:
|
|
|
|
| Name | Description |
|
|
| -------------- | ----------------------------------------------- |
|
|
| `entry.create` | Triggered when a Content Type entry is created. |
|
|
| `entry.update` | Triggered when a Content Type entry is updated. |
|
|
| `entry.delete` | Triggered when a Content Type entry is deleted. |
|
|
| `media.create` | Triggered when a media is created. |
|
|
| `media.delete` | Triggered when a media is deleted. |
|
|
|
|
## Payloads
|
|
|
|
### Headers
|
|
|
|
When a payload is delivered to your webhook's URL, it will contain specific headers:
|
|
|
|
| Header | Description |
|
|
| ---------------- | ------------------------------------------ |
|
|
| `X-Strapi-Event` | Name of the event type that was triggered. |
|
|
|
|
### `entry.create`
|
|
|
|
This event is triggered when a new entry is created.
|
|
|
|
**Example payload**
|
|
|
|
```json
|
|
{
|
|
"event": "entry.create",
|
|
"created_at": "2020-01-10T08:47:36.649Z",
|
|
"model": "address",
|
|
"entry": {
|
|
"id": 1,
|
|
"geolocation": {},
|
|
"city": "Paris",
|
|
"postal_code": null,
|
|
"category": null,
|
|
"full_name": "Paris",
|
|
"created_at": "2020-01-10T08:47:36.264Z",
|
|
"updated_at": "2020-01-10T08:47:36.264Z",
|
|
"cover": null,
|
|
"images": []
|
|
}
|
|
}
|
|
```
|
|
|
|
### `entry.update`
|
|
|
|
This event is triggered when an entry is updated.
|
|
|
|
**Example payload**
|
|
|
|
```json
|
|
{
|
|
"event": "entry.update",
|
|
"created_at": "2020-01-10T08:58:26.563Z",
|
|
"model": "address",
|
|
"entry": {
|
|
"id": 1,
|
|
"geolocation": {},
|
|
"city": "Paris",
|
|
"postal_code": null,
|
|
"category": null,
|
|
"full_name": "Paris",
|
|
"created_at": "2020-01-10T08:47:36.264Z",
|
|
"updated_at": "2020-01-10T08:58:26.210Z",
|
|
"cover": null,
|
|
"images": []
|
|
}
|
|
}
|
|
```
|
|
|
|
### `entry.delete`
|
|
|
|
This event is triggered when an entry is deleted.
|
|
|
|
**Example payload**
|
|
|
|
```json
|
|
{
|
|
"event": "entry.delete",
|
|
"created_at": "2020-01-10T08:59:35.796Z",
|
|
"model": "address",
|
|
"entry": {
|
|
"id": 1,
|
|
"geolocation": {},
|
|
"city": "Paris",
|
|
"postal_code": null,
|
|
"category": null,
|
|
"full_name": "Paris",
|
|
"created_at": "2020-01-10T08:47:36.264Z",
|
|
"updated_at": "2020-01-10T08:58:26.210Z",
|
|
"cover": null,
|
|
"images": []
|
|
}
|
|
}
|
|
```
|
|
|
|
### `media.create`
|
|
|
|
This event is triggered when you upload a file on entry creation or through the media interface.
|
|
|
|
**Example payload**
|
|
|
|
```json
|
|
{
|
|
"event": "media.create",
|
|
"created_at": "2020-01-10T10:58:41.115Z",
|
|
"media": {
|
|
"id": 1,
|
|
"name": "image.png",
|
|
"hash": "353fc98a19e44da9acf61d71b11895f9",
|
|
"sha256": "huGUaFJhmcZRHLcxeQNKblh53vtSUXYaB16WSOe0Bdc",
|
|
"ext": ".png",
|
|
"mime": "image/png",
|
|
"size": 228.19,
|
|
"url": "/uploads/353fc98a19e44da9acf61d71b11895f9.png",
|
|
"provider": "local",
|
|
"provider_metadata": null,
|
|
"created_at": "2020-01-10T10:58:41.095Z",
|
|
"updated_at": "2020-01-10T10:58:41.095Z",
|
|
"related": []
|
|
}
|
|
}
|
|
```
|
|
|
|
### `media.delete`
|
|
|
|
This event is triggered only when you delete a media through the media interface.
|
|
|
|
**Example payload**
|
|
|
|
```json
|
|
{
|
|
"event": "media.delete",
|
|
"created_at": "2020-01-10T11:02:46.232Z",
|
|
"media": {
|
|
"id": 11,
|
|
"name": "photo.png",
|
|
"hash": "43761478513a4c47a5fd4a03178cfccb",
|
|
"sha256": "HrpDOKLFoSocilA6B0_icA9XXTSPR9heekt2SsHTZZE",
|
|
"ext": ".png",
|
|
"mime": "image/png",
|
|
"size": 4947.76,
|
|
"url": "/uploads/43761478513a4c47a5fd4a03178cfccb.png",
|
|
"provider": "local",
|
|
"provider_metadata": null,
|
|
"created_at": "2020-01-07T19:34:32.168Z",
|
|
"updated_at": "2020-01-07T19:34:32.168Z",
|
|
"related": []
|
|
}
|
|
}
|
|
```
|
|
|
|
## Developer documentation
|
|
|
|
### Available configurations
|
|
|
|
You can set webhook configurations inside the file `./config/server.js`.
|
|
|
|
- `webhooks`
|
|
- `defaultHeaders`: You can set default headers to use for your webhook requests. This option is overwritten by the headers set in the webhook itself.
|
|
|
|
**Example configuration**
|
|
|
|
```js
|
|
module.exports = {
|
|
webhooks: {
|
|
defaultHeaders: {
|
|
'Custom-Header': 'my-custom-header',
|
|
},
|
|
},
|
|
};
|
|
```
|
|
|
|
### Securing your webhooks
|
|
|
|
Most of the time, webhooks make requests to public URLs, therefore it is possible that someone may find that URL and send it wrong information.
|
|
|
|
To prevent this from happening you can send a header with an authentication token. Using the Admin panel you would have to do it for every webhook.
|
|
Another way is to define `defaultHeaders` to add to every webhook requests.
|
|
|
|
You can configure these global headers by updating the file at `./config/server.js`:
|
|
|
|
:::: tabs
|
|
|
|
::: tab "Simple token"
|
|
|
|
```js
|
|
module.exports = {
|
|
webhooks: {
|
|
defaultHeaders: {
|
|
Authorization: 'Bearer my-very-secured-token',
|
|
},
|
|
},
|
|
};
|
|
```
|
|
|
|
:::
|
|
|
|
::: tab "Environment variable"
|
|
|
|
```js
|
|
module.exports = {
|
|
webhooks: {
|
|
defaultHeaders: {
|
|
Authorization: `Bearer ${process.env.WEBHOOK_TOKEN}`,
|
|
},
|
|
},
|
|
};
|
|
```
|
|
|
|
::::
|
|
|
|
If you are developing the webhook handler yourself you can now verify the token by reading the headers.
|