Find events in a city on Eventbrite.
Searches Eventbrite's events in a city in Germany, Austria or Switzerland for a keyword or category (jazz, comedy, workshop, …), optionally between two dates: name, short description, start and end date, venue with address and coordinates, online or in person, picture and link. Eventbrite fills the page with other events when few match, so each event says whether it matches the query. Promoted events are left out. Start times and prices are on the event page.
- Site
- Eventbrite, Germany
- Version
- v2 of 2
- Runs, last 7 days
- No reports yet
- sha256
- e09eec254e43…
Run it with your agent
after installing WieldAsk in plain words. Your agent finds this recipe and calls it:
“Find events in a city on Eventbrite.”
Read-only: it changes nothing on the site. No login needed.
{ "tool": "run", "arguments": { "recipe_id": "eventbrite.de/search-events", "params": { "city": "Berlin", "query": "jazz" } } }
Requests
sent from your browser, in order- 1GET/d/{{f.place | urlencode}}/{{f.q | urlencode}}/?end_date&page&start_dateThe 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.
Parameters
from your agentReturns
to your agentWhere it can send
- www.eventbrite.de
Anything else is blocked by the extension.
Reads from your session
Nothing. Your browser attaches the site's cookies by itself.
Used only in requests to the addresses on the left. Never sent to wield.run or your agent.
Checks
a run passes when- 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 > `52` && latitude < `53`]) > `5`
- output.matching > `5`
Raw recipe
Served as canonical JSON from /api/v1/recipes/eventbrite.de/search-events, so its sha256 matches the ETag and the index.
curl -s https://wield.run/api/v1/recipes/eventbrite.de/search-events | shasum -a 256 # e09eec254e4377f615f57aec238712475203a104a3d7d075854b9a296128b221
{ "description": "Searches Eventbrite's events in a city in Germany, Austria or Switzerland for a keyword or category (jazz, comedy, workshop, …), optionally between two dates: name, short description, start and end date, venue with address and coordinates, online or in person, picture and link. Eventbrite fills the page with other events when few match, so each event says whether it matches the query. Promoted events are left out. Start times and prices are on the event page.", "effect": "read", "id": "eventbrite.de/search-events", "keywords": [ "eventbrite", "events", "veranstaltungen", "was ist los", "konzert", "comedy", "workshop", "networking", "party", "meetup", "kurs", "tickets", "this weekend", "things to do", "berlin", "münchen", "hamburg", "wien", "zürich" ], "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 as named in German, e.g. 'Berlin', 'München', 'Köln', 'Wien', 'Zürich'", "maxLength": 60, "minLength": 2, "type": "string" }, "country": { "default": "germany", "enum": [ "germany", "austria", "switzerland" ], "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" } }, "required": [ "city" ], "type": "object" }, "provenance": { "method": "browser-inspect", "notes": "eventbrite.de/d/<country>--<city>/<keyword>/ is server-rendered. The first script[type=application/ld+json] is a schema.org ItemList of the page's 20 events (Event: name, description, startDate, endDate as dates, location with address and geo, eventAttendanceMode, image, url), the same order as window.__SERVER_DATA__.search_data.events.results; promoted events are in a separate promoted_results list and not in the ItemList. start_date, end_date and page are honoured as query parameters. German place names in the slug (germany--münchen); the English name 301-redirects to it. __SERVER_DATA__ (with start times) is an unmarked inline script after other assignments, so the stable ld+json is used; /api/v3/destination/events answers 400 to plain requests. Answers servers. The keyword only ranks results: a nonsense keyword returns the same 3,218 Berlin events (pagination.object_count) as 'jazz', so the output marks matches_query and counts them. v2 (2026-11-07 22:26): the selector is now body > script[type=application/ld+json]. On eventbrite.com some list pages carry a FAQPage ld+json nested in the content before the ItemList, and v1 (first ld+json in the document) would then read no events; the same page layout serves eventbrite.de.", "recorded_at": "2026-11-07T21:47:00+01:00", "recorded_by": "C4" }, "requires_login": false, "schema": "https://wield.run/schema/recipe/v1.json", "site": { "country": "DE", "id": "eventbrite.de", "language": "de", "name": "Eventbrite", "origin": "https://www.eventbrite.de", "origins": [ "https://www.eventbrite.de" ] }, "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('--', [params.country || 'germany', 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 > `52` && latitude < `53`]) > `5`", "output.matching > `5`" ], "example_params": { "city": "Berlin", "query": "jazz" }, "max_ms": 5000 }, "version": 2 }