Bachtrack APIbachtrack.com ↗
Access Bachtrack classical music events, reviews, festivals, and masterclasses via 8 structured endpoints. Filter by city, performer, venue, or work.
What is the Bachtrack API?
The Bachtrack API exposes 8 endpoints for querying classical music events, critic reviews, festivals, masterclasses, news, and editorial articles worldwide. search_events returns paginated event listings with venue, performer, program, and ticket link fields, while get_event_detail delivers structured per-event data including ISO-formatted dates, street address, and image URL. Together these endpoints cover the full editorial and listings surface of Bachtrack.
curl -X GET 'https://api.parse.bot/scraper/c5f56a43-2d5a-4389-8465-79ddc5d60a5d/search_events?city=London&category=1&start_row=0' \ -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 bachtrack-com-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.
"""Bachtrack classical music API — discover events, reviews, festivals, and news."""
from parse_apis.bachtrack_api import Bachtrack, Category, PageNotFound
client = Bachtrack()
# Search upcoming concerts (category filter via enum)
for event in client.events.search(category=Category.CONCERT, limit=3):
print(event.title, event.city, event.dates)
# Drill into one event's full details
event = client.events.search(category=Category.OPERA, limit=1).first()
if event:
detail = client.eventdetails.get(url=event.url)
print(detail.title, detail.venue, detail.start_date, detail.address)
# Browse reviews and fetch full content for the top one
review_summary = client.reviewsummaries.search(city="London", limit=1).first()
if review_summary:
full_review = review_summary.details()
print(full_review.title, full_review.author, full_review.rating)
# Typed error handling for a missing page
try:
client.reviews.get(url="https://bachtrack.com/review-nonexistent-page-2026")
except PageNotFound as exc:
print(f"Review not found: {exc.url}")
# Browse festivals and news
for festival in client.festivals.list(limit=3):
print(festival.title, festival.location, festival.dates)
for item in client.newsitems.list(limit=3):
print(item.title, item.url)
print("exercised: events.search / eventdetails.get / reviewsummaries.search / details / reviews.get / festivals.list / newsitems.list")
Search for upcoming classical music events (concerts, opera, dance) with optional filters. Returns paginated results in increments of 50. When no filters are specified, returns all event categories. Each event includes venue, performers, program, and ticket purchase links where available.
| Param | Type | Description |
|---|---|---|
| city | string | City name to filter by (resolved via autocomplete) |
| work | string | Musical work name to filter by (resolved via autocomplete) |
| venue | string | Venue name to filter by (resolved via autocomplete) |
| category | integer | Category ID to filter events by type |
| festival | string | Festival name to filter by (resolved via autocomplete) |
| performer | string | Performer name to filter by (resolved via autocomplete) |
| start_row | integer | Starting row for pagination (increments of 50) |
{
"type": "object",
"fields": {
"count": "integer number of events in this page",
"total": "integer total number of matching events",
"events": "array of event objects with id, url, title, venue, city, dates, performers, program, buy_tickets_url",
"start_row": "integer starting row of this page"
},
"sample": {
"data": {
"count": 50,
"total": 5418,
"events": [
{
"id": "433759",
"url": "https://bachtrack.com/concert-event/wigmore-french-song-exchange-2026-wigmore-hall-11-june-2026/433759",
"city": "London",
"dates": "Thu 11 Jun at 13:00",
"title": "Wigmore French Song Exchange 2026",
"venue": "Wigmore Hall",
"program": [],
"performers": [
{
"name": "Singers from Wigmore French Song Exchange",
"role": "Vocals"
}
],
"buy_tickets_url": "https://bachtrack.com/handler/listing/click/433759/Search"
}
],
"start_row": 0
},
"status": "success"
}
}About the Bachtrack API
Event Search and Detail
search_events accepts up to seven optional filters — city, work, venue, category, festival, performer, and start_row — and returns a paginated response with total, count, and an events array. Each event object carries id, url, title, venue, city, dates, performers, program, and buy_tickets_url where available. Pagination increments in steps of 50 via start_row. get_event_detail takes a full Bachtrack event page URL from those results and returns enriched structured data: address, start_date and end_date in YYYY-MM-DD format, image_url, description, and a program array of work names.
Reviews and Editorial
search_reviews filters critic reviews by city and category, returning an array of objects with title, url, author, teaser, rating, and city. Passing a URL from those results into get_review_detail retrieves the full content text, publication date, and star rating. get_articles and get_news require no inputs and return flat arrays of title and url pairs for the latest Bachtrack editorial features and news items respectively.
Festivals and Masterclasses
search_festivals returns upcoming festivals with title, url, location (country), and dates. search_masterclasses returns events in the same shape as search_events, so the same venue, performers, program, and buy_tickets_url fields are present. Neither endpoint currently accepts filter parameters, so all available festival and masterclass records are returned in a single response.
The Bachtrack API is a managed, monitored endpoint for bachtrack.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bachtrack.com 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 bachtrack.com 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 classical music event calendar filtered by city and performer using
search_eventsresults. - Aggregate critic review scores and full review text for a specific city's concert season via
search_reviewsandget_review_detail. - Display upcoming summer festival listings with country and date range from
search_festivals. - Track ticket availability for specific repertoire by filtering
search_eventson aworkparameter. - Surface related masterclasses alongside performance listings using
search_masterclassesevent objects. - Populate a news feed of classical music headlines using
get_newsarticle titles and URLs. - Enrich an event record with street address, image, and ISO dates by passing its URL to
get_event_detail.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Bachtrack offer an official public developer API?+
How does pagination work in `search_events`, and what is the page size?+
start_row as a multiple of 50 (0, 50, 100, …) to walk through pages. The response includes total (total matching events) and count (events on the current page) so you can determine when you have reached the last page.Can I filter festivals or masterclasses by city or performer?+
search_festivals and search_masterclasses currently accept no filter parameters and return all available records. City and performer filtering is only available on search_events. You can fork this API on Parse and revise it to add filter support to those endpoints.Does the reviews endpoint return ratings for all reviews?+
get_review_detail returns a rating field, but its value may be null when a review was published without a star rating. The search_reviews listing also includes rating per item, so you can identify rated reviews before fetching full content.Is historical event data (past concerts) accessible through these endpoints?+
search_events endpoint is oriented toward upcoming events. Historical concert archives are not currently exposed as a dedicated endpoint. The API covers active listings, reviews, festivals, and masterclasses. You can fork it on Parse and revise to add an endpoint targeting Bachtrack's past-event pages.