---
title: "Ingest a behavioral event"
method: POST
path: "/events"
tags: ["Events"]
---

# Ingest a behavioral event

`POST /events`

## Request

- Base URL: `https://sending.dev/api/v1`
- URL: `https://sending.dev/api/v1/events`
- Auth: HTTP bearer

Records the event, applies UTM/conversion attribution and queues the automation. Provide `contactId` or `email` (at the top level of the body). With `idempotencyKey` (8-200 characters, e.g. the order id) the same repeated request answers 200 `duplicate` without recording a second event or a second conversion: a payment webhook delivered twice is the norm. Without a key every call is a new event. Required scope: `events:write`.

## Request body

- EventInput
  - `name` string, required
  - `contactId` string, uuid
  - `email` string, email
  - `properties` object
  - `idempotencyKey` string

## Response `200`

Same `idempotencyKey` already seen: nothing new recorded.

- EventAccepted
  - `status` 'accepted' | 'duplicate', required
  - `eventId` string, uuid, required
  - `contactId` string, uuid, required

## Other responses

- `202`: Event accepted.
- `401`: Missing or invalid token.
- `403`: Insufficient scope.
- `404`: Resource not found.
- `422`: Invalid input.

---

[API](https://skmtc.dev/sending/apis/sending-dev-api.md) · [All operations](https://skmtc.dev/sending/apis/sending-dev-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sending/apis/sending-dev-api/revisions/9fe78d2918a1?raw)
