Перейти к документации
C#

client.Events

Каждый метод этого пространства имён: его сигнатура, параметры, что он возвращает, и пример.

Методы

Things your contacts did, sent by your own code, such as an order placed or a trial started. An event starts the automations whose trigger names it and ends the waits that were holding out for it.

Events.SendAsync

Record that something happened to a contact

Разрешенияcontacts:write
Сигнатура
Task<JsonObject> SendAsync(    IReadOnlyDictionary<string, object?> body,    string? idempotencyKey = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Records an event against one contact, named by email or contactId: an order placed, a trial started, a plan changed. Every live automation whose trigger is this event name, and whose filters match properties, takes the contact in, and any wait step holding out for the name moves on. enrolled and resumed in the answer say what it set off. Events are kept for 90 days.

Every call carries an Idempotency-Key. The SDK generates one per call and reuses it on that call's retries, so a retried network failure returns the stored event instead of recording a second one. Pass idempotencyKey: to extend that across processes and restarts. A replay returns replayed set to true and starts nothing again. The same key with a different event is a 422 idempotency_key_reuse.

An event sent with a test key is stored with mode test and starts or resumes nothing.

Параметры

namestringОбязательно

What happened, such as order.placed: 1 to 100 letters, digits, dots, colons, dashes and underscores, starting with a letter or a digit. Names are matched exactly, case included.

emailstring

The contact the event is about, by email address. Send this or contactId.

contactIdstring

The contact the event is about, by id. Send this or email.

propertiesdictionary

Anything worth keeping about the event, as a dictionary of at most 50 keys and 4 KB of JSON. An event trigger can filter on these, and steps can put them in an email or a contact field.

occurredAtDateTimeOffset or string

When it happened, as a DateTimeOffset or an ISO 8601 string. Left out, it is now. It cannot be in the future or more than 90 days ago.

createContactbool

Add the address to the contacts when nobody has it yet. It needs email. Left out or false, an unknown address is a 404 contact_not_found.

contactNamestring

The name to give a contact that createContact adds, at most 200 characters.

idempotencyKeystring?

Your own key, 1 to 255 characters of letters, digits, _, ., : or -. Anything else is a 400 invalid_idempotency_key.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request. A cancelled call may still have been recorded, so retry with the same idempotencyKey:.

Возвращает

A JsonObject: the event, with id, contactId, email, name, properties, occurredAt, mode and createdAt, plus replayed, enrolled, the ids of the automations it put the contact into, and resumed, how many waits it ended.

Пример

var sent = await client.Events.SendAsync(new Body{    ["name"] = "order.placed",    ["email"] = "[email protected]",    ["properties"] = new Body { ["orderId"] = "AC-4192", ["total"] = 129 },    ["createContact"] = true,}, idempotencyKey: "order:AC-4192:placed"); Console.WriteLine($"{sent["id"]} started {sent["enrolled"]?.AsArray().Count} automations and ended {sent["resumed"]} waits");

Примечания

  • A name, properties or an occurredAt that break a rule, or a body that names no contact, is 422 invalid_event with param naming the field.

  • A key or an app may send 600 events a minute. Past that the call is 429 event_rate_limited.

  • An app a member connected reaches only the contacts that member added, and a contact it creates belongs to that member.

  • Retried automatically on network failure and retryable statuses, because the idempotency key makes a retry safe.

Также доступно в

API
POST /events
TypeScript
events.send()
Python
events.send()
Ruby
events.send
PHP
events->send
Go
Events.Send
Java
events().send
CLI
openemail events send

Events.SendBatchAsync

Record up to 100 contact events in one call

Разрешенияcontacts:write
Сигнатура
Task<JsonObject> SendBatchAsync(    IEnumerable<IReadOnlyDictionary<string, object?>> events,    string? idempotencyKey = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Records each event in order, as if Events.SendAsync had been called for it, and reports per event. It is never all or nothing: accepted holds the events that were stored and failed the ones that were not, each with the index it had in the list, so one unknown address does not stop the rest. The call returns whenever the batch was processed, so check failed rather than relying on an exception.

The batch shares one Idempotency-Key, generated once per call or supplied as idempotencyKey:, and the server remembers each event under the key and its position. Retrying the same list replays the events that were already stored and records only the ones that were not. Reordering the list between attempts makes an event that moved fail with idempotency_key_reuse.

Параметры

eventsIEnumerable<IReadOnlyDictionary<string, object?>>Обязательно

The events, 1 to 100 of them, each in the shape Events.SendAsync takes: name, email or contactId, and optionally properties, occurredAt, createContact and contactName.

idempotencyKeystring?

Your own key for the whole batch, 1 to 255 characters of letters, digits, _, ., : or -.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request. A cancelled batch may have been recorded in part, so retry the same list with the same idempotencyKey:.

Возвращает

A JsonObject with accepted, a list of the stored events, each shaped like what Events.SendAsync returns plus its index, and failed, a list of objects with index, code and message.

Пример

var batch = await client.Events.SendBatchAsync(new[]{    new Body { ["name"] = "trial.started", ["email"] = "[email protected]" },    new Body    {        ["name"] = "trial.started",        ["email"] = "[email protected]",        ["properties"] = new Body { ["plan"] = "team" },    },}, idempotencyKey: "trials:2026-10-11"); foreach (var failure in batch["failed"]?.AsArray() ?? []){    Console.WriteLine($"Event {failure?["index"]}: {failure?["code"]} {failure?["message"]}");} Console.WriteLine($"{batch["accepted"]?.AsArray().Count} stored");

Примечания

  • A body of the wrong shape, an empty list or more than 100 events is refused whole with 422 invalid_parameter, and param names the event and the field, such as events.3.name.

  • The batch counts as that many events toward the 600 a minute a key or an app may send. A batch that would pass it is 429 event_rate_limited and nothing is stored.

  • A failed event carries the code the single call would answer: invalid_event, contact_not_found or idempotency_key_reuse.

  • Retried automatically on network failure and retryable statuses, because the idempotency key makes a retry safe.

Также доступно в

API
POST /events/batch
TypeScript
events.sendBatch()
Python
events.send_batch()
Ruby
events.send_batch
PHP
events->sendBatch
Go
Events.SendBatch
Java
events().sendBatch
CLI
openemail events send-batch

Events.ListNamesAsync

List the event names the workspace has seen

Разрешенияautomations:read
Сигнатура
Task<IReadOnlyList<JsonObject>> ListNamesAsync(    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns the distinct names of the events the workspace holds, in byte order, at most 100. It is what the app suggests when somebody picks the event that starts an automation. Events are kept for 90 days, so a name nothing has sent in that time is gone. The list is not paginated.

Параметры

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A list of JsonObject items, each with name.

Пример

var names = await client.Events.ListNamesAsync(); Console.WriteLine(string.Join(", ", names.Select(entry => entry["name"])));

Примечания

  • It needs automations:read, not a contacts scope, because it serves the automation builder.

  • Read only, so the SDK retries it after a network failure like any other read.

Также доступно в

API
GET /events/names
TypeScript
events.listNames()
Python
events.list_names()
Ruby
events.list_names
PHP
events->listNames
Go
Events.ListNames
Java
events().listNames
CLI
openemail events list-names