# Webhooks

The built-in Webhooks feature provides an easy way to automate notifications based on events logged by the plugin. When enabled, the plugin sends a detailed JSON object to a specified listener URL, containing all relevant information about the logged event.

You can activate Webhook functionality via the **Statistics** tab under **Log Events** → **Webhook Endpoint URL**. This allows you to stay updated on plugin activities and seamlessly integrate with other systems.

### Available events types

`useyourdrive_previewed_entry`\
`useyourdrive_edited_entry`\
`useyourdrive_downloaded_entry`\
`useyourdrive_streamed_entry`\
`useyourdrive_created_link_to_entry`\
`useyourdrive_renamed_entry`\
`useyourdrive_deleted_entry`\
`useyourdrive_created_entry`\
`useyourdrive_updated_description`\
`useyourdrive_updated_metadata`\
`useyourdrive_moved_entry`\
`useyourdrive_uploaded_entry`\
`useyourdrive_uploaded_failed`\
`useyourdrive_searched`\
`useyourdrive_sent_notification`\
`useyourdrive_error`

### Example Data

```json
{
  "total": 1,
  "events": [
    {
      "timestamp": "2022-05-01T00:05:00+00:00",
      "type": "useyourdrive_previewed_entry",
      "description": "John Johnson previewed the file UK Festival Market Report.pdf",
      "data": {
        "entry": {
          "id": "1-y9psKPDJCycz38c2sN_a3lRoO9S",
          "name": "UK Festival Market Report.pdf",
          "mimetype": "application/pdf",
          "size": "2 MB",
          "icon": "https://...",
          "description": "Festival Insights and the UK Festival Awards are proud to release the UK Festival Market Report 2017.",
          "thumbnail": "https://...",
          "preview_url": "https://...",
          "download_url": "https://...",
          "is_dir": false,
          "parent_id": "0By3zfuC9ZTdGZCT1pUd0E",
          "parent_path": "/Path/To/Folder"
        },
        "account": {
          "id": "1030123322434145",
          "name": "Your Account name",
          "email": "info@example.com",
          "image": "https://..."
        }
      },
      "user": {
        "id": "3",
        "user_login": "John Johnson",
        "user_nicename": "john-johnson",
        "user_email": "info@example.com",
        "display_name": "John Johnson"
      },
      "page": "https://yoursite.com/page"
    },
    {
        "timestamp": "2022-05-01T00:05:01+00:00",
        "type": "useyourdrive_deleted_entry",
        ...
    }
  ]
}
```

### Example listener (PHP)

```php
// Optional: Prevent replay attacks by ensuring this request has been signed
// recently (+/- 5 minutes). The request timestamp is in ms!
$time_difference = abs((time() - intval($_SERVER['HTTP_X_WPCP_TIMESTAMP'])) / 1000);

if ($time_difference > 300) {
  exit('Invalid request timestamp');
}

// Calculate challenge hash by concatenating the request timestamp with the
// webhook secret with a semicolon in between: "timestamp;secret".
// Hash is created with SHA256 encoded as hexdecimal lowercase string.
$secret = 'your_secret';
$challenge = hash('sha256', $req_timestamp.';'.$secret);

// Calculate request body signature using the challenge hash as secret.
// Signature is a HMAC SHA256 hash encoded as hexdecimal lowercase string.
$req_raw_body = file_get_contents('php://input');
$expected_signature = 'sha256='.hash_hmac('sha256', $req_raw_body, $challenge);

// Compare expected with received signature.
$req_signature = $_SERVER['HTTP_X_WPCP_SIGNATURE'];

if ($expected_signature !== $req_signature) {
  exit('Invalid signature');
}

// Finally, parse the JSON request body and process the received events.
$data = json_decode($req_raw_body, true);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wpcloudplugins.gitbook.io/docs/features/webhooks.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
