> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arya.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Exposed webhooks

> Arya notifies external systems via HTTP when events happen.

**Exposed webhooks** let Arya notify external systems via HTTP when events happen in the workspace. The opposite of incoming webhooks.

<Frame>
  <img src="https://mintcdn.com/agevole/BUuJGD62nuns4mJL/images/automazioni/en/outbound-webhooks.svg?fit=max&auto=format&n=BUuJGD62nuns4mJL&q=85&s=44bbaf5c1cc92a02f47c9610b0c57b82" alt="Diagram: Arya → HTTP POST → external system" width="1200" height="720" data-path="images/automazioni/en/outbound-webhooks.svg" />
</Frame>

## Typical use cases

* **ETL**: every record change replicated to an external data warehouse
* **Analytics**: Arya events sent to Segment, Mixpanel, Amplitude
* **Legacy ERP**: notify accounting system when an invoice is issued
* **Custom internal system**: real-time dashboard consuming Arya events

## Configuration

### Via workflow

Use a normal workflow with **HTTP Request** action:

<Steps>
  <Step title="Create workflow">
    Trigger: the event you want to notify (record created/updated, status changed).
  </Step>

  <Step title="HTTP Request action">
    * **URL**: external system endpoint
    * **Method**: POST (typical)
    * **Headers**: auth, content-type
    * **Body**: JSON with record data
  </Step>

  <Step title="Handle errors">
    Retry logic, fallback, notify admin on repeated failure.
  </Step>
</Steps>

### Preconfigured exposed webhooks

For common use cases, Arya offers pre-made webhooks to activate with one click:

<AccordionGroup>
  <Accordion title="Deal events">
    `deal.created`, `deal.updated`, `deal.stage_changed`, `deal.won`, `deal.lost`.
    Payload: full deal data + before/after of changed fields.
  </Accordion>

  <Accordion title="Invoice events">
    `invoice.issued`, `invoice.paid`, `invoice.overdue`.
  </Accordion>

  <Accordion title="Employee events">
    `employee.hired`, `employee.terminated`, `leave.approved`.
  </Accordion>

  <Accordion title="Quote events">
    `quote.sent`, `quote.viewed`, `quote.signed`, `quote.rejected`.
  </Accordion>

  <Accordion title="Task events">
    `task.assigned`, `task.completed`, `task.overdue`.
  </Accordion>
</AccordionGroup>

Activate from **Settings → Exposed webhooks → + New**.

## Standard payload

Example `deal.won` payload:

```json theme={null}
{
  "event": "deal.won",
  "timestamp": "2026-04-14T15:30:00Z",
  "workspace_id": "ws_abc123",
  "data": {
    "deal": {
      "id": "deal_xyz",
      "name": "Acme Renewal 2026",
      "value": 25000,
      "currency": "EUR",
      "stage": "Won",
      "closed_at": "2026-04-14T15:30:00Z",
      "owner": {
        "id": "user_def",
        "name": "Mario Rossi",
        "email": "mario@arya.so"
      },
      "company": {
        "id": "comp_ghi",
        "name": "Acme SpA",
        "vat": "IT12345678901"
      }
    }
  },
  "signature": "hmac-sha256-hash-of-body"
}
```

## Security

<AccordionGroup>
  <Accordion title="HMAC signature">
    Arya signs the body with a shared secret. The receiving system verifies the signature for authenticity.
  </Accordion>

  <Accordion title="IP whitelist">
    If the external system has fixed IPs, whitelist at the network level.
  </Accordion>

  <Accordion title="HTTPS required">
    Arya rejects plain HTTP URLs.
  </Accordion>

  <Accordion title="Timeout">
    Default 10 seconds. If the external system doesn't respond, Arya considers it failed and retries.
  </Accordion>
</AccordionGroup>

## Retry and idempotency

<Warning>
  Arya auto-retries on failure (503, timeout, network errors) with exponential backoff (1, 2, 4, 8 min). After 5 attempts, marks failed and notifies admin.

  Your endpoint must be **idempotent**: you may receive the same notification multiple times. Use the event ID to deduplicate.
</Warning>

## Monitoring

**Settings → Exposed webhooks → Log** shows per webhook:

* Timestamp
* Called URL
* Sent payload
* Received response
* Status (success, failed)
* Attempt count

You can **manually retry** a failed webhook.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Does the payload include sensitive data?">
    Depends on fields. To avoid sending confidential data (salaries, tax codes), configure field filters on payload inclusion.
  </Accordion>

  <Accordion title="Can I have different webhooks for different events?">
    Yes, each webhook has its URL + subscribed events.
  </Accordion>

  <Accordion title="What happens if I disable a workflow that sends webhooks?">
    It stops. Webhooks already queued are still delivered before stopping.
  </Accordion>
</AccordionGroup>
