For developers

An API for
Glasgow’s stages.

A free, read-only JSON API for every show and venue on Glasgow Theatre. No key, no account, no tracking. 125 upcoming shows across 12 venues, refreshed with the site.

Try it in your browser ↗Download the full feed ↗

Quick start

curl -s 'https://glasgowtheatre.com/api/v1/shows?venue=tron&limit=3' | jq '.shows[] | {title, run, pricing}'

Browse this page for the contract, open the interactive examples, or point a client at OpenAPI.

Endpoints

MethodPathWhat it returns
GET/api/v1/showsFiltered, paginated shows
GET/api/v1/shows.jsonEvery upcoming show in one response
GET/api/v1/shows/{id}.jsonOne show, including every performance
GET/api/v1/shows.txtEvery show as tab-separated text
GET/api/v1/venues.jsonEvery venue, with concessions
GET/api/v1/venues/{id}.jsonOne venue
GET/api/v1/venues/{id}/showsShows at one venue; same filters as /shows
GET/api/v1/meta.jsonBuild time, refresh time and counts
GET/api/v1/openapi.jsonOpenAPI 3.1 description
GET/api/v1/schema.jsonJSON Schema for every response

Filtering

All parameters are optional. Repeat a parameter or comma-separate values to match any of them.

ParameterExampleMeaning
from, to?from=2026-10-01&to=2026-10-31Match overlapping runs, not just opening nights
date?date=2026-10-17One day; shorthand for from=to=date
venue?venue=tron,tramwayVenue ids from /venues.json
form?form=play,musicalArt form, e.g. play, dance, stand-up
tag?tag=lunchtimeAny tag, including structural ones
q?q=macbethSearch title, venue, description, producer, art form and tags
free?free=trueFree shows
payWhatYouLike?payWhatYouLike=truePay-what-you-like shows
hasPerformances?hasPerformances=trueOnly shows with a performance list
minPrice, maxPrice?maxPrice=15Filter on the published from-price
sort, order?sort=price&order=ascdate (default), closes, title, venue, price
limit, offset?limit=20&offset=20Pagination; limit is 1–200, default 50
format?format=txtTab-separated text instead of JSON

A show

Every response has the same top-level provenance fields, so a client can tell when the data was built and refreshed.

{
  "id": "oran-mor-zamboni",
  "url": "https://glasgowtheatre.com/shows/oran-mor-zamboni.html",
  "title": "Zamboni",
  "artForm": "play",
  "tags": [
    "play",
    "lunchtime",
    "a-play-a-pie-a-pint"
  ],
  "producer": null,
  "description": "Skating instructors Donal, Noa and Gus would rather be at their local ice rink than anywhere else in the world. Joking, gossiping and watching over the ice below. But when they witness a horrific accident on shift, their safe haven is shattered, and their greatest passion becomes the very thing...",
  "venue": {
    "id": "oran-mor",
    "name": "A Play, a Pie and a Pint",
    "area": "West End"
  },
  "run": {
    "opens": "2026-11-02",
    "closes": "2026-11-07",
    "time": "13:00"
  },
  "schedule": {
    "text": "Monday – Saturday 1pm\n(Doors 12pm/12.30pm on Mondays)"
  },
  "performances": [
    {
      "date": "2026-11-02",
      "time": "13:00",
      "price": 17
    },
    {
      "date": "2026-11-03",
      "time": "13:00",
      "price": 19
    },
    {
      "date": "2026-11-04",
      "time": "13:00",
      "price": 19
    },
    {
      "date": "2026-11-05",
      "time": "13:00",
      "price": 19
    },
    {
      "date": "2026-11-06",
      "time": "13:00",
      "price": 19
    },
    {
      "date": "2026-11-07",
      "time": "13:00",
      "price": 22.5
    }
  ],
  "pricing": {
    "currency": "GBP",
    "from": 17,
    "to": 22.5,
    "concessionFrom": null,
    "concessionTo": null,
    "free": false,
    "payWhatYouLike": false,
    "text": "Monday: £17\nTuesday-Friday: £19\nSaturday: £22.50",
    "source": "published-text",
    "checkedAt": "2026-11-07"
  },
  "accessibility": null,
  "durationMinutes": null,
  "image": {
    "url": "https://glasgowtheatre.com/images/6ee73a9329c0e0f01999.webp",
    "alt": "Zamboni",
    "credit": null
  },
  "bookingUrl": "https://playpiepint.com/whats-on/event/zamboni/",
  "updatedAt": "2026-11-07"
}

A venue

Concessions are a property of the building, not the show. They are hand-checked against the venue's own page and the date is published with them. colour is the house colour used on the calendar, adjusted to clear WCAG AA against ink; use the pair together if you are drawing the venue yourself.

{
  "id": "oran-mor",
  "name": "A Play, a Pie and a Pint",
  "area": "West End",
  "colour": "#d54222",
  "ink": "#ffffff",
  "description": "A lunchtime theatre programme in a converted church at the top of Byres Road. Every week brings a new short play, with a pie and a drink included in the ticket.",
  "website": "https://playpiepint.com",
  "instagram": "playpiepint",
  "programme": "theatre",
  "url": "https://glasgowtheatre.com/venues/oran-mor.html",
  "upcomingShows": 3,
  "showsUrl": "https://glasgowtheatre.com/api/v1/venues/oran-mor/shows.json",
  "concessions": {
    "url": "https://playpiepint.com/",
    "checkedAt": "2026-09-10",
    "summary": "A Play, a Pie and a Pint tickets include a drink and a pie. Prices rise across the week, from Monday to Saturday, and a cheaper play-only ticket is held back for midweek performances.",
    "schemes": [
      {
        "name": "Play-only ticket",
        "broad": false,
        "eligibility": "Tuesday to Thursday, for students, arts workers, and audience members who are unemployed or on a low income or household benefits. The ticket covers the play without the pie and drink.",
        "how": "Chosen when booking."
      }
    ],
    "offers": [],
    "fees": "Published prices include a £1.50 booking fee. A small extra fee applies when booking online through Universe."
  }
}

What the data means

Versioning

The path carries the major version: /api/v1. Minor versions are additive only, so a client written for 1.0 keeps working with 1.1. A breaking change gets /api/v2 and at least twelve months of overlap.

Changelog

Static snapshots and CORS

The .json endpoints are files written by the daily build; they are cached at the edge and are the safest thing to poll. The extensionless /shows endpoint is a Cloudflare Pages Function that filters the same snapshot. All endpoints send Access-Control-Allow-Origin: *, so they can be called from a browser on any origin.

Need a language example?

Open the interactive examples for JavaScript, Python, PHP, C and Go. Each one is editable, runs in a sandbox, and is also available as a file in the repository under examples/.