events/create-event creates an event the way the calendar creates one: through its own data layer, so the dates land in post meta and in the calendar’s occurrence tables at the same time.
It needs a title. Everything else is optional, and it defaults to draft.
At a glance
| Ability | events/create-event |
| Toolset | The Events Calendar — toolset/events-calendar |
| Group | The Events Calendar › Events |
| Requires | The Events Calendar, active on the site |
| Capability | manage_options |
| Safety | Writes data |
| Repeatable | Not idempotent — each call changes the row set, so re-running is not a no-op |
| Ships in | AcrossAI Abilities Manager 0.0.34 and later |
Why it does not just insert a post
An event is not a post with a start date on it. The calendar keeps local times, UTC times, a timezone and an abbreviation in meta, and mirrors the occurrence into its own tables so that calendar views can be queried efficiently. Insert the post and set the meta yourself and you get an event that exists but never appears in a month view, because the table row was never written.
So this goes through tribe_events(), the calendar’s own creation path. Same code the admin screen runs, same rows written, same hooks fired for anything else on the site that listens for a new event.
Venue and organizer IDs are checked before the write, not after. Hand the calendar an ID that is not a venue and it drops the link silently — the event saves, looks fine, and has no venue. Checking first turns that into a refusal naming the bad ID.
The end date gets the same treatment from the other direction. If the end precedes the start the calendar discards the whole date block without complaint, so the dates are read back after the write and reported as rejected if that happened.
Input
| Name | Type | Required | What it is |
|---|---|---|---|
title | string | Yes | The event title. |
description | string | No | The event body content. |
status | string | No — defaults to draft | Post status: draft, publish, pending or private. |
start_date | string | No | Local start, such as 2026-11-02 09:00:00. Read in the event’s own timezone, not the site’s. |
end_date | string | No | Local end. Must not precede the start — the calendar discards the entire date block if it does, and this ability reports that rather than claiming success. |
all_day | boolean | No | Whether the event runs all day. |
timezone | string | No | Olson timezone, such as America/New_York. The UTC times and the timezone abbreviation are both derived from this. |
venue | integer | No | Venue ID. Refused if the ID is not a venue, because the calendar would drop the link without saying so. |
organizers | array | No | Organizer IDs. An empty array clears them. |
cost | string | No | Cost as displayed, such as 25 or Free. |
url | string | No | External event website. |
featured | boolean | No | Whether the event is featured. |
What comes back
| Name | Type | What it is |
|---|---|---|
event | object | The created event as events/get-event would return it, including the dates as they were actually stored. |
success | boolean | Whether the call completed. |
message | string | A one-line summary of what happened, suitable for showing a human. |
error_code | string | Present only on failure — a stable machine-readable reason, such as a missing field, a wrong field type or an unmet confirmation. |
Example
Ask your assistant:
Create a draft event called “Winter Product Workshop” on 2 November from 9am to 5pm at venue 204.
It resolves to one call:
{
"ability": "events/create-event",
"parameters": {
"title": "Winter Product Workshop",
"start_date": "2026-11-02 09:00:00",
"end_date": "2026-11-02 17:00:00",
"timezone": "Europe/London",
"venue": 204,
"cost": "Free"
}
}Worth knowing
- Drafts by default. An event created by an assistant should be reviewed before it appears on a public calendar.
- Without a timezone the site default is used. Supply one explicitly whenever the event is somewhere the site is not.
- Not idempotent. Run it twice and you have two events — check with
events/list-eventsbefore retrying a call whose result you did not see. - Organizers is a list. One organizer is a list of one.
Related abilities
- List Venues — get the venue ID first
- List Organizers — get the organizer IDs first
- Update Event — change it afterwards
Get the plugins:
AcrossAI Abilities Manager · AcrossAI MCP Manager
Browse the rest: Every ability, by category