Sympla APIsympla.com.br ↗
Fetch upcoming events from Sympla.com.br by city. Get titles, venues, addresses, dates, times, cover images, and event URLs with pagination and date filters.
What is the Sympla API?
The Sympla API exposes 1 endpoint — list_events — that returns up to 100 events per page from Sympla's city-level event listings, each carrying 8+ structured fields including event title, venue name, full street address, local start and end date/time (America/Sao_Paulo), cover image URL, and a direct link to the event page on sympla.com.br. It covers any Brazilian city available on Sympla's city collection pages.
curl -X GET 'https://api.parse.bot/scraper/0a0809c3-b465-4fef-8106-d1d618a27c42/list_events?city=curitiba-pr&sort=relevance' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace sympla-com-br-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Sympla City Events API — browse upcoming events in a Brazilian city."""
from parse_apis.sympla_com_br_api import Sympla, Sort, InputFormatInvalid
client = Sympla()
# List the first few events in Curitiba sorted by nearest date.
for event in client.events.list(city="curitiba-pr", sort=Sort.DATE, limit=5):
print(event.title, "|", event.start_date, event.start_time)
if event.venue:
print(" @", event.venue)
# Filter by a date window and grab the first match.
hit = client.events.list(
city="sao-paulo-sp",
start_date="2026-06-01",
end_date="2026-06-30",
limit=1,
).first()
if hit is not None:
print(hit.title, "—", hit.url)
print("organizer:", hit.organizer, "| duration:", hit.duration_type)
# Demonstrate typed error handling for a malformed city slug.
try:
client.events.list(city="INVALID SLUG!", limit=1).first()
except InputFormatInvalid as e:
print("caught expected error:", e.message)
print("exercised: events.list (sorted, date-filtered, .first(), error handling)")
Returns one page of upcoming events for a city as listed on Sympla's city collection page ("O que fazer em ..."). Each row is one event with title, venue name, assembled street address, local start/end date (YYYY-MM-DD) and time (HH:MM, America/Sao_Paulo), event page URL, cover image, organizer name and duration_type (single-day or multiple-day). One upstream request per call. Paging is caller-controlled through page and limit; total is the site's count of matching events and has_more tells whether a further page exists. Sorting is by relevance (default) or by nearest start date. An optional inclusive date window (start_date and end_date, both required together) restricts results to events occurring in that window. An unknown city slug yields an empty events list with total 0.
| Param | Type | Description |
|---|---|---|
| cityrequired | string | City slug as used in the Sympla city page URL, lowercase with hyphens and a two-letter state suffix, e.g. curitiba-pr (one shape; sao-paulo-sp also works). |
| page | integer | 1-based page number over the upstream result stream. |
| sort | string | Result ordering, matching the site's 'Ordenar por' menu. |
| limit | integer | Events per page; values are clamped to 1..100. |
| end_date | string | ISO date YYYY-MM-DD; last day of the inclusive date window. Must be given together with start_date. |
| start_date | string | ISO date YYYY-MM-DD; first day of the inclusive date window. Must be given together with end_date; omitted = no date filter. |
{
"type": "object",
"fields": {
"city": "city slug echoed as normalized",
"page": "integer page returned",
"limit": "integer page size applied after clamping",
"total": "integer count of matching events reported by the site",
"events": "array of event objects: id (string), title, venue (venue name, null if none), address (street + number, neighborhood, city, state; null if none), start_date/end_date (YYYY-MM-DD, America/Sao_Paulo), start_time/end_time (HH:MM, America/Sao_Paulo), url (event page), image (cover image URL), organizer (organizer name), duration_type ('single' or 'multiple')",
"has_more": "boolean, true when page*limit < total"
},
"sample": {
"data": {
"city": "curitiba-pr",
"page": 1,
"limit": 24,
"total": 584,
"events": [
{
"id": "3465310",
"url": "https://www.sympla.com.br/evento/cupola-aluguel-day/3465310",
"image": "https://images.sympla.com.br/6aa4bd81b48f7.png",
"title": "CUPOLA Aluguel Day",
"venue": "Teatro UP Experience",
"address": "Estacionamento 8, Campo Comprido, Curitiba, PR",
"end_date": "2026-09-30",
"end_time": "18:00",
"organizer": "CUPOLA",
"start_date": "2026-09-30",
"start_time": "08:00",
"duration_type": "single"
}
],
"has_more": true
},
"status": "success"
}
}About the Sympla API
What the API Returns
The list_events endpoint returns a paginated list of upcoming public events for a given Brazilian city as published on Sympla. Each event object includes a unique id, title, venue (or null if none is listed), a fully assembled address string (street and number, neighborhood, city, state), start_date and end_date in YYYY-MM-DD format, start_time and end_time in HH:MM (America/Sao_Paulo timezone), a url to the event page, and a cover_image URL. The response envelope also returns the echoed city slug, current page, applied limit, total matching event count (total), and a has_more boolean for simple pagination control.
Filtering and Sorting
The city parameter accepts the same slug format Sympla uses in its city URLs — lowercase, hyphen-separated, with a two-letter state suffix (e.g. curitiba-pr, sao-paulo-sp). Results can be filtered to a specific date window by supplying both start_date and end_date as ISO dates; either both must be present or neither. The optional sort parameter mirrors Sympla's own "Ordenar por" ordering options. Page size is controlled via limit (clamped to 1–100) and page selects the 1-based page offset.
Pagination Behavior
The total field reflects the count Sympla reports for the query, and has_more evaluates to true when page * limit < total. Iterate by incrementing page until has_more is false. Gaps may appear if events are added or removed between requests, since total reflects the live count at each call.
Source and Coverage
Sympla is one of Brazil's largest event ticketing and registration platforms, hosting concerts, conferences, workshops, sports events, and cultural gatherings. Coverage is limited to cities that have a dedicated Sympla city collection page and to events that are publicly listed there — private or unlisted events are not included.
The Sympla API is a managed, monitored endpoint for sympla.com.br — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sympla.com.br changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official sympla.com.br API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a local event calendar app for Brazilian cities using titles, dates, times, and venue names from
list_events. - Aggregate weekend event options in a city by filtering
list_eventswithstart_dateandend_dateset to the upcoming Saturday and Sunday. - Monitor event volume trends in a city over time by recording the
totalcount returned across repeated queries. - Enrich a travel itinerary tool with real event options by querying
list_eventsfor the traveler's destination city and travel dates. - Power a venue analytics dashboard by grouping events by
venuefield across multiple city queries. - Feed a notification service that alerts users when new events appear near a specific address, using the
addressfield for proximity filtering. - Collect cover image URLs from events to populate a visual event discovery interface without additional image scraping.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Sympla have an official public developer API?+
What does the address field in an event object contain?+
address field is a pre-assembled string combining street name and number, neighborhood, city, and state — matching how Sympla presents the location. It is a single string, not split into sub-fields. The venue field separately holds the venue name and can be null if Sympla does not list one for the event.Does the API cover event ticket prices or availability?+
list_events endpoint returns discovery-level data: title, venue, address, dates, times, cover image, and URL. Ticket pricing and availability are not included in the response. You can fork this API on Parse and revise it to add an endpoint that retrieves pricing data from individual event pages.Can I retrieve events for any Brazilian city, or only specific ones?+
How does pagination work when the event list changes between requests?+
total value is fetched live on each request, so if events are added or removed between page calls, the count may shift. Use the has_more boolean — rather than a pre-calculated page count — to decide whether to fetch the next page, since it re-evaluates page * limit < total on each response.