Luma Organizations API
The Organizations API from Luma — 5 operation(s) for organizations.
The Organizations API from Luma — 5 operation(s) for organizations.
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_meetin
# --- truncated at 32 KB (46 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/luma/refs/heads/main/openapi/luma-organizations-api-openapi.yml