Independent theatre journalism
Saved
Bonfire weekend: shows on this weekend
Sounds & Stage Theatre news, reviews & tickets
Industry

Data API

The Sounds & Stage theatre database as read-only JSON, for apps, websites and ticketing services.

Quick start

No sign-up is needed to try it. Open this address in your browser and you will see JSON:

GET https://soundsandstage.com/api/v1/productions?status=running&sort=name&limit=5&fields=name,venue,url

That asks for five running productions, sorted by name, showing only the name, venue and link. Free use is 60 requests a minute. See the packages for 600 or more requests a minute and 100 results per page.

Code examples

curl

# The five running productions
curl "https://soundsandstage.com/api/v1/productions?status=running&sort=name&limit=5&fields=name,venue,url"

# With your key
curl -H "X-API-Key: YOUR_KEY" "https://soundsandstage.com/api/v1/productions?q=wicked"

# One production, with cast, creative team, tour dates and reviews
curl "https://soundsandstage.com/api/v1/productions/wicked"

# Venues within 3 km of Leicester Square
curl "https://soundsandstage.com/api/v1/venues?near=51.5101,-0.1281&radius=3"

JavaScript (browser or Node 18+)

const res = await fetch("https://soundsandstage.com/api/v1/productions?status=running&limit=20", {
  headers: { "X-API-Key": "YOUR_KEY" }   // optional
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { meta, data, links } = await res.json();
console.log(meta.total + " productions");
for (const show of data) console.log(show.name, "at", show.venue?.name);

// Follow the links to page through everything
let url = "https://soundsandstage.com/api/v1/productions?limit=100";
while (url) {
  const r = await (await fetch(url)).json();
  r.data.forEach(s => console.log(s.name));
  url = r.links.next;      // undefined on the last page
}

Python

import requests

BASE = "https://soundsandstage.com/api/v1"
s = requests.Session()
s.headers["X-API-Key"] = "YOUR_KEY"   # optional

def pages(path, **params):
    url = BASE + path
    while url:
        r = s.get(url, params=params if "?" not in url else None, timeout=15)
        if r.status_code == 429:
            raise SystemExit("Slow down, retry in %s seconds" % r.headers.get("Retry-After"))
        r.raise_for_status()
        body = r.json()
        yield from body["data"]
        url = body["links"].get("next")

for show in pages("/productions", status="running", sort="name"):
    print(show["name"], "-", (show["venue"] or {}).get("name"))

PHP

<?php
$ctx = stream_context_create(['http' => [
    'header'  => "X-API-Key: YOUR_KEY\r\n",   // optional
    'timeout' => 15,
]]);
$json = file_get_contents('https://soundsandstage.com/api/v1/productions?status=running&limit=20', false, $ctx);
$data = json_decode($json, true);
foreach ($data['data'] as $show) {
    echo $show['name'], ' at ', $show['venue']['name'] ?? 'tour', "\n";
}

Resources

ResourceAddressContains
Productionshttps://soundsandstage.com/api/v1/productionsDates, previews, press night, running time, age guidance, price from, venue, area, company, cast. Add /slug for creative team, tour dates, ways to buy, offers, reviews, news, songs and characters.
Venueshttps://soundsandstage.com/api/v1/venuesAddress, city, kind, capacity, coordinates, area. Add /slug for current shows and seat notes (labelled fact or opinion).
Areashttps://soundsandstage.com/api/v1/areasTowns and districts, with the venues in each.
Peoplehttps://soundsandstage.com/api/v1/peopleStage names, with biography, credits and awards on the /slug page.
Articleshttps://soundsandstage.com/api/v1/articlesNews, features and reviews: headline, summary, date and link. Full text stays on the site.
Reviewshttps://soundsandstage.com/api/v1/reviewsReviews only; filter by production, venue or person.
Performanceshttps://soundsandstage.com/api/v1/performancesUpcoming tour dates by venue and city.
Awardshttps://soundsandstage.com/api/v1/awardsWinners and nominees by awards body, year and category.
Glossaryhttps://soundsandstage.com/api/v1/glossaryTheatre terms and roles with short definitions.
Offershttps://soundsandstage.com/api/v1/offersLive ticket offers and discount codes we have checked.
Jobshttps://soundsandstage.com/api/v1/jobsLive theatre job adverts.
Eventshttps://soundsandstage.com/api/v1/eventsA date-ordered calendar: openings, closings, press nights, previews and awards dates.
Ticketshttps://soundsandstage.com/api/v1/ticketsShows on sale now with booking links, price from and closing dates.
Searchhttps://soundsandstage.com/api/v1/searchOne search across productions, venues, areas, people and articles. Use ?q=.
Statushttps://soundsandstage.com/api/v1/statusHealth check and record counts.
OpenAPIhttps://soundsandstage.com/api/v1/openapi.jsonMachine-readable description for Postman, Swagger and code generators.

Searching, filtering and sorting

Every list takes q (search words), page, limit, sort (a field name, with a - in front to reverse) and fields (a comma-separated list, to keep responses small). updated_since=YYYY-MM-DD returns only what changed on or after that day.

ResourceExtra filtersSort by
productionsvenue, area (slugs), status (running, previews, upcoming, closed), type, companyname, opens, closes, press_night, updated
venuescity, area, kind, near=lat,lng with radius in km (default 5, up to 200)name, city, capacity, distance_km, updated
peoplekind, letter (A to Z), has_bio=1name, kind, updated
articlescategory, show, venue, person, tag (slugs)published, title, updated
performancescity, production, from, to (dates)starts, ends, production, city
awardsbody, year, result=winnersyear, awards, category, nominee
performances (near a town)town, radius (miles, default 25)distance_miles
eventsfrom, to, kind (opens, closes, press_night, previews, awards), typedate, kind, production
ticketsclosing_within (days)production, closes, price_from
productions (extra)closes_before, opens_after, price_max
offers, jobs, glossarykind; jobs also category and locationtitle, valid_to, price_from, posted, term

What comes back

{
  "meta":  { "source": "Sounds & Stage", "version": "1", "authenticated": false,
             "total": 87, "page": 1, "pages": 18, "per_page": 5, "returned": 5 },
  "links": { "self": "https://soundsandstage.com/api/v1/productions?limit=5", "first": "...", "next": "https://soundsandstage.com/api/v1/productions?limit=5&page=2", "last": "..." },
  "data":  [ { "id": 12, "slug": "wicked", "name": "Wicked", "type": "Musical", "status": "running",
               "opens": "2006-09-27", "running_time": "2h 45m", "price_from": "£25",
               "venue": { "name": "Apollo Victoria Theatre", "slug": "apollo-victoria-theatre", "url": "..." },
               "area": { "name": "Victoria", "slug": "victoria", "url": "..." },
               "url": "...", "updated": "2026-10-01T09:30:00+01:00" } ]
}

Lists are paged. Use links.next until it is missing. The same links are sent in a Link header.

Keys, limits and errors

  • Send your key in an X-API-Key header. Without a key: 60 requests a minute and 20 results per page. With a key: 600 a minute and 100 per page.
  • Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. When you go over, you get 429 with a Retry-After header.
  • Responses have an ETag. Send it back in If-None-Match and an unchanged answer is a tiny 304, which still counts as a request but saves your bandwidth.
  • Errors are JSON: {"error":{"status":404,"code":"not_found","message":"..."}}. Codes: 400 bad request, 401 invalid key, 404 not found, 405 read only, 429 rate limited.
  • Browsers can call the API directly: CORS is open for GET.

Rules

  • Show a visible link back to the Sounds & Stage page for anything you display. The data may not be resold as a dataset.
  • Cache on your side for a few minutes. Productions and venues change daily at most.
  • We do not provide live seat availability or prices from ticket sellers. "Price from" is what our editor last checked.

Need a key or a feed?

Ticketing services, apps and other theatre sites can see the API packages or contact us. Tell us what you are building. The machine-readable description is at https://soundsandstage.com/api/v1/openapi.json.