Skip to main content

AI schedule format

This page defines the JSON format that Event Planner imports with Create with AI. It's written for you and for the AI assistant you ask to plan a schedule. The prompt in Event Planner links here.

To use it, follow Create with AI. In short: copy the prompt from Event Planner, describe your event to the assistant, and paste its JSON back into Event Planner.

Prompt​

Event Planner's Copy prompt button gives you this text. You can also copy it from here:

Read this Event Planner schedule reference: https://docs.apportunity.xyz/event-planner/event-planner-ai-prompt
It defines a JSON schema called `EventsTemplate`. If you can't open the link, use this schema:

interface EventsTemplate {
id: string; // kebab-case slug
title: string;
description: string;
category: string;
events: {
dayNumber: number; // 0-based day offset, NOT an absolute date
timeStart: string; // "HH:mm", 24h
timeEnd: string; // "HH:mm", 24h, after timeStart, same day β€” never crosses midnight
title: string;
description: string;
backgroundColor: string; // hex, e.g. "#4C9AFF" β€” reuse a few colors, don't make every event unique
}[];
dayHeaders?: { dayNumber: number; text: string }[]; // one per day, for multi-day schedules
}

Ask me clarifying questions about the event first (purpose, days, timing). Then respond with ONLY a single valid JSON object matching this schema β€” no prose, just the json code block. Double-check it parses and every timeEnd is after timeStart before answering.

My event: [describe what you want here]

How the import works​

  1. The assistant returns one JSON object. It describes every event relative to a "day 0", not with real dates.
  2. In Event Planner you pick a start date. Day 0 becomes that date, day 1 the day after, and so on.
  3. Event Planner checks every event. If any has a problem, it lists the problems and adds nothing.
  4. If all events are valid, it adds them, with the day headers, to the calendar. Events already in the calendar stay.

Because days are relative, the same schedule works for any start date.

Schedule format​

interface EventsTemplate {
id: string;
title: string;
description: string;
category: string;
events: TemplateEvent[];
dayHeaders?: TemplateDayHeader[];
}

interface TemplateEvent {
dayNumber: number; // 0-based day offset
timeStart: string; // "HH:mm", 24-hour
timeEnd: string; // "HH:mm", 24-hour, later than timeStart
title: string;
description: string;
backgroundColor: string; // hex color, for example "#4C9AFF"
}

interface TemplateDayHeader {
dayNumber: number;
text: string;
}

Top-level fields​

FieldTypeRequiredNotes
eventsTemplateEvent[]Yes1 to 500 events.
dayHeadersTemplateDayHeader[]NoOne label per day. Recommended for schedules longer than one day.
id, title, description, categorystringNoDescribe the schedule for the reader. Event Planner doesn't import them.

Event Planner ignores any other field. A schedule can't change the calendar's settings.

events[] fields​

FieldTypeRequiredNotes
dayNumbernumberYesA whole number from 0 to 365. 0 is the start date.
timeStartstringYes24-hour HH:mm, for example "09:30". "9:30" is accepted too.
timeEndstringYesSame format, and later than timeStart on the same day.
titlestringYesShown on the event. Cut to 128 characters.
descriptionstringNoShown when the event is opened. Cut to 1,024 characters.
backgroundColorstringNoA hex color: #RGB or #RRGGBB. Anything else gets the default blue.

Imported events always have a start and end time. To make an event all-day, edit it after the import.

dayHeaders[] fields​

FieldTypeRequiredNotes
dayNumbernumberYesThe same 0-based offset as in events[], from 0 to 365.
textstringYesA short label, for example "Day 1: Foundations". Cut to 128 characters. A header with empty text is skipped.

Rules for good schedules​

  1. Return a single JSON object only, in a json code block. Standard JSON: no comments, no trailing commas.
  2. Use dayNumber for the day. Never write real dates.
  3. Keep each event within one day. For something that lasts several days, add one event per day.
  4. Don't cross midnight. An event from "22:00" to "00:30" is invalid: split it into two events on consecutive days.
  5. Make timeEnd later than timeStart. Back-to-back events share a boundary time instead of overlapping.
  6. Add one day header per day for schedules longer than one day.
  7. Reuse a few colors to group similar events, such as breaks, sessions and workshops. See Choosing colors.
  8. Keep titles short and put details in the description.
  9. Check that the JSON parses and every event has timeStart and timeEnd before answering.

Choosing colors​

Pick a small palette and reuse it for similar events.

