> ## Documentation Index
> Fetch the complete documentation index at: https://x-preview-mintlify-b8e3e38a.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# V2 Webhooks API

> The V2 Webhooks API enables developers to receive real-time event notifications from X accounts. Reference for the X API v2 standard tier covering webhooks.

export const Button = ({href, children}) => {
  return <div className="not-prose">
    <a href={href}>
      <button className="x-btn">
        <span>{children}</span>
        <svg width="3" height="24" viewBox="0 -9 3 24" class="h-6 rotate-0 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg>
      </button>
    </a>
  </div>;
};

The V2 Webhooks API enables developers to receive real-time event notifications from X accounts via webhook-based JSON messages. These APIs allow you to register and manage webhooks, develop consumer applications to process events, and ensure secure communication through challenge-response checks (CRC) and signature headers.

## Overview

<CardGroup cols={2}>
  <Card title="Real-time delivery" icon="bolt">
    Receive events instantly as they occur
  </Card>

  <Card title="Push-based" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/l1KoBRhleglMdLLa/icons/xds/icon-arrow-right.svg?fit=max&auto=format&n=l1KoBRhleglMdLLa&q=85&s=ccddd4eda6041fd894b587326f5c78ae" width="24" height="24" data-path="icons/xds/icon-arrow-right.svg">
    Data sent directly to your server — no polling
  </Card>

  <Card title="Secure" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/0Jehuiz4EQP6rmSS/icons/xds/icon-shield-keyhole.svg?fit=max&auto=format&n=0Jehuiz4EQP6rmSS&q=85&s=92401721c66baf9dc491555947bc649a" width="24" height="24" data-path="icons/xds/icon-shield-keyhole.svg">
    CRC validation and signature verification
  </Card>

  <Card title="Reliable" icon="gauge">
    Retry and recovery support
  </Card>
</CardGroup>

***

## Products that support webhooks

These are the products that currently support delivering events via webhook:

| Product | Description |
| :- | :- |
| [X Activity API (XAA)](/x-api/activity/introduction) | Receive real-time events for activity happening on X |
| [Account Activity API (AAA)](/x-api/account-activity/introduction) | Receive real-time events tied to specific user accounts |
| [Filtered Stream Webhooks](/x-api/webhooks/stream/introduction) | Receive filtered stream Posts via webhook delivery |

***

## How webhooks work

```mermaid actions={false} theme={null}
flowchart LR
    A["X Event<br/>Occurs"] --> B["X Server"] --> C["Your<br/>Webhook URL"]
```

1. **Event occurs** — A user posts, sends a DM, gets followed, etc.
2. **X sends a POST request** — JSON event payload sent to your registered webhook URL
3. **You process the event** — Your server handles the event data
4. **Respond with 200 OK** — Return a 200 status to acknowledge receipt

***

## Webhook requirements

