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

# Testing API webhooks using Webhook.site

> Learn how to use Webhook.site to test, inspect, and debug API webhooks sent from the HoopAI platform.

When you integrate webhooks with the HoopAI platform, you need a reliable way to verify that payloads are being sent correctly before pointing them at your production endpoint. Webhook.site provides a free, temporary URL you can use to capture and inspect webhook deliveries in real time.

***

## Setting up a test endpoint

<Steps>
  <Step title="Go to Webhook.site">
    Open [Webhook.site](https://webhook.site) in your browser. A unique URL is generated automatically — copy this URL.
  </Step>

  <Step title="Add the URL in Hoop">
    Navigate to **Settings > Integrations > Webhooks** in the Hoop platform. Create a new webhook or edit an existing one and paste your Webhook.site URL as the endpoint.
  </Step>

  <Step title="Select the events you want to test">
    Choose the specific events you want to receive — for example, `contact.created`, `opportunity.status_changed`, or `appointment.booked`. Start with one event type to keep testing focused.
  </Step>

  <Step title="Save and trigger the event">
    Save your webhook configuration, then perform the action in Hoop that triggers the event (such as creating a contact or booking an appointment).
  </Step>
</Steps>

***

## Inspecting the payload

Once Hoop sends the webhook, it appears on Webhook.site within seconds. Review the following details:

| Field                   | What to check                            |
| ----------------------- | ---------------------------------------- |
| **HTTP method**         | Should be `POST` for all Hoop webhooks   |
| **Content-Type header** | Should be `application/json`             |
| **Request body**        | The JSON payload containing event data   |
| **Query string**        | Any parameters appended to the URL       |
| **Timestamp**           | Confirms the webhook fired when expected |

<Tip>
  Click on any request in Webhook.site to expand the full headers, body, and query string. You can use the built-in JSON formatter to make payloads easier to read.
</Tip>

***

## Verifying headers and authentication

<Steps>
  <Step title="Check for the signature header">
    Hoop includes a signature header with each webhook delivery. Look for `X-Hook-Signature` or a similar header in Webhook.site's request details. This allows your production endpoint to verify the request came from Hoop.
  </Step>

  <Step title="Compare the signature">
    If you have configured a webhook secret in Hoop, the signature is an HMAC hash of the payload using your secret key. Verify it matches what you expect by computing the hash locally.
  </Step>
</Steps>

<Note>
  If you do not see a signature header, confirm that you have set a webhook secret in **Settings > Integrations > Webhooks** within the Hoop platform.
</Note>

***

## Troubleshooting delivery failures

<AccordionGroup>
  <Accordion title="Webhook is not arriving at Webhook.site">
    Confirm the URL is pasted correctly with no trailing spaces. Verify the webhook is enabled and that you triggered the correct event type. Check the webhook logs in **Settings > Integrations > Webhooks > Logs** for delivery status and error codes.
  </Accordion>

  <Accordion title="Payload is empty or missing fields">
    Some events only include a reference ID rather than the full object. You may need to use the Hoop API to fetch the complete record using the ID provided in the payload. Also confirm you selected the correct event type.
  </Accordion>

  <Accordion title="Webhook shows a non-200 status code">
    Hoop expects a `200` response from your endpoint. Webhook.site returns `200` by default, but if you customized the response, ensure it returns a success status. Hoop retries failed deliveries up to three times with exponential backoff.
  </Accordion>

  <Accordion title="Duplicate webhook deliveries">
    Retries can cause duplicates if your endpoint was slow to respond. Always use the event ID in the payload to deduplicate on your receiving end. Hoop considers any response that takes longer than **30 seconds** as a timeout.
  </Accordion>
</AccordionGroup>

***

## Common webhook payload formats

Hoop webhooks follow a consistent structure:

```json theme={null}
{
  "event": "contact.created",
  "timestamp": "2026-03-05T14:30:00Z",
  "data": {
    "id": "abc123",
    "type": "contact",
    "attributes": {
      "firstName": "Jane",
      "lastName": "Doe",
      "email": "jane@example.com"
    }
  }
}
```

<Warning>
  Webhook payload schemas can change when Hoop releases updates. Always validate incoming data against the current schema rather than hardcoding field positions.
</Warning>

***

## Moving to production

Once you have verified your webhooks are firing correctly on Webhook.site:

1. Replace the Webhook.site URL with your production endpoint URL
2. Ensure your production server returns a `200` status within 30 seconds
3. Implement signature verification using your webhook secret
4. Add error handling and logging on your server
5. Test one more delivery end-to-end before going live
