luma

luma

luma.

Luma — events of the calendar (read only).

ajouter à otoauth : —prefix : luma_*

setup & usage

⚠ a Luma API key (Luma Plus)

create a key in Luma, on the calendar or on the organization (Settings → Developer → API keys), then paste it into oto. Reference: Luma API.

  • ⚠️ the API requires an active Luma Plus subscription on the calendar: without it, every call is refused (403) even with a valid key
  • a calendar key acts on its own calendar. An organization key covers all the organization's calendars: calendar calls then need calendar_id (cal-…, listed by luma_calendar(op="org_calendars")), and the org_* operations only work with it
  • byo-only: no shared oto key — these are your events and attendee lists, each organization sets up its own
  • ▸ events and their guests
  • "our upcoming events" → luma_events(after="<now, ISO 8601>"); the description is only in op="get"
  • "this lu.ma link" → luma_events(op="resolve", url="https://lu.ma/…") gives the evt-… id
  • "who is coming?" → luma_guests(event_id="evt-…", status="approved"); "who checked in" → sort_column="checked_in_at"; one person's answers and payment → op="get", guest="<email>"
  • "create an event" → luma_calendar(op="places", query="…") for the place, then luma_event_admin(op="create", fields={"name": …, "start_at": …, "timezone": "Europe/Paris", "geo_address_json": {"type": "google", "place_id": …}})
  • "approve the waitlist" → luma_guest_admin(event_id=…, op="set_status", guest="<email>", status="approved") (dry-run first) — Luma emails the guest unless send_email=false
  • "register these people" → luma_guest_admin(op="add", guests=[{"email": …, "name": …}]); "invite them" → op="invite" (dry-run first)
  • "email the attendees" → luma_act(op="send_blast", event_id=…, content_md="…") (dry-run first); luma_blasts reads, changes or cancels the blasts
  • "our audience" → luma_contacts(op="list", sort_column="event_checked_in_count", sort_direction="desc"); segment with tags (op="tag")
  • "a discount code" → luma_tickets(op="create_coupon", event_id=…, code="EARLY", discount={"discount_type": "percent", "percent_off": 20})
  • · what reaches people outside your organization

    nine gestures are dry-run by default and need dry_run=false to happen: luma_guest_admin(op="invite") and op="set_status", luma_act(op="send_blast"), luma_event_admin(op="cancel") and op="add_host", luma_calendar(op="add_admins"), luma_webhooks(op="create"), luma_memberships(op="set_status") and op="add".

  • ⚠️ a calendar admin manages every event, guest list and setting of the calendar
  • ⚠️ a webhook sends the calendar's notifications to a URL, guest names, emails and registrations included; its signing secret is never returned by oto — read it in Luma's dashboard
  • ⚠️ cancelling an event is irreversible: every guest is notified, the event is deleted, and if guests paid you must say should_refund explicitly
  • ⚠️ a sent blast cannot be recalled; deleting it only removes the post from the event page
  • ⚠️ changing a guest's status emails them unless send_email=false; should_refund refunds a paid guest moved out of "going"
  • ⚠️ a host with `access_level="manager"` co-hosts the event: they edit it, its guest list and its settings
  • ⚠️ adding a member to a paid tier charges them unless skip_payment
  • ⚠️ approving a member of a paid membership tier captures their payment; declining cancels their subscription
  • adding guests and sending invites runs in the background: the answer lists who will be skipped (unsubscribed, removed, blocked), not the final list — read it back with luma_guests
  • · what can mislead
  • an event is managed by one calendar; a calendar also lists events managed elsewhere (include_viewed=true), with the location reduced to the city and host-only fields missing
  • dates are ISO 8601 in UTC (2026-11-04T18:30:00.000Z); the event's timezone is separate. Durations are ISO 8601 too (PT2H)
  • a coupon's discount can never be edited after creation — only its remaining count and validity window
  • remove and block on a contact are different: removed people may follow the calendar again, blocked ones cannot join its events
  • guest and contact fields (email, name, phone, registration answers) can be masked by an org admin from the connector's "transformations" tab; nothing is masked by default
  • rate limit: 200 requests per minute per calendar (500 per organization key); a 429 blocks the key for about a minute
  • ⚙ multiple comptes

    this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.

  • the first one doesn't need a name; from the second on, each one carries its own (the first then takes the name "principal", renamable)
  • without specification, the agent takes the only stored compte, otherwise the one marked as default; otherwise the call is refused, naming the available comptes — never a random choice
  • target a compte for a call: _account="<name>" on the tool; list them: oto_identity(op='list', connector='luma') (scope='org' or scope='group' for the org's or team's)
  • set the default: oto_identity(op='set', connector='luma', identity_id='<name>'); rename: op='rename' with new_name
  • ⚠️ no tool walks through the comptes on its own: a total across several comptes is obtained by calling each one (_account) and adding up
  • outils

    chargement…

    utilisation

    claude code — installe le plugin oto — claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.
    claude.ai — branche mcp.oto.cx/mcp en connecteur custom (guide)
    cli — pipx install oto-cli puis oto luma …