Luma unofficial API: register for free Luma events
Input
slug requiredThe event's short Luma slug, e.g. "9n5kxo7k" from luma.com/9n5kxo7k.
answers optionalAnswers to the event's custom registration questions, keyed by the question's id or its exact label. Takes precedence over `select_preferences` and over anything `profile` would fill. This script never invents an answer: if a required question is answered by none of them the run is refused, and a key matching no question on the event is also refused rather than silently dropped. Values: a string for text/linkedin/url questions; for a "select" question the value must be one of that question's own options verbatim (an array of them when the question allows multiple); for a "company" question either a string, or {"company": "...", "job_title": "..."}.
dry_run optionalSet true to fill the registration form and report what would be submitted, without registering: no guest list is touched and no organizer is notified. Use it to check that an event's questions are answerable, and that each value landed on the question you expect, before committing. On an event with no questions and no phone requirement there is no form to fill, because Luma's button registers on the first click, so a dry run reports the plan without clicking anything.
profile optionalWho is registering, so recurring questions answer themselves instead of being restated per event. Luma gives several identity questions their own type (linkedin, telegram, twitter, instagram, github, email, url), and each is filled from the matching field below by type. A question asking for one of those as plain text is matched on its label instead. It never ticks a consent box, which stays behind accept_terms, and anything it cannot map is refused rather than guessed. Run with dry_run first to see exactly which question each field landed on.
accept_terms optionalSet true to accept the event's required terms / agreement checkboxes (question_type "terms" or "agree-check") on behalf of the signed-in account. Defaults to false, and an event carrying a required one is refused without it, because agreeing to an organizer's terms is a deliberate act and not something this script will do implicitly. Optional consent boxes, typically marketing or data-sharing opt-ins, are never ticked even when this is true.
phone_number optionalPhone number to submit, in international format (e.g. "+33612345678"). Required only for events whose phone_number_requirement is "required" — such a run is refused without it, unless `profile.phone` supplies one. Earlier versions fabricated a random French mobile here; this script no longer invents one.
select_preferences optionalOption values you accept on dropdown questions, in priority order, e.g. ["AI Engineer", "R&D", "Engineering", "France", "5+ years", "Other"]. For each dropdown you have not answered in `answers`, the first entry that exactly matches one of that question's own options is used (case and surrounding spaces ignored). Nothing is invented: an entry matching no option is simply not used, and a question nothing matches is still refused. Because events word their options differently, list the variants you would accept. Check `planned` on a dry run to see which entry each question took.
Output
slug requiredevent_id requiredalready_registered requireddry_run optionalTrue when nothing was submitted.
planned optionalOn a dry run: one entry per registration question, what would be sent and where it came from.
rsvp_id optionalticket_key optionalwould_register optionalOn a dry run: whether a real run with these arguments would now go through.
approval_status optional