> For the complete documentation index, see [llms.txt](https://teamleader-sdk.mcore-services.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://teamleader-sdk.mcore-services.dev/api-reference/other/webhooks.md).

# Webhooks

Manage webhooks for real-time event notifications in Teamleader Focus.

```php
Teamleader::webhooks()
```

|                          |                                                        |
| ------------------------ | ------------------------------------------------------ |
| Class                    | `McoreServices\TeamleaderSDK\Resources\Other\Webhooks` |
| Create / update / delete | — / — / —                                              |
| Pagination               | No                                                     |

## Endpoints

* `webhooks.list`
* `webhooks.register`
* `webhooks.unregister`

## Filters

`list()` takes no filters.

## Accepted values

Public constants on the class. Body fields and enum values outside these lists throw before the request is sent.

| Constant      | Values                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `EVENT_TYPES` | `account.deactivated`, `account.deleted`, `call.added`, `call.completed`, `call.deleted`, `call.updated`, `company.added`, `company.deleted`, `company.updated`, `contact.added`, `contact.deleted`, `contact.linkedToCompany`, `contact.unlinkedFromCompany`, `contact.updatedLinkToCompany`, `contact.updated`, `creditNote.booked`, `creditNote.deleted`, `creditNote.peppolSubmissionFailed`, `creditNote.peppolSubmissionSucceeded`, `creditNote.sent`, `creditNote.updated`, `deal.created`, `deal.deleted`, `deal.lost`, `deal.moved`, `deal.updated`, `deal.won`, `incomingCreditNote.added`, `incomingCreditNote.approved`, `incomingCreditNote.bookkeepingSubmissionFailed`, `incomingCreditNote.bookkeepingSubmissionSucceeded`, `incomingCreditNote.deleted`, `incomingCreditNote.refused`, `incomingCreditNote.updated`, `incomingInvoice.added`, `incomingInvoice.approved`, `incomingInvoice.bookkeepingSubmissionFailed`, `incomingInvoice.bookkeepingSubmissionSucceeded`, `incomingInvoice.deleted`, `incomingInvoice.refused`, `incomingInvoice.updated`, `invoice.booked`, `invoice.deleted`, `invoice.drafted`, `invoice.paymentRegistered`, `invoice.paymentRemoved`, `invoice.peppolSubmissionFailed`, `invoice.peppolSubmissionSucceeded`, `invoice.sent`, `invoice.updated`, `meeting.completed`, `meeting.created`, `meeting.deleted`, `meeting.updated`, `milestone.created`, `milestone.updated`, `nextgenProject.closed`, `nextgenProject.created`, `nextgenProject.deleted`, `nextgenProject.updated`, `nextgenTask.completed`, `nextgenTask.created`, `nextgenTask.deleted`, `nextgenTask.updated`, `product.added`, `product.deleted`, `product.updated`, `project.created`, `project.deleted`, `project.updated`, `receipt.added`, `receipt.approved`, `receipt.bookkeepingSubmissionFailed`, `receipt.bookkeepingSubmissionSucceeded`, `receipt.deleted`, `receipt.refused`, `receipt.updated`, `subscription.added`, `subscription.deactivated`, `subscription.deleted`, `subscription.updated`, `task.completed`, `task.created`, `task.deleted`, `task.updated`, `ticket.closed`, `ticket.created`, `ticket.deleted`, `ticket.reopened`, `ticket.updated`, `ticketMessage.added`, `timeTracking.added`, `timeTracking.deleted`, `timeTracking.updated`, `user.deactivated` |

## Methods

### `list()`

```php
list(array $filters = [], array $options = []): array
```

List all registered webhooks Webhooks are returned ordered by URL

`webhooks.list` takes no request body — no filter, page or sort parameter exists for it. Arguments are rejected rather than discarded.

* `$filters` — Must be empty — this endpoint accepts no filters
* `$options` — Must be empty — this endpoint accepts no sorting or pagination

**Throws** `InvalidArgumentException` When any argument is passed

### `register()`

```php
register(string $url, array $types): array
```

Register a new webhook

* `$url` — Your webhook URL (must be a valid HTTPS URL)
* `$types` — Array of event types that should trigger this webhook

**Throws** `InvalidArgumentException`

### `unregister()`

```php
unregister(string $url, array $types): array
```

Unregister a webhook Removes the specified event types from the webhook URL

* `$url` — Your webhook URL
* `$types` — Array of event types to unregister

**Throws** `InvalidArgumentException`

### `getAvailableEventTypes()`

```php
getAvailableEventTypes(): array
```

Get all available webhook event types

### `getEventTypesByCategory()`

```php
getEventTypesByCategory(string $category): array
```

Get event types filtered by category prefix

* `$category` — Category prefix (e.g. 'invoice', 'contact', 'deal')

### `getInvoiceEventTypes()`

```php
getInvoiceEventTypes(): array
```

Get all invoice-related event types (invoice + incomingInvoice)

### `getCreditNoteEventTypes()`

```php
getCreditNoteEventTypes(): array
```

Get all credit note-related event types (creditNote + incomingCreditNote)

### `getDealEventTypes()`

```php
getDealEventTypes(): array
```

Get all deal-related event types

### `getContactEventTypes()`

```php
getContactEventTypes(): array
```

Get all contact-related event types

### `getCompanyEventTypes()`

```php
getCompanyEventTypes(): array
```

Get all company-related event types

### `getProjectEventTypes()`

```php
getProjectEventTypes(): array
```

Get all project-related event types (project + nextgenProject)

### `getTaskEventTypes()`

```php
getTaskEventTypes(): array
```

Get all task-related event types (task + nextgenTask)

### `getTicketEventTypes()`

```php
getTicketEventTypes(): array
```

Get all ticket-related event types

### `getTimeTrackingEventTypes()`

```php
getTimeTrackingEventTypes(): array
```

Get all time tracking-related event types

### `getResponseStructure()`

```php
getResponseStructure(): array
```

Get response structure documentation

## Examples

Get all registered webhooks:

```php
$webhooks = Teamleader::webhooks()->list();
```

Register a webhook for a single event type:

```php
$result = Teamleader::webhooks()->register(
                "https://example.com/webhook",
                ["invoice.booked"]
            );
```

Register a webhook for multiple event types:

```php
$result = Teamleader::webhooks()->register(
                "https://example.com/webhook",
                [
                    "invoice.booked",
                    "invoice.sent",
                    "invoice.paymentRegistered"
                ]
            );
```

Register a webhook for all invoice-related events:

```php
$types = Teamleader::webhooks()->getInvoiceEventTypes();
            $result = Teamleader::webhooks()->register("https://example.com/webhook", $types);
```

Unregister specific event types from a webhook:

```php
$result = Teamleader::webhooks()->unregister(
                "https://example.com/webhook",
                ["invoice.booked"]
            );
```

Unregister all events for a webhook URL:

```php
$webhooks = Teamleader::webhooks()->list();
            $url = "https://example.com/webhook";
            $types = [];
            foreach ($webhooks["data"] as $webhook) {
                if ($webhook["url"] === $url) {
                    $types = $webhook["types"];
                    break;
                }
            }
            $result = Teamleader::webhooks()->unregister($url, $types);
```

Get event types for a specific category:

```php
$contactEvents = Teamleader::webhooks()->getEventTypesByCategory("contact");
            $dealEvents = Teamleader::webhooks()->getEventTypesByCategory("deal");
```
