# ctime > ctime is a small meeting scheduler. An organiser offers up to 40 time slots. Up to 20 participants mark the slots they can attend. The site shows where the answers overlap. Every schedule deletes itself 90 days after activation. An AI agent can create a schedule for a person, and answer a schedule for a person. A schedule link looks like `https://ctime.cc/s?c=CODE`. `CODE` is 10 characters (a-z, 2-9). The page needs JavaScript to answer. Its HTML also holds the schedule as plain text, with times in UTC. To answer, use the API below. Submit answers only for the person you act for, and only with times that person agreed to. ## Create a schedule Ask the person for the event name, the length, their time zone and the times to offer. ctime then emails the organiser. The schedule exists only after the organiser opens that email and selects Manage schedule within 1 hour. Tell the person to do this. ### With a link Any agent can do this, also one that cannot send HTTP requests. Give the person this link: `https://ctime.cc/#title=Team%20sync&duration=60&tz=Europe/Budapest&slots=2026-11-20T10:00,2026-11-21T10:00&email=EMAIL` - `title`: URL-encoded, 80 characters at most. - `duration`: 15, 30, 60, 90 or 120 minutes. Without it, 60. - `tz`: the IANA time zone of the organiser. - `slots`: start times in `tz`, as the person said them, separated by commas. Do not convert them to UTC. The page converts them with current time zone rules. UTC times that end in `Z` also work. - `email`: optional. The organiser's email. URL-encoded, so `+` becomes `%2B`. The page keeps up to 40 times in the next 90 days. Start times must be on the hour for 60 and 120-minute events, on the hour or half hour for 30 and 90-minute events, and on a quarter hour for 15-minute events. The page says how many times from the link it did not keep. Opening the link fills in the form. It does not create the schedule. The person checks the form and selects Create. ### With the API `POST https://ctime.cc/api` with a JSON body: ```json { "a": "create", "title": "Team sync", "email": "ana@example.com", "duration": 60, "tz": "Europe/Budapest", "slots": [1795165200000, 1795251600000] } ``` - `title`: required, 80 characters at most. - `email`: required. The email of the organiser you act for. ctime sends the Manage schedule link to this address. - `duration`: required. 15, 30, 60, 90 or 120. - `tz`: optional IANA time zone of the organiser. Send it. - `slots`: required. 1 to 40 different start times as UTC epoch milliseconds, on a quarter hour, in the next 90 days. - Leave out the `hp` field. A request with `hp` gets `{ "ok": true }` and creates nothing. The response is `{ "ok": true }`. The email has the subject "Your ctime schedule is ready". ## Read a schedule - `GET https://ctime.cc/api?c=CODE` returns JSON. - `GET https://ctime.cc/api?c=CODE&format=text` returns the same schedule as plain text, with times in UTC. JSON fields: - `title`: name of the event. - `duration`: length of the event in minutes (15, 30, 60, 90 or 120). - `slots`: start times offered, as UTC epoch milliseconds. Each slot lasts `duration` minutes. - `tz`: the organiser's IANA time zone, or an empty string. - `expiresAt`: when the schedule deletes itself, as UTC epoch milliseconds. - `final`: present only after the organiser set the final time. It is one value from `slots`. From then on the schedule is locked: no new answers and no edits. - `participants`: list of `{ id, name, tz, yes }`. `yes` is the list of slots that person can attend. `tz` is an IANA time zone or an empty string. A 404 with `{"error":"not_found"}` means the schedule does not exist, is not activated yet, or has expired. ## Add answers `POST https://ctime.cc/api` with a JSON body: ```json { "a": "vote", "c": "CODE", "name": "Ana", "tz": "America/Vancouver", "yes": [1795165200000, 1795251600000] } ``` - `name`: required, 40 characters at most. - `yes`: required. Values from `slots` that the person can attend. An empty list means "none". Values that are not in `slots` are ignored. - `tz`: optional IANA time zone of the person. Send it. The site uses it to rank times that are kind to everyone. - `email`: optional. Only the organiser sees it. ctime emails the address once with a confirmation link. Tell the person to open it, so the organiser can email them when they add new times. The response is `{ "id": "...", "token": "..." }`. Keep both. They are the only way to edit these answers later. With a new email, the response also has `confirm`: `sent`, `again` (this address already got a confirmation email for this schedule) or `limit` (ctime sent no email today). ## Answer without sending requests If you cannot send HTTP requests, give the person a link with the answers filled in: `https://ctime.cc/s?c=CODE#name=NAME&tz=America/Vancouver&yes=2026-11-17T10:00,2026-11-18T10:00&email=EMAIL` - `name`: URL-encoded, 40 characters at most. - `tz`: the IANA time zone of the person. - `yes`: start times in `tz`, as the person said them, separated by commas. Do not convert them to UTC. The page converts them with current time zone rules. UTC times that end in `Z` also work. Times not in `slots` are ignored. - `email`: optional. Add it only when the person gives an email. URL-encoded, so `+` becomes `%2B`. Only the organiser sees it. ctime emails the address once with a confirmation link. Opening the link saves the answer as a new participant. It does not save by itself when the browser already has an answer for this schedule, or when a participant with that name exists. Then the page asks the person to select Save. ## Edit answers Send the same request with `id` and `token` added. The new `name`, `tz`, `email` and `yes` replace the old values. ## Errors Errors are JSON: `{ "error": "CODE" }`. - `invalid` (400): a field is missing or malformed. - `forbidden` (403): wrong `token`. - `not_found` (404): no such schedule. - `no_participant` (404): the organiser removed this participant. Send the request without `id` and `token` to add it again. - `participants_full` (409): the schedule already has 20 participants. - `locked` (409): the organiser set the final time. Answers are closed. - `email_full` (409): this email already has 2 active schedules. The organiser must delete one first. - `full` (409): ctime has no room for new schedules now. Try later. - `mail` (502): the email did not send. Try again. - `rate` (429): too many requests. The limits are 60 answer requests and 5 create requests per hour per IP address. ## What needs a person - Activating a new schedule. The organiser must open the email and select its Manage schedule button within 1 hour. There is no way around this step. - Adding times, setting or clearing the final time, deleting a schedule and removing participants. These need the organiser's private link. ## Limits - 2 active schedules per organiser email. - 40 slots and 20 participants per schedule. - Request bodies up to 20 kB.