openapi: 3.1.0 info: title: Luma Calendars Organizations 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: Organizations paths: /v1/organizations/admins/list: get: tags: - Organizations summary: List Organization Admins parameters: [] description: List all admins for the organization. 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: type: object properties: id: type: string name: anyOf: - type: string - type: 'null' avatar_url: type: string email: type: string first_name: anyOf: - type: string - type: 'null' last_name: anyOf: - type: string - type: 'null' api_id: type: string deprecated: true description: Use `id` instead. required: - id - name - avatar_url - email - first_name - last_name - api_id required: - entries /v1/organizations/calendars/list: get: tags: - Organizations summary: List Organization Calendars parameters: - 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. description: List all calendars belonging to the organization. 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: 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 has_more: type: boolean next_cursor: type: string required: - entries - has_more /v1/organizations/events/list: get: tags: - Organizations summary: List Organization 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: sort_direction in: query required: false schema: type: string enum: - asc - desc - asc nulls last - desc nulls last description: List all events across all calendars belonging to the organization. Events are deduplicated if they appear on multiple calendars within the organization. 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: 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. api_id: type: string deprecated: true description: Use `id` instead. user_api_id: type: string deprecated: true description: Use `user_id` instead. calendar_api_id: type: string deprecated: true description: Use `calendar_id` instead. zoom_meeting_url: anyOf: - type: string - type: 'null' deprecated: true description: Use `meeting_url` instead. Not all meetings use Zoom. geo_latitude: anyOf: - type: string - type: 'null' deprecated: true description: Use `coordinate.latitude` instead. geo_longitude: anyOf: - type: string - type: 'null' deprecated: true description: Use `coordinate.longitude` instead. managing_calendars: type: array items: 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' status: type: string enum: - approved - pending description: Status of the event on this calendar. 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 - status description: Calendars with manage access to this event, with the event's status on each. Calendars that only list the event without manage access are not included. 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 - api_id - user_api_id - calendar_api_id - zoom_meeting_url - geo_latitude - geo_longitude - managing_calendars has_more: type: boolean next_cursor: type: string required: - entries - has_more /v2/organizations/calendars/create: post: tags: - Organizations summary: Create Calendar description: Create a new calendar within the organization. The calendar will be managed by the API key owner. requestBody: required: true content: application/json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: name: type: string description: Name of the calendar. slug: description: URL slug for the calendar page (e.g. 'my-community' → lu.ma/my-community). type: string description: description: Short description of the calendar. type: string avatar_url: description: Specify an image that has been uploaded to the Luma CDN. If not provided, a random default avatar will be used. type: string format: uri tint_color: description: Tint color for the calendar in hex format (e.g. '#E3CBEF'). If not provided, a random color matching the default avatar will be used. type: string required: - name 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/organizations/events/transfer-calendar: post: tags: - Organizations summary: Transfer Event Calendar description: Transfer an event from its current managing calendar to a different calendar within the organization. The event's managing calendar changes to the destination calendar. Both the source and destination calendars must belong to the organization. requestBody: required: true content: application/json: schema: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: event_id: type: string description: Event ID, this usually starts with evt- calendar_id: type: string description: Destination calendar ID, this usually starts with cal-. Must belong to the organization. required: - event_id - calendar_id responses: '200': description: Successful response. content: application/json: schema: type: object description: Empty response properties: {} additionalProperties: false x-stainless-empty-object: true components: securitySchemes: apiKeyAuth: type: apiKey in: header name: x-luma-api-key description: API key to authenticate requests to the Luma API. Generate an API key on your Luma dashboard.