API Reference
The LinkTime REST API gives you programmatic access to bookings, contacts, event types, availability, conversations, and calls. 16 endpoints, Bearer token auth, JSON responses.
Getting Started
API keys require a Pro or Business plan.
- Upgrade to Pro or Business
- Go to Settings → API Keys in your dashboard
- Click “Create API Key”
- Copy the key (shown once — cannot be retrieved later)
- Test it:
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://linktime.io/api/v1/me
Authentication
All /api/v1/* endpoints require an API key sent as a Bearer token in the Authorization header.
Authorization: Bearer lt_live_...
API keys start with lt_live_. Each key is scoped to the user who created it.
User
/api/v1/meGet the authenticated user's profile information.
Response
{ "id": "...", "email": "...", "name": "...", "username": "...", "plan": "PRO", "effectivePlan": "PRO" }Bookings
/api/v1/bookingsList bookings with optional filters.
Query Parameters
page (default 1), limit (default 20, max 100), status (CONFIRMED|CANCELLED|all), from (ISO date), to (ISO date)
Response
{ "data": [...], "pagination": { "page": 1, "limit": 20, "total": 156, "totalPages": 8 } }/api/v1/bookings/:idGet full booking detail including event type, contact, and email logs.
Response
{ "id": "...", "startTime": "...", "endTime": "...", "status": "CONFIRMED", "inviteeName": "...", "eventType": {...}, "contact": {...} }/api/v1/bookingsCreate a booking programmatically. Validates slot availability, syncs calendar, fires all side effects.
Request Body
{ "eventTypeSlug": "30-min-call", "startTime": "2026-03-01T14:00:00.000Z", "inviteeName": "Sarah Chen", "inviteeEmail": "[email protected]", "inviteeTimezone": "America/New_York", "notes": "Optional" }Response
{ "bookingId": "clx1abc..." }/api/v1/bookings/:id/cancelCancel a booking. Removes calendar events, updates CRM, sends notifications, fires webhooks.
Request Body
{ "reason": "Schedule conflict" }Response
{ "success": true }/api/v1/bookings/:id/rescheduleReschedule a booking to a new time. Updates all calendars, CRM records, sends reschedule email.
Request Body
{ "newStartTime": "2026-03-02T10:30:00.000Z", "reason": "Conflict" }Response
{ "success": true }Contacts
/api/v1/contactsList and search contacts with pagination.
Query Parameters
search (name/email/company), page, limit
Response
{ "data": [{ "id": "...", "name": "...", "email": "...", "meetingCount": 3, ... }], "pagination": {...} }/api/v1/contactsCreate a new contact. Fires contact.created webhook.
Request Body
{ "name": "Jane Doe", "email": "[email protected]", "phone": "+1...", "company": "Acme", "notes": "..." }Response
{ "id": "...", "name": "Jane Doe", "email": "[email protected]", ... }/api/v1/contacts/:idGet contact detail with upcoming and past meetings.
Response
{ "id": "...", "name": "...", "upcomingMeetings": [...], "pastMeetings": [...], "meetingCount": 5 }/api/v1/contacts/:idUpdate a contact. All fields optional. Email uniqueness is enforced.
Request Body
{ "name": "Jane Smith", "company": "NewCo" }Response
{ "id": "...", "name": "Jane Smith", ... }/api/v1/contacts/:idDelete a contact permanently.
Response
{ "success": true }Event Types
/api/v1/event-typesList all active event types.
Response
{ "data": [{ "id": "...", "name": "30 Minute Meeting", "slug": "30-min", "durationMinutes": 30, ... }], "pagination": {...} }/api/v1/event-types/:idGet full event type detail including scheduling configuration.
Response
{ "id": "...", "name": "...", "slug": "...", "durationMinutes": 30, "bufferBefore": 5, "bufferAfter": 10, ... }Availability
/api/v1/availability/:slugGet available time slots for an event type. Accounts for calendar events, buffer times, and scheduling rules.
Query Parameters
timezone (required), startDate (ISO, default: today), endDate (ISO, default: +7 days)
Response
{ "data": [{ "date": "2026-02-15", "time": "10:00", "startTime": "...", "endTime": "..." }], "eventType": {...}, "timezone": "..." }Conversations
/api/v1/conversationsList SMS and WhatsApp message threads with up to 50 messages per conversation.
Query Parameters
phone (E.164), from (ISO date), to (ISO date), limit (max 50), page
Response
{ "data": [{ "id": "...", "contactPhone": "+1...", "channel": "sms", "messages": [{ "content": "...", "direction": "inbound", "timestamp": "..." }] }], "pagination": {...} }Calls
/api/v1/callsList voice call logs with AI agent name, duration, and outcome.
Query Parameters
status (COMPLETED|FAILED|NO_ANSWER|all), from (ISO date), to (ISO date), limit (max 50), page
Response
{ "data": [{ "id": "...", "direction": "inbound", "callerPhone": "+1...", "durationSeconds": 142, "status": "completed", "agentName": "Sales Agent", "startedAt": "..." }], "pagination": {...} }SCIM 2.0 Provisioning
SCIM endpoints use a separate bearer token (not your API key). Generate a SCIM token from Organization → SCIM in your dashboard. Requires Business plan.
Authorization: Bearer lt_scim_...
Base URL: https://linktime.io/api/scim/v2
/api/scim/v2/ServiceProviderConfigSCIM capabilities discovery (required by Azure AD).
/api/scim/v2/SchemasUser schema definition (attributes, types, mutability).
/api/scim/v2/UsersList users in your organization. Supports SCIM filtering and pagination.
Query Parameters
filter (e.g. userName eq "[email protected]"), startIndex (default 1), count (default 100)
/api/scim/v2/UsersProvision a new user. Creates or links existing user by email match.
/api/scim/v2/Users/:idGet a specific user by ID.
/api/scim/v2/Users/:idFull replace of user attributes. Missing optional fields are nulled (Azure AD requirement).
/api/scim/v2/Users/:idPartial update. Supports standard SCIM path-based ops and Azure AD bulk value format.
/api/scim/v2/Users/:idDeprovision user. Cancels upcoming bookings, removes org membership, preserves account.
Supported filter operators: eq, co, sw on userName, externalId, emails.value, displayName. See the full SCIM setup guide.
Public Booking Endpoint
This endpoint does not require an API key — it's the same endpoint used by the booking page and embed widget.
/api/bookingsCreate a new booking for an available time slot. Triggers calendar event creation, confirmation emails, and webhooks.
Request Body
{ "eventTypeId": "...", "inviteeName": "Jane", "inviteeEmail": "[email protected]", "inviteeTimezone": "America/New_York", "startTime": "2026-02-15T15:00:00.000Z" }Pagination
List endpoints return paginated results:
{
"data": [...],
"pagination": {
"page": 1,
"limit": 20,
"total": 156,
"totalPages": 8
}
}page— defaults to 1, minimum 1limit— defaults to 20, maximum 100
Errors
All errors return a JSON object with an error field:
{
"error": "Booking not found"
}
// Validation errors include field details:
{
"error": "Invalid request data",
"details": { "email": "Invalid email format" }
}| Status | Meaning |
|---|---|
| 400 | Bad request (invalid params or body) |
| 401 | Missing, invalid, expired, or inactive API key |
| 404 | Resource not found or not owned by you |
| 409 | Conflict (e.g. duplicate contact email) |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Rate Limits
- API key endpoints: 60 requests/minute per API key
- Pre-auth brute force protection: 5 requests/minute per IP (before key validation)
- Public booking endpoint: 10 requests/minute per IP
When rate limited, the API returns 429 with a Retry-After header.
Webhook Events
Subscribe to events via webhooks. Configure them in your dashboard — not through the API.
| Event | Description |
|---|---|
booking.created | A new booking has been confirmed |
booking.cancelled | A booking has been cancelled |
booking.rescheduled | A booking has been moved to a new time |
payment.received | Payment completed for a paid booking |
contact.created | A new contact was added |
Need help?
Our support team is here to help with API questions.
Contact Support →