# ping

Source: https://docs.revoplyai.com/webhooks/events/ping/

> A test from the dashboard.

Webhook event `ping`, delivered as `POST` to your endpoint.

**Fires when** someone presses "Send test" on the endpoint without choosing an event. Carries `"test": true`.

**Does not fire** on its own: it cannot be subscribed to, is sent only when someone asks for it, and is never retried.

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `X-Revoply-Signature` | header | yes | `t=<unix seconds>,v1=<hex HMAC-SHA256 of "{t}.{body}">`, with a second `v1` while a rotated secret still signs. Verify it before trusting the body. |
| `X-Revoply-Event` | header | yes | The event's `type`, so a receiver can route before parsing. |
| `X-Revoply-Delivery` | header | yes | This delivery's id. A resend of the same event keeps the envelope `id` and gets a new delivery id. |

## Payload

```json
{
  "allOf": [
    {
      "required": [
        "id",
        "type",
        "apiVersion",
        "createdAt",
        "test",
        "company",
        "data"
      ],
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "The event's id, `evt_…`. The same on every retry and resend.",
          "example": "evt_4e1b9c2d7a3f4e8b9c0d1e2f3a4b5c6d"
        },
        "type": {
          "type": "string",
          "description": "What happened. Treat an unknown value as an event you did not subscribe to, and acknowledge it.\n\nKnown values: `message.received`, `conversation.started`, `conversation.handover`, `conversation.assigned`, `conversation.resolved`, `contact.created`, `contact.updated`, `contact.opted_out`, `lead.qualified`, `appointment.booked`, `appointment.cancelled`, `flow.completed`, `flow.failed`, `ping`. More may be added.",
          "x-extensible-enum": [
            "message.received",
            "conversation.started",
            "conversation.handover",
            "conversation.assigned",
            "conversation.resolved",
            "contact.created",
            "contact.updated",
            "contact.opted_out",
            "lead.qualified",
            "appointment.booked",
            "appointment.cancelled",
            "flow.completed",
            "flow.failed",
            "ping"
          ]
        },
        "apiVersion": {
          "type": "string",
          "description": "The shape of `data`. A new version is opt-in per endpoint.",
          "example": "2026-10"
        },
        "createdAt": {
          "type": "string",
          "description": "When it happened, UTC.",
          "format": "date-time"
        },
        "test": {
          "type": "boolean",
          "description": "True for what \"Send test\" posts: a sample, about nobody real. Always present."
        },
        "company": {
          "required": [
            "id",
            "name"
          ],
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "The account (or project) it happened in.",
              "format": "uuid"
            },
            "name": {
              "type": [
                "null",
                "string"
              ]
            }
          }
        },
        "data": {
          "type": "object",
          "description": "Depends on `type`; see each event."
        }
      },
      "description": "Every event arrives in this envelope. Fields are only ever added, and a field that can be empty is sent as null rather than left out. Deduplicate on `id`: a delivery can arrive more than once."
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "ping"
        },
        "data": {
          "required": [
            "message"
          ],
          "type": "object",
          "properties": {
            "message": {
              "type": "string"
            }
          }
        }
      }
    }
  ]
}
```

Example:

```json
{
  "id": "evt_2f49fe013bfeb76d088b2b7018ef6f6b",
  "type": "ping",
  "apiVersion": "2026-10",
  "createdAt": "2026-10-01T09:30:05+00:00",
  "test": true,
  "company": {
    "id": "0b3d6f2e-8a41-4c75-9e20-5f7a1c3d9b84",
    "name": "متجر الرياض"
  },
  "data": {
    "message": "This is a test event from RevoplyAI."
  }
}
```

## Responses

### 410

The endpoint is gone for good: it is switched off at once, and the account's owner is told.

### 2XX

Received. Answer within 10 seconds and do the work afterwards; the body is kept for your delivery log and otherwise ignored.

### default

Anything else, a timeout or no answer is a failure, tried again after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, 24 h, then dead-lettered. An endpoint failing 100 times in a row, or for 3 days, is switched off. Tests are never retried.
