---
title: Resend event by ID
slug: apis/webhooks/cos-webhooks/events-formats-cos/webhook-management-cos/resend-event-by-id
description: POST webhooks/v1/events/{id}/resend manually retriggers a webhook event to be sent to a partner's callback URL.
icon: {"apiMethod":"POST"}
docTags: 
createdAt: 2025-05-07T13:17:23.399Z
---

:::ApiMethodV2
```json
{
  "name": "Endpoint: /webhooks/v1/events/{id}/resend",
  "method": "POST",
  "url": "https://sandbox.crbcos.com/webhooks/v1/events/{id}/resend",
  "description": "Manually resends a webhook event to the partner's registered callback URL",
  "tab": "examples",
  "examples": {
    "languages": [
      {
        "id": "curl-resend-event",
        "language": "curl",
        "code": "curl --location --request POST 'https://sandbox.crbcos.com/webhooks/v1/events/8d6115c0-2a88-4a58-b731-b306002e8bc2/resend' \\",
        "customLabel": ""
      },
      {
        "id": "nodejs-resend-event",
        "language": "nodejs",
        "code": "var https = require('follow-redirects').https;\n\nvar options = {\n  'method': 'POST',\n  'hostname': 'sandbox.crbcos.com',\n  'path': '/webhooks/v1/events/8d6115c0-2a88-4a58-b731-b306002e8bc2/resend',\n  'headers': {},\n  'maxRedirects': 20\n};\n\nvar req = https.request(options, function (res) {\n  var chunks = [];\n\n  res.on(\"data\", function (chunk) {\n    chunks.push(chunk);\n  });\n\n  res.on(\"end\", function (chunk) {\n    var body = Buffer.concat(chunks);\n    console.log(body.toString());\n  });\n\n  res.on(\"error\", function (error) {\n    console.error(error);\n  });\n});\n\nreq.end();",
        "customLabel": ""
      },
      {
        "id": "python-resend-event",
        "language": "python",
        "code": "import requests\n\nurl = \"https://sandbox.crbcos.com/webhooks/v1/events/8d6115c0-2a88-4a58-b731-b306002e8bc2/resend\"\n\npayload = {}\nheaders = {}\n\nresponse = requests.request(\"POST\", url, headers=headers, json=payload)\n\nprint(response.text)",
        "customLabel": ""
      },
      {
        "id": "ruby-resend-event",
        "language": "ruby",
        "code": "require \"uri\"\nrequire \"net/http\"\n\nurl = URI(\"https://sandbox.crbcos.com/webhooks/v1/events/8d6115c0-2a88-4a58-b731-b306002e8bc2/resend\")\n\nhttps = Net::HTTP.new(url.host, url.port)\nhttps.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\n\nresponse = https.request(request)\nputs response.read_body",
        "customLabel": ""
      },
      {
        "id": "go-resend-event",
        "language": "go",
        "code": "package main\n\nimport (\n  \"fmt\"\n  \"net/http\"\n  \"io\"\n)\n\nfunc main() {\n\n  url := \"https://sandbox.crbcos.com/webhooks/v1/events/8d6115c0-2a88-4a58-b731-b306002e8bc2/resend\"\n  method := \"POST\"\n\n  client := &http.Client {}\n  req, err := http.NewRequest(method, url, nil)\n\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  res, err := client.Do(req)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  defer res.Body.Close()\n\n  body, err := io.ReadAll(res.Body)\n  if err != nil {\n    fmt.Println(err)\n    return\n  }\n  fmt.Println(string(body))\n}",
        "customLabel": ""
      }
    ],
    "selectedLanguageId": "curl-resend-event"
  },
  "results": {
    "languages": [
      {
        "id": "200-resend-event",
        "language": "200",
        "customLabel": "",
        "code": "{\n    \"id\": \"8d6115c0-2a88-4a58-b731-b306002e8bc2\",\n    \"eventName\": \"Cards.Card.Activated\",\n    \"status\": \"Pending\",\n    \"partnerId\": \"19222b81-0e1e-452d-a842-b2f1011c16f3\",\n    \"createdAt\": \"2026-05-07T10:30:00Z\",\n    \"lastAttemptedAt\": \"2026-05-07T14:15:30Z\",\n    \"resources\": [\n        \"card:12345678-1234-1234-1234-123456789012\"\n    ],\n    \"details\": [\n        {\n            \"cardId\": \"12345678-1234-1234-1234-123456789012\",\n            \"status\": \"Activated\"\n        }\n    ],\n    \"isPing\": false\n}"
      }
    ],
    "selectedLanguageId": "200-resend-event"
  },
  "request": {
    "pathParameters": [
      {
        "name": "id",
        "kind": "required",
        "type": "string",
        "description": "The ID of the event to resent.",
        "": "The ID of the event to resent."
      }
    ],
    "queryParameters": [],
    "headerParameters": [],
    "formDataParameters": [],
    "bodyDataParameters": []
  },
  "currentNewParameter": {
    "label": "Path Parameter",
    "value": "pathParameters"
  },
  "response": [
    {
      "name": "id",
      "kind": "optional",
      "type": "string",
      "description": "The webhook event ID. This ID is in GUID format."
    },
    {
      "name": "partnerId",
      "kind": "optional",
      "type": "string",
      "description": "Your unique ID in the Cross River system. This ID is in GUID format.",
      "children": []
    },
    {
      "name": "eventName",
      "kind": "optional",
      "type": "string",
      "description": "Webhook event being reported",
      "children": []
    },
    {
      "name": "status",
      "kind": "required",
      "type": "string",
      "description": "Current status of the webhook event:\n- Pending: Event is queued for delivery\n- Success: Event was successfully delivered\n- Failed: Event delivery failed\n- Expired: Event exceeded retry attempts and expired",
      "children": []
    },
    {
      "name": "createdAt",
      "kind": "required",
      "type": "string",
      "description": "ISO 8601 timestamp when the event was originally created",
      "children": []
    },
    {
      "name": "lastAttemptedAt",
      "kind": "optional",
      "type": "string",
      "description": "ISO 8601 timestamp of the last delivery attempt. Null if no attempts have been made yet.",
      "children": []
    },
    {
      "name": "resources",
      "kind": "optional",
      "type": "array",
      "description": "Array of resource identifiers affected by this event (e.g., card:guid, payment:guid)",
      "children": []
    },
    {
      "name": "details",
      "kind": "optional",
      "type": "array",
      "description": "Array of key-value pair objects containing event-specific details and metadata",
      "children": []
    },
    {
      "name": "isPing",
      "kind": "optional",
      "type": "boolean",
      "description": "Indicates whether this is a ping/test event (true) or a real event (false)",
      "children": []
    }
  ],
  "hasTryItOut": false,
  "autoGeneratedAnchorSlug": "endpoint-webhooksv1eventsidresend",
  "legacyHash": "QnHhV6xew6wos5g667TV4"
}
```
:::

