Skip to content

Create Events Batch

POST
/users/{user_id}/events/batch
curl --request POST \
--url https://example.com/users/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/events/batch \
--header 'Content-Type: application/json' \
--data '{ "events": [ { "boolean_value": true, "category_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "category_name": "example", "category_slug": "example", "client_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "duration": "example", "local_date": "2026-04-15", "metadata": {}, "notes": "example", "occurred_at": "2026-04-15T12:00:00Z", "scalar_value": 1, "tags": [ "example" ] } ] }'

Bulk-create events in one request (capped at MAX_BATCH_EVENTS). Each item targets a category by category_id (owned) or by category_slug (auto-created as a freeform system category, like the Home Assistant ingest does). Idempotent on client_id — items whose key already exists, in the DB or earlier in the same batch, are skipped rather than duplicated. This is the general path that lets push integrations / scripts submit many events without a request per event or pre-provisioned categories — no integration-scoped endpoint required.

user_id
required
User Id
string format: uuid
Media typeapplication/json
EventBatchCreate
object
events
required
Events
Array<object>
<= 500 items
EventBatchItem

One event in a batch create. Identify the category by category_id (must exist and be owned) OR by category_slug (auto-created as a freeform system category if it doesn’t exist yet — so a push integration can send events without pre-provisioning categories). Exactly one of the two is required. Sealed-content fields (saved_meal_id, encrypted_payload) are intentionally left out — batch create targets ordinary/integration events, not the interactive meal/e2e flows.

object
boolean_value
Any of:
boolean
category_id
Any of:
string format: uuid
category_name
Any of:
string
<= 100 characters
category_slug
Any of:
string
<= 49 characters
client_id
Any of:
string format: uuid
duration
Any of:
string format: duration
local_date
Any of:
string format: date
metadata
Metadata
object
key
additional properties
any
notes
Any of:
string
occurred_at
Any of:
string format: date-time
scalar_value
Any of:
number
tags
Any of:
Array<string>
Examplegenerated
{
"events": [
{
"boolean_value": true,
"category_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"category_name": "example",
"category_slug": "example",
"client_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"duration": "example",
"local_date": "2026-04-15",
"metadata": {},
"notes": "example",
"occurred_at": "2026-04-15T12:00:00Z",
"scalar_value": 1,
"tags": [
"example"
]
}
]
}

Successful Response

Media typeapplication/json
EventBatchResult

Created = newly inserted events; skipped = items whose client_id already existed (idempotent replay), deduped both within the batch and against stored rows.

object
created
required
Created
Array<object>
EventRead
object
boolean_value
required
Any of:
boolean
category_id
required
Any of:
string format: uuid
client_id
Any of:
string format: uuid
created_at
required
Created At
string format: date-time
duration
required
Any of:
string format: duration
encrypted_payload
Any of:
string
id
required
Id
string format: uuid
label
required
Any of:
string
local_date
required
Any of:
string format: date
metadata
required
Metadata
object
key
additional properties
any
notes
required
Any of:
string
occurred_at
required
Occurred At
string format: date-time
privacy_scheme
Any of:
string
saved_meal_id
required
Any of:
string format: uuid
scalar_value
required
Any of:
string
/^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$/
source
required
EventSource
string
Allowed values: user system
tags
required
Any of:
Array<string>
updated_at
required
Updated At
string format: date-time
user_id
required
User Id
string format: uuid
skipped
required
Skipped
integer
Example
{
"created": [
{
"source": "user"
}
]
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
]
}