# Tempi > Scheduling links for people and teams, like Calendly. A booking link looks like https://meettempi.com//, where the handle is a person or a team. Anyone — a human or an AI agent such as Claude or Codex — can find a free time and book it. Hosts connect Google Calendar, Outlook and Apple iCloud, so their busy times are respected and every booking lands in their calendar with an invitation to the guest. ## Connect - MCP server (Streamable HTTP): https://meettempi.com/mcp - Claude Code: `claude mcp add --transport http tempi https://meettempi.com/mcp` - Codex: add to ~/.codex/config.toml → `[mcp_servers.tempi]` with `url = "https://meettempi.com/mcp"` - OpenAPI 3.1: https://meettempi.com/api/openapi.json (plain REST works too) - No account is needed to book. Hosts add `Authorization: Bearer bk_...` to manage their own schedule. ## Book a meeting for someone (no auth) Every booking page can be read as Markdown: append `.md` (e.g. https://meettempi.com//.md) or send `Accept: text/markdown`. 1. `get_public_profile { handle }` — the person/team and their event types (duration, price, hosts). 2. `get_available_slots { handle, slug, timezone, date | from/to }` — open start times, grouped by the invitee's local day. 3. `create_booking { handle, slug, start, name, email, timezone, notes }`. - Free events: confirmed immediately; the invitee gets a calendar invitation by email. - Paid events: status is `pending_payment`; hand `paymentUrl` to the human, who must pay before `holdExpiresAt`. - Always keep `manageUrl` (contains `token`). It is the only way to view, reschedule or cancel. 4. Reschedule: `get_available_slots` with `bookingId` + `token`, then `reschedule_booking_as_invitee { id, token, start }`. 5. Cancel: `cancel_booking_as_invitee { id, token, reason }`. Paid bookings are refunded before `refundableUntil`. Times are ISO-8601. Always pass the invitee's IANA timezone and show times to the human in it. Errors are JSON `{ "error": { "code", "message" } }`. `slot_unavailable` (409) means: fetch slots again and pick another. - `get_public_profile` — GET /api/v1/public/{handle}: List the meeting types of a person or team - `get_available_slots` — GET /api/v1/public/{handle}/{slug}/slots: Find open times - `create_booking` — POST /api/v1/public/{handle}/{slug}/bookings: Book a meeting - `get_booking` — GET /api/v1/public/bookings/{id}: View a booking (invitee) - `reschedule_booking_as_invitee` — POST /api/v1/public/bookings/{id}/reschedule: Reschedule a booking (invitee) - `cancel_booking_as_invitee` — POST /api/v1/public/bookings/{id}/cancel: Cancel a booking (invitee) - `join_waitlist` — POST /api/v1/waitlist: Join the private beta waitlist ## Manage a host's schedule (API key) Create a key in Dashboard → Settings → API keys and send `Authorization: Bearer bk_...`. Event types belong to teams; every user has a personal team whose slug is their username. Team events are `round_robin` (one free host, load-balanced) or `collective` (all hosts). - `get_me` — GET /api/v1/me: Get the current account - `update_me` — PATCH /api/v1/me: Update profile - `get_availability` — GET /api/v1/availability: Get working hours - `set_availability` — POST /api/v1/availability: Replace weekly hours - `set_date_override` — POST /api/v1/availability/overrides: Set hours for a specific date - `delete_date_override` — DELETE /api/v1/availability/overrides/{date}: Remove a date override - `list_teams` — GET /api/v1/teams: List my teams - `get_team` — GET /api/v1/teams/{team}: Get a team - `create_team` — POST /api/v1/teams: Create a team - `update_team` — PATCH /api/v1/teams/{team}: Rename a team - `delete_team` — DELETE /api/v1/teams/{team}: Delete a team - `add_team_member` — POST /api/v1/teams/{team}/members: Add a team member - `update_team_member` — PATCH /api/v1/teams/{team}/members/{userId}: Change a member's role - `remove_team_member` — DELETE /api/v1/teams/{team}/members/{member}: Remove a member or invite - `connect_payments` — POST /api/v1/teams/{team}/payments/connect: Connect Stripe to take payments - `refresh_payment_status` — POST /api/v1/teams/{team}/payments/refresh: Refresh Stripe status - `list_event_types` — GET /api/v1/event-types: List event types - `create_event_type` — POST /api/v1/event-types: Create an event type - `update_event_type` — PATCH /api/v1/event-types/{id}: Update an event type - `delete_event_type` — DELETE /api/v1/event-types/{id}: Delete an event type - `list_bookings` — GET /api/v1/bookings: List bookings - `reschedule_booking` — POST /api/v1/bookings/{id}/reschedule: Reschedule a booking (host) - `cancel_booking` — POST /api/v1/bookings/{id}/cancel: Cancel a booking (host) - `list_calendar_connections` — GET /api/v1/calendars: List connected calendars - `connect_apple_calendar` — POST /api/v1/calendars/apple: Connect Apple iCloud Calendar - `set_booking_calendar` — POST /api/v1/calendars/{id}/booking: Choose the calendar that receives bookings - `delete_calendar_connection` — DELETE /api/v1/calendars/{id}: Disconnect a calendar - `list_waitlist` — GET /api/v1/admin/waitlist: List the waitlist (admin) - `decide_waitlist` — POST /api/v1/admin/waitlist/decide: Approve or reject waitlist requests (admin)