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

# Resend Payout Webhooks (Bulk)

> Dispatch a bulk job to resend payout webhook notifications for a given merchant and time range

## Overview

This endpoint allows you to resend webhook notifications in bulk for payout transactions within a specified time window.
It dispatches an asynchronous job and returns a `job_id` that can be used to track progress via the [Job Status](/api-reference/cash-out/webhooks/resend-bulk-status) endpoint.

<Note>
  The time range is limited to a maximum of **3 hours** between `start_time` and `end_time`.
</Note>

<Warning>
  Only one resend job can run at a time per merchant and start time. If a job is already running for the same merchant and start time, the request will return `409 Conflict`.
</Warning>

## Request Body

<ParamField body="merchant_id" type="integer" required>
  The ID of the merchant whose payout notifications will be resent.

  Must be one of the merchant IDs associated with your account.
</ParamField>

<ParamField body="start_time" type="string" required>
  Start of the time range for filtering payout transactions.

  Format: `YYYY-MM-DD HH:MM:SS`

  Example: `"2026-03-24 08:00:00"`
</ParamField>

<ParamField body="end_time" type="string" required>
  End of the time range for filtering payout transactions. Must be after `start_time`.

  Maximum range: **3 hours** from `start_time`.

  Format: `YYYY-MM-DD HH:MM:SS`

  Example: `"2026-03-24 11:00:00"`
</ParamField>

<ParamField body="status_ids" type="array">
  Optional list of status IDs to filter which payout transactions will have notifications resent.

  If omitted, all notifiable statuses are included.

  Notifiable status IDs:

  | ID | Status       |
  | -- | ------------ |
  | 1  | Received     |
  | 3  | Paid         |
  | 4  | Rejected     |
  | 5  | In Review    |
  | 6  | Canceled     |
  | 10 | Expired      |
  | 11 | Invalid Data |

  Example: `[3, 6]`
</ParamField>

<ParamField body="dry_run" type="boolean">
  When `true`, the job is **not dispatched**. Instead, only the count of matching transactions is returned.

  Useful for estimating volume before triggering the actual resend.

  Default: `false`
</ParamField>

## Response

<ResponseField name="job_id" type="string">
  Unique identifier for the dispatched job. Use this to query the job status.

  Example: `"a3f1bc2e4d8f0a1b2c3d4e5f6a7b8c9d"`
</ResponseField>

<ResponseField name="total" type="integer">
  Total number of payout transactions matched and queued for webhook resend.

  Example: `87`
</ResponseField>

<ResponseExample>
  ```json 202 theme={null}
  {
    "job_id": "a3f1bc2e4d8f0a1b2c3d4e5f6a7b8c9d",
    "total": 87
  }
  ```

  ```json 200 (dry_run) theme={null}
  {
    "total": 87
  }
  ```

  ```json 409 theme={null}
  {
    "message": "A resend job is already running for this merchant and time range."
  }
  ```

  ```json 422 theme={null}
  {
    "message": "Validation error.",
    "errors": {
      "end_time": [
        "The time range must not exceed 3 hours."
      ]
    }
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.wepayments.com/v2/payout/notifications/resend" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "merchant_id": 303,
      "start_time": "2026-03-24 08:00:00",
      "end_time": "2026-03-24 11:00:00",
      "status_ids": [3, 6],
      "dry_run": false
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.wepayments.com/v2/payout/notifications/resend', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      merchant_id: 303,
      start_time: '2026-03-24 08:00:00',
      end_time: '2026-03-24 11:00:00',
      status_ids: [3, 6],
      dry_run: false
    })
  });

  const { job_id, total } = await response.json();
  console.log(`Job dispatched: ${job_id} (${total} transactions)`);
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.wepayments.com/v2/payout/notifications/resend',
      headers={'Authorization': 'Bearer YOUR_API_KEY'},
      json={
          'merchant_id': 303,
          'start_time': '2026-03-24 08:00:00',
          'end_time': '2026-03-24 11:00:00',
          'status_ids': [3, 6],
          'dry_run': False
      }
  )

  data = response.json()
  print(f"Job dispatched: {data['job_id']} ({data['total']} transactions)")
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.wepayments.com/v2/payout/notifications/resend');
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Authorization: Bearer YOUR_API_KEY',
      'Content-Type: application/json'
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
      'merchant_id' => 303,
      'start_time'  => '2026-03-24 08:00:00',
      'end_time'    => '2026-03-24 11:00:00',
      'status_ids'  => [3, 6],
      'dry_run'     => false
  ]));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  $response = json_decode(curl_exec($ch), true);
  curl_close($ch);

  echo "Job dispatched: {$response['job_id']} ({$response['total']} transactions)";
  ?>
  ```
</CodeGroup>

## Related

<CardGroup cols={2}>
  <Card title="Job Status" icon="clock" href="/api-reference/cash-out/webhooks/resend-bulk-status">
    Track the progress of a dispatched resend job
  </Card>

  <Card title="Payout Webhook" icon="webhook" href="/cash-out/payout-webhook">
    Understand the webhook payload structure
  </Card>

  <Card title="Status Flow" icon="diagram-project" href="/cash-out/status-flow">
    Understand payout status lifecycle
  </Card>
</CardGroup>
