{"description":"Finds events on Eventbrite in a US city for a keyword and dates, like the site's browse pages: name, description, start and end, online or in person, venue and address with map position, organiser and link. The keyword ranks results, so each event says whether it matches. Promoted events are left out.","effect":"read","id":"eventbrite.com/search-events","keywords":["eventbrite","events","tickets","things to do","concerts","workshops","meetups","classes","usa","new york","austin"],"output":{"schema":{"properties":{"city":{"type":"string"},"events":{"items":{"properties":{"country":{"type":["string","null"]},"description":{"type":["string","null"]},"end_date":{"type":["string","null"]},"image":{"type":["string","null"]},"latitude":{"type":["number","null"]},"locality":{"type":["string","null"]},"longitude":{"type":["number","null"]},"matches_query":{"description":"Every query word appears in the name or description. Eventbrite ranks by relevance and fills the page with other events in the city when few match","type":"boolean"},"name":{"type":"string"},"online":{"type":"boolean"},"postcode":{"type":["string","null"]},"start_date":{"description":"YYYY-MM-DD","type":["string","null"]},"street":{"type":["string","null"]},"url":{"type":"string"},"venue":{"type":["string","null"]}},"type":"object"},"type":"array"},"matching":{"description":"How many events on this page mention every word of the query in their name or description","type":"integer"},"page":{"type":"integer"},"query":{"type":"string"}},"required":["city","query","events"],"type":"object"},"value":"let $q = lower(trim(params.query || 'events')) in let $words = split($q, ' ')[?@ != ''], $all = $q == 'events' in let $ev = map(&(let $e = @ in let $text = lower(join(' ', [$e.name || '', $e.description || ''])) in {name: $e.name, description: $e.description || `null`, start_date: $e.startDate || `null`, end_date: $e.endDate || `null`, online: contains($e.eventAttendanceMode || '', 'Online'), venue: $e.location.name || `null`, street: $e.location.address.streetAddress || `null`, postcode: $e.location.address.postalCode || `null`, locality: $e.location.address.addressLocality || `null`, country: $e.location.address.addressCountry || `null`, latitude: $e.location.geo.latitude && to_number($e.location.geo.latitude) || `null`, longitude: $e.location.geo.longitude && to_number($e.location.geo.longitude) || `null`, image: $e.image || `null`, url: $e.url, matches_query: $all || length($words[?!contains($text, @)]) == `0`}), steps.search[0].events || `[]`) in {city: params.city, query: params.query || 'events', page: params.page || `1`, matching: length($ev[?matches_query]), events: $ev}"},"params":{"additionalProperties":false,"properties":{"city":{"description":"City, e.g. 'New York', 'Austin'","maxLength":60,"minLength":2,"type":"string"},"date_from":{"description":"Earliest event day, YYYY-MM-DD","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"date_to":{"description":"Latest event day, YYYY-MM-DD (use with date_from)","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"page":{"default":1,"description":"20 events per page","maximum":20,"minimum":1,"type":"integer"},"query":{"default":"events","description":"Keyword or category, e.g. 'jazz', 'comedy', 'yoga', 'startup'; 'events' for everything","maxLength":60,"minLength":2,"type":"string"},"state":{"description":"Two-letter US state code, e.g. 'NY', 'TX', 'CA'","pattern":"^[A-Za-z]{2}$","type":"string"}},"required":["city","state"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"Same /d/<place>/<keyword>/ list pages and ld+json ItemList as eventbrite.de/search-events (promoted events are not in the ItemList; the keyword only ranks results, so each event carries matches_query). Place slug: '<state code>--<city>' (ny--new-york). Answers servers. The event list is the first ld+json script directly under <body>: some pages also have a FAQPage ld+json nested in the content, which comes first in the document (New York jazz).","recorded_at":"2026-11-07T22:24:00+01:00","recorded_by":"C4"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"US","id":"eventbrite.com","language":"en","name":"Eventbrite","origin":"https://www.eventbrite.com","origins":["https://www.eventbrite.com"]},"steps":[{"description":"The server-rendered search page /d/<country>--<city>/<keyword>/ (place names as eventbrite.de spells them, in German; English names redirect). Its first ld+json block is an ItemList of the page's events in order (promoted events are kept apart and not in it). The one-item foreach builds the URL slugs.","expect":{"content_type":"html","status":[200]},"extract":{"embedded_json":{"selector":"body > script[type=\"application/ld+json\"]","vars":{"events":"\"@type\" == 'ItemList' && itemListElement[].item || `[]`"}}},"foreach":{"as":"f","in":"[{place: join('--', [lower(trim(params.state)), replace(lower(trim(params.city)), ' ', '-')]), q: replace(lower(trim(params.query || 'events')), ' ', '-'), page: (params.page || `1`) > `1` && to_string(params.page) || `null`}]","max":1},"id":"search","parse":"html","request":{"headers":{"Accept":"text/html"},"method":"GET","query":{"end_date":"{{params.date_to}}","page":"{{f.page}}","start_date":"{{params.date_from}}"},"url":"/d/{{f.place | urlencode}}/{{f.q | urlencode}}/"}}],"task":"Find events in a city on Eventbrite","tos":{"notes":"Terms not reviewed yet for automated access. One person's search: 1 request for one results page, as the site serves it. robots.txt allows /d/ pages. Registration and tickets stay on eventbrite.","reviewed":false},"verify":{"checks":["length(output.events) > `10`","length(output.events[?starts_with(url, 'https://www.eventbrite.') && name != `null` && start_date != `null`]) == length(output.events)","length(output.events[?locality != `null`]) > `5`","length(output.events[?latitude > `40` && latitude < `41.5`]) > `5`","output.matching > `5`"],"example_params":{"city":"New York","query":"jazz","state":"NY"},"max_ms":5000},"version":1}