ColorHexGood for
Gray#6B778CBreaks, meals, logistics
Blue#4C9AFFCore sessions, main agenda items
Green#36B37EWorkshops, hands-on activities
Purple#998DD9Discussions, reflection, planning
Orange#FFAB00Optional and social events
Red#FF5630Critical or time-sensitive items

Examples​

A one-day schedule​

{
"id": "sprint-retro-half-day",
"title": "Sprint retrospective half-day",
"description": "A half-day session to review the sprint, celebrate wins and plan improvements.",
"category": "team-building",
"events": [
{ "dayNumber": 0, "timeStart": "09:00", "timeEnd": "09:15", "title": "Welcome and coffee", "description": "Informal start while everyone settles in.", "backgroundColor": "#6B778C" },
{ "dayNumber": 0, "timeStart": "09:15", "timeEnd": "10:30", "title": "Sprint review", "description": "Walk through completed work and demo key deliverables.", "backgroundColor": "#4C9AFF" },
{ "dayNumber": 0, "timeStart": "10:30", "timeEnd": "10:45", "title": "Break", "description": "", "backgroundColor": "#6B778C" },
{ "dayNumber": 0, "timeStart": "10:45", "timeEnd": "12:15", "title": "Retrospective", "description": "What went well, what didn't, and what to change next sprint.", "backgroundColor": "#36B37E" },
{ "dayNumber": 0, "timeStart": "12:15", "timeEnd": "13:00", "title": "Action planning", "description": "Agree on improvements for the next sprint.", "backgroundColor": "#998DD9" }
]
}

A two-day schedule with day headers​

{
"id": "new-manager-bootcamp",
"title": "New manager bootcamp",
"description": "A 2-day program for newly promoted managers: communication, delegation and feedback.",
"category": "training",
"dayHeaders": [
{ "dayNumber": 0, "text": "Day 1: Communication and delegation" },
{ "dayNumber": 1, "text": "Day 2: Feedback and performance" }
],
"events": [
{ "dayNumber": 0, "timeStart": "09:00", "timeEnd": "09:30", "title": "Welcome and introductions", "description": "", "backgroundColor": "#6B778C" },
{ "dayNumber": 0, "timeStart": "09:30", "timeEnd": "12:00", "title": "Communication for new managers", "description": "Active listening, setting expectations and running 1:1s.", "backgroundColor": "#4C9AFF" },
{ "dayNumber": 0, "timeStart": "12:00", "timeEnd": "13:00", "title": "Lunch", "description": "", "backgroundColor": "#6B778C" },
{ "dayNumber": 0, "timeStart": "13:00", "timeEnd": "17:00", "title": "Delegation workshop", "description": "Practice handing over tasks with a structured handoff.", "backgroundColor": "#36B37E" },
{ "dayNumber": 1, "timeStart": "09:00", "timeEnd": "09:30", "title": "Day 2 kickoff", "description": "Recap of day 1.", "backgroundColor": "#6B778C" },
{ "dayNumber": 1, "timeStart": "09:30", "timeEnd": "12:00", "title": "Giving and receiving feedback", "description": "Frameworks for constructive feedback conversations.", "backgroundColor": "#4C9AFF" },
{ "dayNumber": 1, "timeStart": "12:00", "timeEnd": "13:00", "title": "Lunch", "description": "", "backgroundColor": "#6B778C" },
{ "dayNumber": 1, "timeStart": "13:00", "timeEnd": "16:00", "title": "Performance conversations role-play", "description": "Practice common performance review scenarios.", "backgroundColor": "#36B37E" },
{ "dayNumber": 1, "timeStart": "16:00", "timeEnd": "17:00", "title": "Personal action plan", "description": "Each participant commits to three changes for their first 30 days.", "backgroundColor": "#998DD9" }
]
}

Prompting tips​

Some AI assistants don't open links, or answer with prose instead of JSON. If yours does:

  • Check that it read the format. Ask it to describe the EventsTemplate schema. If it can't, paste this page's Schedule format and Rules into the chat.
  • Ask for JSON in your own words, for example: Respond with only one JSON object in a json code block, matching the EventsTemplate schema. No text before or after it.
  • If it adds commentary anyway, reply: Output only the JSON object, nothing else.
  • If it uses real dates instead of dayNumber, point it to the rules and ask it to fix the output.
  • If Event Planner lists errors, paste them into the chat and ask the assistant to correct those events.