| Requirement | Description |
| :- | :- |
| **HTTPS** | Webhook URL must use HTTPS |
| **Publicly accessible** | URL must be reachable from the internet |
| **No port specification** | The URL cannot include a port (e.g., `https://mydomain.com:5000/webhook` will not work) |
| **Fast response** | Respond within 10 seconds |
| **200 OK** | Return 200 status to acknowledge receipt |
| **CRC support** | Must respond to Challenge-Response Check GET requests ([learn more](/x-api/webhooks/quickstart#2-the-crc-check)) |

***

## Endpoints

| Method | Endpoint | Description |
| :- | :- | :- |
| POST | [`/2/webhooks`](/x-api/webhooks/create-webhook) | Register a new webhook |
| GET | [`/2/webhooks`](/x-api/webhooks/get-webhook) | List registered webhooks |
| DELETE | [`/2/webhooks/:webhook_id`](/x-api/webhooks/delete-webhook) | Delete a webhook |
| POST | [`/2/webhooks/replay`](/x-api/webhooks/create-replay-job-for-webhook) | Create a replay job for webhook |
| PUT | [`/2/webhooks/:webhook_id`](/x-api/webhooks/validate-webhook) | Trigger CRC check and re-enable a webhook |

All endpoints require **OAuth2 App Only Bearer Token** authentication.

***

## Security

X's webhook-based APIs provide two methods for confirming the security of your webhook server:

1. **Challenge-Response Check (CRC)** — X sends periodic GET requests to your webhook URL. You respond with an HMAC-SHA256 hash to prove you control the endpoint. CRC checks happen on initial registration, hourly, and on manual re-validation.

2. **Signature verification** — Each POST request from X includes an `x-twitter-webhooks-signature` header. You can verify this signature to confirm X is the source of incoming events.

<Card title="See full implementation details" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/XgVLwh2TekfTrClW/icons/xds/icon-code.svg?fit=max&auto=format&n=XgVLwh2TekfTrClW&q=85&s=1cdc797fb9a1f319ac39adeb045b75b4" href="/x-api/webhooks/quickstart" width="24" height="24" data-path="icons/xds/icon-code.svg">
  Step-by-step CRC setup, code examples, and signature verification
</Card>

***

## Webhook validation

A CRC check is sent to your webhook in the following cases:

* Immediately upon creation
* On an explicit PUT request (`PUT /2/webhooks/{id}`)
* Periodically every 30 minutes, but only if the webhook has not been successfully validated in the past 24 hours

A webhook is marked as **invalid** when:

* It returns an invalid response to a CRC check
  * Returns a 2XX status code but the `response_token` is incorrect
  * Returns a 3XX status code
  * Results in an SSL exception
* It experiences persistent transient errors such that it has not successfully validated for more than 28 hours (includes a 4-hour grace period for transient issues)
  * The following responses are treated as transient errors:
    * 4XX status code
    * 5XX status code
    * Request timeout
    * Channel closed

You can check the valid/invalid status of a webhook using the `GET /2/webhooks` endpoint or via the toolbox in the Developer Console.

***

## Getting started

<Note>
  **Prerequisites**

  * An approved [developer account](https://developer.x.com/en/portal/petition/essential/basic-info)
  * A [Project and App](/resources/fundamentals/developer-apps) in the Developer Console
  * A publicly accessible HTTPS endpoint
  * Your app's **consumer secret** (API secret key) for CRC validation
</Note>

<CardGroup cols={2}>
  <Card title="Quickstart" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/6WStVizI00U4vHLW/icons/xds/icon-rocket.svg?fit=max&auto=format&n=6WStVizI00U4vHLW&q=85&s=d9aac5d73766977ce2627db5803a2e38" href="/x-api/webhooks/quickstart" width="24" height="24" data-path="icons/xds/icon-rocket.svg">
    Set up your webhook end-to-end
  </Card>

  <Card title="Filtered Stream Webhooks" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/v2OaZiQ8nQ_565Eg/icons/xds/icon-filter.svg?fit=max&auto=format&n=v2OaZiQ8nQ_565Eg&q=85&s=8d46d2e0c4742f35fd9086fbb8678a9b" href="/x-api/webhooks/stream/introduction" width="24" height="24" data-path="icons/xds/icon-filter.svg">
    Receive filtered Posts via webhook
  </Card>

  <Card title="Account Activity API" icon="https://mintcdn.com/x-preview-mintlify-b8e3e38a/l1KoBRhleglMdLLa/icons/xds/icon-bell.svg?fit=max&auto=format&n=l1KoBRhleglMdLLa&q=85&s=d0a58f13ad6c2a16c22d8f88267d3c05" href="/x-api/account-activity/introduction" width="24" height="24" data-path="icons/xds/icon-bell.svg">
    Receive account events via webhook
  </Card>

  <Card title="Sample apps" icon="github" href="/x-api/webhooks/quickstart#sample-apps">
    Working code examples
  </Card>
</CardGroup>
