Event program schedule generator
Turn a list of session names, start times, and durations into a clean event program without calculating the clock by hand.
Run — free
The event program schedule generator orders every session, computes its exact end time, marks sessions that continue past midnight, and reports scheduling overlaps with their duration. It is useful for conferences, workshops, community events, training days, and any agenda where one timing mistake can confuse speakers, staff, or attendees.
Enter a dependable source schedule
Start with the event name and one record for every session you intend to publish. Each record needs a clear session name, a start time in 24-hour HH:MM format, and a positive whole-number duration in minutes. Using a 24-hour clock removes the ambiguity of morning and evening labels, while durations in minutes make short breaks and long workshops equally straightforward. The generator sorts the records by start time, so the input does not have to be arranged chronologically. Still, use distinct, reader-friendly names because those names appear in the overlap report and help organizers locate a conflict quickly. Treat the submitted list as the authoritative plan for one event day. If a session begins late at night and its duration passes midnight, its end time wraps to the next clock day and the returned day offset makes that transition explicit. Empty schedules, malformed times, missing names, and non-positive durations are rejected instead of producing a program that merely looks plausible.
Read calculated end times and overlap warnings
The result contains the event name, the number of sessions, a chronological sessions list, a top-level overlap flag, and a detailed overlaps list. Every scheduled session repeats its start time and duration and adds the calculated end time. A day offset of zero means it ends on the same day; a value of one means it ends after midnight on the following day. Two sessions overlap whenever the later one starts before the earlier one ends. Sessions that touch at an exact boundary, such as one ending at 10:30 and another starting at 10:30, are not conflicts. When a conflict exists, the overlap entry names both sessions and reports the shared minutes, which makes it easier to decide whether to shorten a talk, move a start, or place sessions in different rooms. The generator checks all relevant pairs, not only neighboring rows, so a long workshop that spans several shorter sessions produces every applicable warning.
Use the program in an event workflow
Generate the program whenever session timing changes, then use the structured response as the checked source for a website, attendee email, printed agenda, signage, or speaker briefing. In a manual workflow, paste the current plan into the browser runner and review the overlap flag before publication. In an automated workflow, call the API for $0.002 when a planner saves an agenda, block publication if has_overlaps is true, and map the calculated session fields into your document template. Because the algorithm uses no network requests, current date, random values, or hidden calendar assumptions, the same input always produces the same output. That predictability is especially helpful in approval processes: a saved response can be compared with a later revision to show exactly which times changed. The tool deliberately does not choose rooms, insert travel buffers, infer time zones, or repair conflicts. Those are planning decisions. It provides precise clock arithmetic and a complete conflict report so the organizer can make those decisions with reliable information.
What you can do with it
Conference agenda review
Calculate talk end times and catch speaker or room conflicts before publishing the attendee program.
Workshop day planning
Combine lessons, exercises, meals, and breaks into a chronological schedule with exact boundaries.
Automated program publishing
Validate an agenda in an application and feed the structured result into web, email, or print templates.
FAQ
What does it cost?
The API costs $0.002 per request, and the browser version can run locally on this page.
Which time format should I use?
Use a 24-hour time in HH:MM format, such as 09:30 or 17:05.
What happens when a session crosses midnight?
The end time wraps to the next day and day_offset indicates how many days beyond the starting day it ends.
Are back-to-back sessions considered overlapping?
No. If one session starts at the exact minute another ends, both can remain in the schedule without an overlap warning.
Can the generator fix an overlap automatically?
No. It reports each conflicting pair and the overlap duration, leaving room, speaker, and timing decisions to the organizer.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/doc/event-program-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"event_name":"Product Leadership Summit","sessions":[{"name":"Opening keynote","start_time":"09:00","duration_minutes":60},{"name":"Strategy panel","start_time":"09:45","duration_minutes":45},{"name":"Networking break","start_time":"10:30","duration_minutes":20}]}'const res = await fetch("https://api.kit.forhosting.com/doc/event-program-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"event_name": "Product Leadership Summit",
"sessions": [
{
"name": "Opening keynote",
"start_time": "09:00",
"duration_minutes": 60
},
{
"name": "Strategy panel",
"start_time": "09:45",
"duration_minutes": 45
},
{
"name": "Networking break",
"start_time": "10:30",
"duration_minutes": 20
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/event-program-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"event_name": "Product Leadership Summit",
"sessions": [
{
"name": "Opening keynote",
"start_time": "09:00",
"duration_minutes": 60
},
{
"name": "Strategy panel",
"start_time": "09:45",
"duration_minutes": 45
},
{
"name": "Networking break",
"start_time": "10:30",
"duration_minutes": 20
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/event-program-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"event_name":"Product Leadership Summit","sessions":[{"name":"Opening keynote","start_time":"09:00","duration_minutes":60},{"name":"Strategy panel","start_time":"09:45","duration_minutes":45},{"name":"Networking break","start_time":"10:30","duration_minutes":20}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"event_name":"Product Leadership Summit","sessions":[{"name":"Opening keynote","start_time":"09:00","duration_minutes":60},{"name":"Strategy panel","start_time":"09:45","duration_minutes":45},{"name":"Networking break","start_time":"10:30","duration_minutes":20}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/event-program-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"event_name": "Product Leadership Summit",
"sessions": [
{
"name": "Opening keynote",
"start_time": "09:00",
"duration_minutes": 60
},
{
"name": "Strategy panel",
"start_time": "09:45",
"duration_minutes": 45
},
{
"name": "Networking break",
"start_time": "10:30",
"duration_minutes": 20
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.event_program_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
max_pages | 200 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |