API Reference

The LinkTime REST API gives you programmatic access to bookings, contacts, event types, and availability. 12 endpoints, Bearer token auth, JSON responses.

Getting Started

API keys require a Pro or Business plan.

  1. Upgrade to Pro or Business
  2. Go to Settings → API Keys in your dashboard
  3. Click “Create API Key”
  4. Copy the key (shown once — cannot be retrieved later)
  5. 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

GET/api/v1/me

Get the authenticated user's profile information.

Response

{ "id": "...", "email": "...", "name": "...", "username": "...", "plan": "PRO", "effectivePlan": "PRO" }

Bookings

GET/api/v1/bookings

List 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 } }
GET/api/v1/bookings/:id

Get full booking detail including event type, contact, and email logs.

Response

{ "id": "...", "startTime": "...", "endTime": "...", "status": "CONFIRMED", "inviteeName": "...", "eventType": {...}, "contact": {...} }
POST/api/v1/bookings/:id/cancel

Cancel a booking. Removes calendar events, updates CRM, sends notifications, fires webhooks.

Request Body

{ "reason": "Schedule conflict" }

Response

{ "success": true }

Contacts

GET/api/v1/contacts

List and search contacts with pagination.

Query Parameters

search (name/email/company), page, limit

Response

{ "data": [{ "id": "...", "name": "...", "email": "...", "meetingCount": 3, ... }], "pagination": {...} }
POST/api/v1/contacts

Create 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]", ... }
GET/api/v1/contacts/:id

Get contact detail with upcoming and past meetings.

Response

{ "id": "...", "name": "...", "upcomingMeetings": [...], "pastMeetings": [...], "meetingCount": 5 }
PATCH/api/v1/contacts/:id

Update a contact. All fields optional. Email uniqueness is enforced.

Request Body

{ "name": "Jane Smith", "company": "NewCo" }

Response

{ "id": "...", "name": "Jane Smith", ... }
DELETE/api/v1/contacts/:id

Delete a contact permanently.

Response

{ "success": true }

Event Types

GET/api/v1/event-types

List all active event types.

Response

{ "data": [{ "id": "...", "name": "30 Minute Meeting", "slug": "30-min", "durationMinutes": 30, ... }], "pagination": {...} }
GET/api/v1/event-types/:id

Get full event type detail including scheduling configuration.

Response

{ "id": "...", "name": "...", "slug": "...", "durationMinutes": 30, "bufferBefore": 5, "bufferAfter": 10, ... }

Availability

GET/api/v1/availability/:slug

Get 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": "..." }

Public Booking Endpoint

This endpoint does not require an API key — it's the same endpoint used by the booking page and embed widget.

POST/api/bookings

Create 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 1
  • limit — 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" }
}
StatusMeaning
400Bad request (invalid params or body)
401Missing, invalid, expired, or inactive API key
404Resource not found or not owned by you
409Conflict (e.g. duplicate contact email)
429Rate limit exceeded
500Internal 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.

EventDescription
booking.createdA new booking has been confirmed
booking.cancelledA booking has been cancelled
booking.rescheduledA booking has been moved to a new time
payment.receivedPayment completed for a paid booking
contact.createdA new contact was added

Need help?

Our support team is here to help with API questions.

Contact Support →