# Overview

Use the **Resend Event by ID&#x20;**&#x65;ndpoint to manually retry delivering a webhook event to your configured callback URL. This helps when the initial delivery failed or timed out. It also helps you recover from a missed event.

# When to Use

Use this endpoint in the following scenarios:

- **Failed delivery recovery**: When an event delivery failed due to network issues or your endpoint downtime
- **Timeout recovery**: When the initial webhook delivery timed out
- **Manual retry**: When support teams need to retry specific webhook deliveries
- **Testing**: To verify webhook processing after you fix your endpoint or during development

# Requirements

Before using this endpoint, ensure:

1. **Event exists**: The event ID must be valid (returns 404 if not found)
2. **Active registration** - you must have an active webhook registration for that event type
3. **Push type only**: The registration must be **Push type** - you cannot resend Poll-type or File-type webhooks
4. **Permissions**: Requires `Permissions.Events.Resend` permission

# How It Works

When you call this endpoint:

1. **Event Retrieval**: The system retrieves the event by its ID from the database
2. **Asynchronous queueing** - the resend request is queued for asynchronous processing via NServiceBus (IssueEventCallback command)
3. **Immediate Response**: The endpoint returns immediately with the current event information - it does **not** wait for the delivery attempt to complete
4. **Background Delivery**: The event is delivered to the registered callback URL in the background
5. **Status Update**: After the delivery attempt, the event's `status` and `lastAttemptedAt` timestamp are updated accordingly

**Important**: This is an asynchronous operation. The 200 OK response means the resend was successfully queued. It doesn't mean the event was delivered. Check the event status after a few seconds using `GET /v1/events/{id}` to verify delivery.

# Error Codes

This endpoint may return the following application-specific error codes:

| Error Code                            | Description                                                 |
| ------------------------------------- | ----------------------------------------------------------- |
| `Events.RegistrationNotFoundForEvent` | No webhook registration found for this event type           |
| `Events.CanOnlyResendPush`            | Can only resend push-type webhooks (not poll or file types) |
| `404 Not Found`                       | Event ID does not exist                                     |
| `403 Forbidden`                       | Missing required permissions                                |

# Important Notes

- **Asynchronous Operation**: This endpoint returns immediately before the resend completes. The response shows the event status when you call the API. It doesn't show status after the resend attempt.
- **Check Delivery Status**: To verify if the resend was successful, use the `GET /v1/events/{id}` endpoint or `GET /v1/events/{id}/logs` endpoint after a few seconds to check the updated status and delivery logs.
- **Any Status Eligible**: You can resend events in any status (Pending, Success, Failed, or Expired).
- **No Idempotency Protection**: Calling resend multiple times will queue multiple deliveries - the system does not prevent duplicate event deliveries.
- **Partner Endpoint**: Ensure the partner's callback URL is available before resending.
- **Registration Status**: If the webhook registration is suspended, the resend may fail.

# Response Fields Explained

## Status Values

The `status` field in the response indicates the current state of the event:

| Status    | Description                                                     |
| --------- | --------------------------------------------------------------- |
| `Pending` | Event is queued and waiting for delivery                        |
| `Success` | The system successfully delivered the event to the callback URL |
| `Failed`  | Event delivery failed (temporary failure, will retry)           |
| `Expired` | Event exceeded maximum retry attempts and expired               |

After calling resend, the event typically returns to `Pending` status while the delivery attempt is processed in the background.

## Resources Array

The `resources` array contains identifiers for entities affected by the event, formatted as `resourceType:guid`:

```json
"resources": [
  "card:12345678-1234-1234-1234-123456789012",
  "account:98765432-8765-4321-8765-987654321098"
]
```

## Details Array

The `details` array contains event-specific metadata as key-value pairs:

```json
"details": [
  {
    "cardId": "12345678-1234-1234-1234-123456789012",
    "status": "Activated",
    "activationMethod": "API"
  }
]
```

# Best Practices

1. **Verify registration**: Confirm the webhook registration is active and properly configured using `GET /v1/registrations`
2. **Monitor delivery**: After resending, wait a few seconds then check your callback to confirm successful delivery
3. **Avoid rapid retries**: Don't repeatedly call resend in quick succession - allow time for asynchronous processing. We recommend 5-10 second intervals.

