POST
/
v1
/
events
/
send
curl --request POST \
  --url https://app.loops.so/api/v1/events/send \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "email": "<string>",
  "userId": "<string>",
  "eventName": "<string>",
  "eventProperties": {},
  "mailingLists": {}
}'
{
  "success": true
}

Request

Body

Provide either an email or userId value or both to identify the contact. If both are provided, the system will look for a contact with either a matching email or userId value. If a contact is found for one of the values (e.g. email), the other value (e.g. userId) will be updated. If a contact is not found, a new contact will be created using both email and userId values.

email
string

The contact’s email address.

userId
string

The contact’s unique user ID. This must already have been added to your contact in Loops.

eventName
string
required

The name of the event.

eventProperties
object

An object containing event property data for the event. Values can be of type string, number, boolean or date. Read more

mailingLists
object

Key-value pairs of mailing list IDs and a boolean denoting if the contact should be added (true) or removed (false) from the list. Read more

{
  "mailingLists": {
    "cm06f5v0e45nf0ml5754o9cix": true,
    "cm16k73gq014h0mmj5b6jdi9r": false
  }
}

Contact properties

You can also include default and custom contact properties in your request body, which will update the contact in Loops. These should be added as top-level attributes in the request.

Contact properties can be of type string, number, boolean or date (see allowed date formats).

{
  "email": "[email protected]",
  "eventName": "signup",
  "firstName": "Bob", /* Contact property */
  "plan": "pro" /* Custom contact property */
}

There are a few reserved names that you cannot use for custom properties.

To empty or reset the value of a contact property, send a null value.

Headers

Idempotency-Key
string

Optionally send an idempotency key to avoid duplicate requests.
The value should be a string of up to 100 characters and should be unique for each request. We recommend using V4 UUIDs or some other method with enough guaranteed entropy to avoid collisions during a 24 hour window.
The endpoint will return a 409 Conflict response if the idempotency key has been used in the previous 24 hours.

Response

Success

success
boolean
required

Error

If you send an idempotency key which has already been used in the previous 24 hours, a 409 Conflict response will be returned.

All other errors will be 400 Bad Request.

success
boolean
required
message
string
required

An error message describing the problem with the request.

{
  "success": true
}