Luma Calendars API
The Calendars API from Luma — 25 operation(s) for calendars.
The Calendars API from Luma — 25 operation(s) for calendars.
openapi: 3.1.0
info:
title: Luma Calendars API
version: 1.0.0
description: 'API for interacting with Luma''s event platform.
## Rate Limits
The Luma API uses a per-minute rate limit shared across `GET` and `POST` requests:
- **Calendar API keys** and OAuth tokens: **200 requests/minute** per calendar.
- **Organization API keys**: **500 requests/minute** per organization.
When you exceed the limit the API returns `429 Too Many Requests`. Back off before retrying.'
contact:
name: Luma Support
url: https://help.luma.com
license:
name: Proprietary
servers:
- url: https://public-api.luma.com
description: Production server
security:
- apiKeyAuth: []
tags:
- name: Calendars
paths:
/v1/calendars/get:
get:
tags:
- Calendars
summary: Get Calendar
parameters: []
description: Get information about the calendar.
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
id:
type: string
name:
type: string
slug:
anyOf:
- type: string
- type: 'null'
avatar_url:
anyOf:
- type: string
- type: 'null'
url:
type: string
description:
anyOf:
- type: string
- type: 'null'
social_image_url:
anyOf:
- type: string
- type: 'null'
cover_image_url:
anyOf:
- type: string
- type: 'null'
is_personal:
type: boolean
location:
anyOf:
- type: object
properties:
city:
type: string
description: City name, e.g. 'New York'.
region:
anyOf:
- type: string
- type: 'null'
description: State or province, e.g. 'New York' or 'California'.
country:
anyOf:
- type: string
- type: 'null'
description: Country name, e.g. 'United States'. Null for cities in disputed territories where Google omits the country.
country_code:
anyOf:
- type: string
- type: 'null'
description: ISO 3166-1 alpha-2 country code, e.g. 'US'.
timezone:
type: string
description: IANA timezone of the city, e.g. 'America/New_York'.
required:
- city
- region
- country
- country_code
- timezone
- type: 'null'
description: City the calendar is based in (e.g. for city calendars). Null when the calendar isn't tied to a place.
coordinate:
anyOf:
- type: object
properties:
longitude:
type: number
latitude:
type: number
required:
- longitude
- latitude
- type: 'null'
description: Latitude and longitude of the calendar's primary location (e.g. city calendars). Null when the calendar isn't tied to a place.
instagram_handle:
anyOf:
- type: string
- type: 'null'
twitter_handle:
anyOf:
- type: string
- type: 'null'
youtube_handle:
anyOf:
- type: string
- type: 'null'
website:
anyOf:
- type: string
- type: 'null'
required:
- id
- name
- slug
- avatar_url
- url
- description
- social_image_url
- cover_image_url
- is_personal
- location
- coordinate
- instagram_handle
- twitter_handle
- youtube_handle
- website
/v1/calendars/events/list:
get:
tags:
- Calendars
summary: List Events
parameters:
- name: before
in: query
required: false
schema:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
- name: after
in: query
required: false
schema:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
- name: pagination_cursor
in: query
required: false
schema:
description: Value of `next_cursor` from a previous request.
type: string
description: Value of `next_cursor` from a previous request.
- name: pagination_limit
in: query
required: false
schema:
description: The number of items to return. The server will enforce a maximum number.
type: number
description: The number of items to return. The server will enforce a maximum number.
- name: platforms
in: query
required: false
schema:
description: Which event platforms to include. Defaults to `luma` for backwards compatibility. Pass as repeated query params, e.g. `?platforms=luma&platforms=external`.
type: array
items:
type: string
enum:
- luma
- external
description: Which event platforms to include. Defaults to `luma` for backwards compatibility. Pass as repeated query params, e.g. `?platforms=luma&platforms=external`.
- name: sort_column
in: query
required: false
schema:
type: string
enum:
- start_at
- name: sort_direction
in: query
required: false
schema:
type: string
enum:
- asc
- desc
- asc nulls last
- desc nulls last
- name: status
in: query
required: false
schema:
description: Filter by calendar submission status. Defaults to `approved`.
type: string
enum:
- approved
- pending
description: Filter by calendar submission status. Defaults to `approved`.
description: 'Every event and API key on Luma is managed by a [Luma Calendar](https://help.luma.com/p/luma-calendar-overview). You can list all of the events managed by your Calendar by using this API route.
Note that this API route will not list events that are listed on the Calendar but not managed by the Calendar.'
responses:
'200':
description: Successful response.
content:
application/json:
schema:
$schema: https://json-schema.org/draft/2020-12/schema
type: object
properties:
entries:
type: array
items:
allOf:
- oneOf:
- type: object
properties:
platform:
type: string
const: luma
id:
type: string
user_id:
type: string
calendar_id:
type: string
start_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
duration_interval:
type: string
end_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
created_at:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
description: ISO 8601 Datetime. For example, 2022-10-19T03:27:13.673Z
timezone:
type: string
description: IANA Timezone, e.g. America/New_York. https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
name:
type: string
description:
type: string
description_md:
type: string
geo_address_json:
anyOf:
- type: object
properties:
address:
type: string
city:
anyOf:
- type: string
- type: 'null'
region:
anyOf:
- type: string
- type: 'null'
country:
anyOf:
- type: string
- type: 'null'
city_state:
anyOf:
- type: string
- type: 'null'
full_address:
anyOf:
- type: string
- type: 'null'
google_maps_place_id:
anyOf:
- type: string
- type: 'null'
apple_maps_place_id:
anyOf:
- type: string
- type: 'null'
description:
anyOf:
- type: string
- type: 'null'
required:
- address
- city
- region
- country
- city_state
- full_address
- google_maps_place_id
- apple_maps_place_id
- description
- type: 'null'
coordinate:
anyOf:
- type: object
properties:
longitude:
type: number
latitude:
type: number
required:
- longitude
- latitude
- type: 'null'
description: Latitude and longitude of the event location. Null for online events or when the address can't be geocoded.
meeting_url:
anyOf:
- type: string
- type: 'null'
location_type:
type: string
enum:
- discord
- meet
- twitch
- twitter
- youtube
- zoom
- offline
- missing
- unknown
description: '`offline` for in-person events. Online events have the meeting platform (`zoom`, `meet`, etc.), or `unknown` if we don''t recognize the meeting link. `missing` if the event has no location set.'
location_visibility:
type: string
enum:
- public
- guests-only
description: Whether the event's address is shown to everyone or only to approved guests. This API always returns the full address.
cover_url:
type: string
registration_questions:
type: array
items:
anyOf:
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: agree-check
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: company
collect_job_title:
anyOf:
- type: boolean
- type: 'null'
job_title_label:
anyOf:
- type: string
- type: 'null'
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: dropdown
options:
maxItems: 250
type: array
items:
type: string
required:
- id
- label
- required
- question_type
- options
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: github
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: instagram
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: linkedin
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: long-text
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: multi-select
options:
maxItems: 250
type: array
items:
type: string
required:
- id
- label
- required
- question_type
- options
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: phone-number
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: telegram
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: text
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: twitter
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: url
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: youtube
required:
- id
- label
- required
- question_type
- type: object
properties:
id:
type: string
label:
type: string
required:
type: boolean
question_type:
type: string
const: terms
terms:
oneOf:
- type: object
properties:
content_type:
type: string
const: text
content_md:
type: string
description: Markdown content for the terms. Luma converts this to rich text internally.
collect_signature:
type: boolean
require_review:
description: When true, guests must open the hosted terms before accepting.
type: boolean
required:
- content_type
- content_md
- collect_signature
- type: object
properties:
content_type:
type: string
const: link
url:
type: string
format: uri
collect_signature:
type: boolean
required:
- content_type
- url
- collect_signature
required:
- id
- label
- required
- question_type
- terms
url:
type: string
visibility:
type: string
enum:
- public
- members-only
- private
waitlist_status:
type: string
enum:
- disabled
- enabled
description: '`enabled` if the event has a waitlist. New registrations join the waitlist once the event reaches capacity.'
feedback_email:
type: object
properties:
enabled:
type: boolean
description: Whether to send the feedback email.
delay:
description: How long after the event ends to send the feedback email. Defaults to PT0M (immediately). Maximum is P7D (7 days).
type: string
required:
- enabled
description: Settings for the post-event feedback email sent to guests.
required:
- platform
- id
- user_id
- calendar_id
- start_at
- duration_interval
- end_at
- created_at
- timezone
- name
- description
- description_md
- geo_address_json
- coordinate
- meeting_url
- location_type
- location_visibility
- cover_url
- url
- visibility
- waitlist_status
- feedback_email
# --- truncated at 32 KB (103 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/luma/refs/heads/main/openapi/luma-calendars-api-openapi.yml