build
The scheduling API your AI agent should have been using all along.
REST, MCP, SDKs in TypeScript and Python, and a CLI. Idempotent, signed webhooks, OpenAPI spec — built to feel like Stripe for time.
endpoints
REST API at a glance.
Discovery
GET/v1/agent-manifestcapability discovery for AI clients
GET/v1/accountcurrent account
Policies
GET/v1/policieslist policies
POST/v1/policiescreate a policy
POST/v1/policies/:id/activatemake this the active policy
Event types
GET/v1/event-typeslist event types
POST/v1/event-typescreate one
PATCH/v1/event-types/:slugupdate
DELETE/v1/event-types/:slugdelete
Availability
GET/v1/availabilitycomputed slots — pass event_type, from, to, audience
Booking links
POST/v1/booking-linkscreate scoped, expiring, audience-aware link
GET/v1/booking-links/:idfetch one
DELETE/v1/booking-links/:idrevoke
Bookings
GET/v1/bookingslist
POST/v1/bookingscreate directly (skip the link)
POST/v1/bookings/:id/reschedulereschedule
POST/v1/bookings/:id/cancelcancel
GET/v1/bookings/:id/icsdownload .ics
Agent
POST/v1/agent/messagesnatural-language command → actions taken
Webhooks
POST/v1/webhookssubscribe
DELETE/v1/webhooks/:idunsubscribe
sdks
Pick your language.
TypeScriptv0.1
npm install agentcal
import { AgentCal } from "agentcal";
const cal = new AgentCal();
await cal.bookingLinks.create({ audience: "investor" });Pythonv0.1
pip install agentcal
from agentcal import AgentCal cal = AgentCal() cal.booking_links.create(audience="investor")
CLIv0.1
npm i -g @agentcal/cli
agentcal links create --audience investor
MCP serverv0.1
npx -y @agentcal/mcp
# add to Claude Desktop config.
{ "mcpServers": { "agentcal": { "url": "https://mcp.agentcal.co/sse" } } }mcp tools
What your agent gets.
Connect AgentCal as an MCP server in Claude Desktop, your custom agent, or any MCP-compatible client. Fourteen typed tools. Zod-validated I/O. Streaming subscriptions.
list_event_typeswhat is bookableget_availabilitycompute slots given range + audiencelist_booking_linksactive links the agent or human createdcreate_booking_linkscoped, expiring, audience-awareupdate_booking_linkextend, restrict, reviserevoke_booking_linkkill it before expirycreate_bookingskip the link, just bookreschedule_bookingwith conflict detectioncancel_bookingwith reason; emails attendeeupdate_policynatural language: 'protect mornings'set_active_policyswitch modes (Investor, Travel…)explainwhy is this slot taken? trace the rule chainundoreverse any agent write within audit windowsubscribeSSE stream of bookings, links, policy changesuse cases
Built for autonomous agents.
△
Sales agents
Auto-generate investor links after a discovery call. Reschedule when follow-ups land in the inbox.
◇
Recruiting agents
Send candidate-specific links with the right hiring panel and audience-aware policies.
◔
Executive assistants
Conversational policy editing. 'Protect mornings. Only investors on Friday.' Done.
✦
Customer support
Emergency support links that expire in 24h. High-priority audiences with after-hours access.
quickstart
First booking in 5 minutes.
- 01Get an API keySign up, run agentcal init in your shell. We write .env for you.
- 02List eventsGET /v1/event-types returns your default 30-min intro call.
- 03Check availabilityGET /v1/availability?event_type=intro-call&from=…&to=…
- 04Book a slotPOST /v1/bookings with start, attendee.email, attendee.name.
- 05ConfirmResponse gives you meeting_url + ics_url. Send to your booker. Done.
webhooks
Eight events. HMAC-signed. Retried with backoff.
● booking.confirmed
● booking.cancelled
● booking.rescheduled
● booking_link.created
● booking_link.expired
● booking_link.exhausted
● policy.changed
● agent.action_taken