Skip to content

Events

Events are the individual entries on a calendar — meetings, appointments, tasks, or any time-boxed item your agent needs to track.

By the end of this guide you will be able to create events on a calendar, list and filter them, query across an agent’s calendars, update event details, and delete events.

  • A Chronary account with an API key
  • At least one agent and calendar created (see the quickstart)
Terminal window
curl -X POST https://api.chronary.ai/v1/calendars/cal_x1y2z3/events \
-H "Authorization: Bearer chr_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Product demo with Globex Industries",
"start_time": "2026-04-10T15:00:00Z",
"end_time": "2026-04-10T16:00:00Z",
"description": "Walk through the new dashboard features and pricing tiers",
"status": "confirmed",
"metadata": {
"deal_id": "deal_9823",
}
}'

You can also create all-day events by setting all_day: true and providing dates without times:

{
"title": "Company offsite",
"start_time": "2026-04-15T00:00:00Z",
"end_time": "2026-04-17T00:00:00Z",
"all_day": true
}

Retrieve events for a specific calendar with optional filters.

Terminal window
curl "https://api.chronary.ai/v1/calendars/cal_x1y2z3/events?start_after=2026-04-07T00:00:00Z&start_before=2026-04-14T00:00:00Z&status=confirmed&limit=20" \
-H "Authorization: Bearer chr_sk_your_key_here"

Filter parameters:

ParameterTypeDescription
start_afterISO 8601Only events starting after this time
start_beforeISO 8601Only events starting before this time
statusstringFilter by status: confirmed, tentative, cancelled
sourcestringFilter by source: api, external_ical
limitintegerResults per page (default: 50, max: 200)
offsetintegerNumber of results to skip for pagination
expandbooleanExpand recurring series into individual occurrences (requires both start_after and start_before, window up to 366 days) — see Recurring events

Query all events across every calendar owned by an agent. This is useful when an agent has multiple calendars and you need a unified view.

Terminal window
curl "https://api.chronary.ai/v1/agents/agt_a1b2c3d4/events?start_after=2026-04-07T00:00:00Z&limit=50" \
-H "Authorization: Bearer chr_sk_your_key_here"
Terminal window
curl https://api.chronary.ai/v1/calendars/cal_x1y2z3/events/evt_m1n2o3 \
-H "Authorization: Bearer chr_sk_your_key_here"

Only the fields you include in the request body are updated. Omitted fields remain unchanged.

Terminal window
curl -X PATCH https://api.chronary.ai/v1/calendars/cal_x1y2z3/events/evt_m1n2o3 \
-H "Authorization: Bearer chr_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Product demo with Globex Industries (rescheduled)",
"start_time": "2026-04-11T15:00:00Z",
"end_time": "2026-04-11T16:00:00Z"
}'
Terminal window
curl -X DELETE https://api.chronary.ai/v1/calendars/cal_x1y2z3/events/evt_m1n2o3 \
-H "Authorization: Bearer chr_sk_your_key_here"

Add a recurrence_rule (an RFC 5545 RRULE subset, without the RRULE: prefix) to make an event repeat. A series is stored as a single event and counts once toward your monthly events quota.

Terminal window
curl -X POST https://api.chronary.ai/v1/calendars/cal_x1y2z3/events \
-H "Authorization: Bearer chr_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Weekly pipeline review",
"start_time": "2026-04-13T09:00:00Z",
"end_time": "2026-04-13T09:30:00Z",
"recurrence_rule": "FREQ=WEEKLY;BYDAY=MO;COUNT=12"
}'

Common rules:

GoalRule
Every day for two weeksFREQ=DAILY;COUNT=14
Mon/Wed/Fri standups until JuneFREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20260630
Every other weekFREQ=WEEKLY;INTERVAL=2;COUNT=10
Second Tuesday of each monthFREQ=MONTHLY;BYDAY=2TU;COUNT=6
Last day of each monthFREQ=MONTHLY;BYMONTHDAY=-1;COUNT=12

Three things to keep in mind:

  • start_time is the first occurrence and must match the rule (a BYDAY=MO rule needs a Monday start_time).
  • Expansion is UTC-only — “every Monday 09:00” means 09:00 UTC year-round; the series does not track daylight-saving changes.
  • Plan limits — Free allows 5 active series and every rule must be bounded (COUNT or UNTIL) ending within 90 days of the series start; Pro allows 250 series with unbounded rules.

Listing returns the series as one event by default. Pass expand=true with a time window to get per-occurrence instances:

Terminal window
curl "https://api.chronary.ai/v1/calendars/cal_x1y2z3/events?expand=true&start_after=2026-04-01T00:00:00Z&start_before=2026-04-30T23:59:59Z" \
-H "Authorization: Bearer chr_sk_your_key_here"

Instances share the master’s id and carry recurringEventId and originalStartTime so you can tell them apart. Availability queries automatically treat every occurrence as busy.

Cancel a single occurrence by passing its start time to DELETE — the rest of the series is untouched:

Terminal window
curl -X DELETE "https://api.chronary.ai/v1/calendars/cal_x1y2z3/events/evt_m1n2o3?occurrence_start=2026-04-20T09:00:00Z" \
-H "Authorization: Bearer chr_sk_your_key_here"
# 200 OK — returns the updated series master

A bare DELETE (no occurrence_start) cancels the whole series. To reschedule one occurrence, cancel it and create a standalone event at the new time.

PATCH always edits the full series — changing times, the rule, or setting recurrence_rule: null (which converts it back to a one-off) applies to every occurrence. See the Events API reference for the complete rule grammar and error codes.

All list endpoints return paginated results:

{
"data": [ ... ],
"total": 142,
"limit": 50,
"offset": 0
}

To fetch the next page, increment offset by limit:

GET /v1/calendars/cal_x1y2z3/events?limit=50&offset=50

The maximum limit is 200. The default is 50.

StatusCodeCause
400invalid_time_formatstart_time or end_time is not valid ISO 8601
400end_before_startend_time is earlier than start_time
403external_event_readonlyAttempted to edit/delete an event with source: "external_ical"
404calendar_not_foundThe calendar ID does not exist
404event_not_foundThe event ID does not exist on this calendar