---
title: "Ingest a custom event"
method: POST
path: "/api/v1/events"
tags: ["Events API"]
---

# Ingest a custom event

`POST /api/v1/events`

Accepts a customer event (e.g. "purchase", "new_account_created") and stores it for downstream processing. The event is associated with a contact (resolved via `aiContactId` or `phone`) on a specific channel (resolved via `channelId` or `channelPhone`); a contact is created when none matches. The event is persisted synchronously and the response carries its id; enrichment and automations run in the background. Rate limited to 1000 requests per hour per client.

## Headers

- `x-api-key` string, required

## Request body

- IngestEventDto
  - `event` string, required
  - `occurredAt` string, date-time
  - `properties` object, required
  - `contact` object, required
    - `aiContactId` string, uuid
    - `phone` string
    - `name` string
    - `email` string, email
  - `channel` object, required
    - `channelId` string
    - `channelPhone` string

## Response `202`

Event stored. Returns the persisted event id.

- object
  - `id` string, uuid

## Other responses

- `400` — Bad request — payload failed validation, `occurredAt` is in the future, properties exceed limits, the event key is reserved for internal use, the provided `channelId` / `channelPhone` did not match any channel for this client, or the contact could not be resolved.
- `401` — Unauthorized — invalid or missing API key.
- `429` — Too many requests — client rate limit exceeded.

---

[API](https://skmtc.net/vambe/apis/vambe-ai-api.md) · [All operations](https://skmtc.net/vambe/apis/vambe-ai-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/vambe/vambe-ai-api/revisions/e206709d4be5/schema)
