# Replay an event to one webhook endpoint

Source: https://joinsimplesms.com/docs/api/events/replay
Index: https://joinsimplesms.com/llms.txt

`POST /v1/events/{id}/replay`

Sends the stored event to the endpoint you name, now, and returns its answer. Not retried. Works for paused endpoints and ones not subscribed to the event type.

Send your API key as a bearer token: `Authorization: Bearer ssms_sk_...`. Test keys run this endpoint against the [sandbox](/docs/sandbox); see [Authentication](/docs/authentication) for key modes and scopes.

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes | Example: `evt_a1B2c3D4e5F6g7H8`. |

## Request body

JSON (`Content-Type: application/json`).

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `endpoint_id` | string | Yes | Example: `we_a1B2c3D4e5F6`. |

## Responses

| Status | Meaning | Body |
| --- | --- | --- |
| 200 | What the endpoint answered | JSON object |
| 401 | Missing, malformed, or revoked API key | `Error` |
| 402 | Billable live calls only: the prepaid credit balance cannot cover the call (insufficient_credits); nothing was done or charged | `Error` |
| 404 | No such event or endpoint | `Error` |
| 429 | Rate limit or quota exceeded | `Error` |

### 200: response fields

| Field | Type | Description |
| --- | --- | --- |
| `object` | `webhook_replay` |  |
| `event_id` | string |  |
| `endpoint_id` | string |  |
| `delivery_id` | string |  |
| `ok` | boolean |  |
| `status_code` | integer | Nullable. |
| `error` | `timeout`, `unreachable` | Nullable. |
| `latency_ms` | integer |  |

## Errors

| Status | When |
| --- | --- |
| 401 | Missing, malformed, or revoked API key |
| 402 | Billable live calls only: the prepaid credit balance cannot cover the call (insufficient_credits); nothing was done or charged |
| 404 | No such event or endpoint |
| 429 | Rate limit or quota exceeded |

Every error has the same JSON shape, and `request_id` matches the `X-Request-Id` response header. [Errors](/docs/errors) lists every code and what to do about it.

```json
{
  "error": {
    "code": "invalid_request",
    "message": "What went wrong, in plain words.",
    "param": "the_field",
    "request_id": "req_a1B2c3D4e5F6g7H8"
  }
}
```

## Examples

### curl

```bash
curl -X POST "https://api.joinsimplesms.com/v1/events/evt_a1B2c3D4e5F6g7H8/replay" \
  -H "Authorization: Bearer $SIMPLESMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "endpoint_id": "we_a1B2c3D4e5F6"
}'
```

### Node.js

The Node.js SDK does not wrap this endpoint yet; call it with `fetch`.

```javascript
const res = await fetch('https://api.joinsimplesms.com/v1/events/evt_a1B2c3D4e5F6g7H8/replay', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SIMPLESMS_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "endpoint_id": "we_a1B2c3D4e5F6"
  }),
});

if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();
```

### Python

The Python SDK does not wrap this endpoint yet; call it over HTTP.

```python
import json, os, urllib.request

req = urllib.request.Request(
    "https://api.joinsimplesms.com/v1/events/evt_a1B2c3D4e5F6g7H8/replay",
    method="POST",
    headers={
        "Authorization": f"Bearer {os.environ['SIMPLESMS_API_KEY']}",
        "Content-Type": "application/json",
    },
    data=json.dumps({
        "endpoint_id": "we_a1B2c3D4e5F6"
    }).encode(),
)
with urllib.request.urlopen(req) as res:
    data = json.load(res)
```

## Related

- Guide: [Webhooks](/docs/webhooks)
- [All events endpoints](/docs/api#events)
- [API reference](/docs/api)
