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

# Capture, Inspect, and Replay Webhooks with GetRequest

> Get a permanent capture URL for any webhook provider. Inspect every payload, verify signatures, and replay failed events without waiting for a resend.

Debugging webhooks is painful. Providers fire them once, your local machine is offline, and you're left guessing at the payload. GetRequest gives you a permanent capture URL you can hand to any provider — every event is logged in full, including headers, body, and your backend's response. No tunnels, no polling, no missed events.

## Create a webhook endpoint

<Steps>
  <Step title="Open your project">
    Navigate to your project in the GetRequest dashboard and click **New Endpoint**.
  </Step>

  <Step title="Set the method">
    Set **Method** to `POST`. Most webhook providers use POST, though GetRequest accepts any HTTP method.
  </Step>

  <Step title="Choose your action">
    * Set **Action** to `Forward` and enter your backend handler URL to capture **and** proxy events to your server.
    * Set **Action** to `JSON` to capture events in Logs without forwarding anything — useful during an outage or before your handler is built.
  </Step>

  <Step title="Pick a descriptive slug">
    Use a slug that identifies the provider, for example `/webhooks/stripe` or `/webhooks/github`. Your capture URL will be:

    ```text theme={null}
    https://e.getrequest.io/{project_uri}/webhooks/stripe
    ```
  </Step>

  <Step title="Click Create">
    Your endpoint is live immediately. Copy the URL and head to your provider's dashboard to register it.
  </Step>
</Steps>

## Register it with your provider

<Tabs>
  <Tab title="Stripe">
    1. Go to [Stripe Dashboard → Developers → Webhooks](https://dashboard.stripe.com/webhooks).
    2. Click **Add endpoint**.
    3. Paste your GetRequest URL into the **Endpoint URL** field.
    4. Select the events you want to listen for, for example `payment_intent.succeeded` or `customer.subscription.deleted`.
    5. Click **Add endpoint**.

    Stripe sends a test event immediately after registration. Open **Logs** in GetRequest to see it arrive within seconds.
  </Tab>

  <Tab title="GitHub">
    1. Go to your repository → **Settings → Webhooks → Add webhook**.
    2. Set **Payload URL** to your GetRequest URL.
    3. Set **Content type** to `application/json`.
    4. Choose the individual events or select **Send me everything**.
    5. Click **Add webhook**.

    GitHub sends a `ping` event on creation — you'll see it appear in your logs within seconds of saving.
  </Tab>

  <Tab title="Any provider">
    Copy your GetRequest URL and paste it wherever the provider asks for a webhook or callback URL. GetRequest accepts any HTTP method and any payload format — JSON, form-encoded, XML, or raw body. No configuration changes are needed on the GetRequest side.
  </Tab>
</Tabs>

## Inspect a captured webhook

Open **Logs** in your project. Every captured webhook event appears as a row. Click any row to inspect the full details:

* **Headers** — signature headers (`Stripe-Signature`, `X-Hub-Signature-256`), content type, and any custom metadata the provider includes
* **Body** — the complete request payload, pretty-printed for readability
* **Response** — the status code and body your backend returned (only present on Forward endpoints)
* **Duration** — round-trip time from GetRequest to your backend and back

This gives you everything you need to debug a failed webhook handler without waiting for the provider to resend the event or manually triggering a new one.

## Replay a webhook

Found a failed event? Replay it with one click without waiting for the provider to resend.

<Note>
  **Replay is a Pro feature** and requires a **Forward** endpoint. JSON endpoints have no upstream to replay to. Upgrade to Pro in your account settings to unlock Replay.
</Note>

<Steps>
  <Step title="Open the log entry">
    Find the failed event in **Logs** and click the row to open the detail view.
  </Step>

  <Step title="Click Replay">
    Press the **Replay** button. GetRequest re-fires the exact same request — same headers, same body, same signature — to your backend.
  </Step>

  <Step title="Review the new response">
    The new response status code and body appear immediately in the log entry. Replay as many times as you need until your handler returns the right response.
  </Step>
</Steps>

## Verify webhook signatures

GetRequest forwards all request headers verbatim to your backend, including signature headers. Your backend receives the original `Stripe-Signature` or `X-Hub-Signature-256` header unchanged, exactly as the provider sent it.

This means your existing signature verification logic works without any modification — there is nothing special to configure in GetRequest.

<CodeGroup>
  ```js Stripe (Node.js) theme={null}
  import Stripe from "stripe";

  const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

  // The raw body and Stripe-Signature header arrive unchanged from GetRequest
  const event = stripe.webhooks.constructEvent(
    rawBody,
    request.headers["stripe-signature"],
    process.env.STRIPE_WEBHOOK_SECRET
  );
  ```

  ```python Stripe (Python) theme={null}
  import stripe

  # The raw body and Stripe-Signature header arrive unchanged from GetRequest
  event = stripe.Webhook.construct_event(
      payload=raw_body,
      sig_header=request.headers.get("Stripe-Signature"),
      secret=os.environ["STRIPE_WEBHOOK_SECRET"]
  )
  ```
</CodeGroup>

<Warning>
  Do not share your GetRequest endpoint URL publicly if you are not verifying signatures. Anyone who has the URL can send arbitrary payloads to your backend. Always validate the provider's signature header before processing an event.
</Warning>

## Capture without forwarding (JSON mode)

If you want to capture webhook events without your backend receiving them — for example, during a backend outage or before your handler exists — switch the endpoint **Action** to `JSON` mode temporarily.

Events are still fully captured in **Logs** with all headers and body intact. When your handler is ready:

1. Edit the endpoint and switch **Action** back to `Forward`.
2. Enter your backend handler URL.
3. Use **Replay** (Pro) to re-fire any events that arrived while you were in JSON mode.

<Tip>
  JSON mode is also useful during a deploy. Switch to JSON before you deploy, capture live traffic, then switch back to Forward and replay captured events against your freshly deployed handler.
</Tip>
