{
  "name": "Quockerwodger Media public data",
  "site": "https://quockerwodger.ca",
  "summary": "Read-only listings, articles and archive data for the Vancouver live-music scene. No key and no account required.",
  "access": {
    "methods": [
      "GET"
    ],
    "cors": "Every path in this file sends Access-Control-Allow-Origin: *, so a browser can read it cross-origin.",
    "auth": "None. The endpoints listed here carry no personal data. Everything else on the site is either a published page or behind a contributor login.",
    "forms": "The site's POST endpoints (contact, show submissions, announcements, the poll) are for people filling in forms and are deliberately absent from this list.",
    "etiquette": "Prefer the snapshots below for bulk reads, and the sitemap for crawling pages. Identify your client in the User-Agent header."
  },
  "completeness": {
    "summary": "A truncated page and a complete one look identical when the body is a bare array, so /api/shows reports the difference in headers.",
    "headers": {
      "X-Result-Count": "Number of records in this response.",
      "X-Result-Limit": "The limit applied to this query.",
      "X-Result-Complete": "true when the whole matching set is in this response. false means more records match than the limit allowed."
    },
    "note": "A response holding exactly `limit` records is not proof of a complete set. Read X-Result-Complete, or narrow the query with date, venue or genre. /api/posters carries the same signal as a `complete` field in its body."
  },
  "endpoints": [
    {
      "path": "/api/shows",
      "returns": "array",
      "summary": "Upcoming live shows in the Vancouver area. The main discovery endpoint.",
      "params": {
        "date": "One of today, week, weekend, month, all, just_announced. Defaults to all. An unknown value returns 400.",
        "from": "ISO date (YYYY-MM-DD) floor. Overrides the scope floor.",
        "to": "ISO date ceiling.",
        "venue": "Venue slug. Alias-aware, so a known typo slug matches the canonical room.",
        "genre": "Substring match against the listing genre tags.",
        "q": "Free-text match on headliner and support acts. Spacing and punctuation are ignored.",
        "allages": "1 restricts to all-ages listings, including rooms whose published door policy welcomes minors where the listing itself is silent.",
        "new": "1 restricts to listings first seen in the last 14 days.",
        "allregions": "1 lifts the Vancouver-area fence.",
        "price": "One of free, under-20, 20-40, 40-plus.",
        "unpriced": "1 keeps listings that publish no price inside a price filter. Most large rooms publish none.",
        "room": "One of small, mid, large, by venue capacity tier.",
        "limit": "Default 200, maximum 500. See completeness below."
      }
    },
    {
      "path": "/api/shows/facets",
      "returns": "object",
      "summary": "Filter options for /api/shows: the venues with upcoming listings, and the genre tags carrying at least two.",
      "params": {}
    },
    {
      "path": "/api/shows/ids",
      "returns": "array",
      "summary": "Ids of the currently live listings, for checking whether a saved show is still on.",
      "params": {}
    },
    {
      "path": "/api/venues/{slug}/upcoming",
      "returns": "array",
      "summary": "Upcoming listings for one venue.",
      "params": {}
    },
    {
      "path": "/api/promoters/{slug}/upcoming",
      "returns": "array",
      "summary": "Upcoming listings for one promoter.",
      "params": {}
    },
    {
      "path": "/api/artists/{slug}/shows",
      "returns": "array",
      "summary": "Listings for one artist, upcoming first, then past.",
      "params": {}
    },
    {
      "path": "/api/posters",
      "returns": "object",
      "summary": "Archived show artwork. Returns {posters, complete}, and 503 when the archive cannot be read.",
      "params": {
        "venue": "Venue slug.",
        "artist": "Substring match on the headliner.",
        "year": "Four-digit year of the show date.",
        "shape": "Archive lane: poster or photography.",
        "limit": "Default 200, maximum 500."
      }
    }
  ],
  "snapshots": [
    {
      "path": "/data/shows.json",
      "summary": "Upcoming listings as of the last build. The privacy-safe discovery snapshot."
    },
    {
      "path": "/data/posts.json",
      "summary": "Published articles with full metadata."
    },
    {
      "path": "/data/posts-index.json",
      "summary": "Lightweight article index."
    },
    {
      "path": "/data/venues.json",
      "summary": "Venue directory with location and door policy."
    },
    {
      "path": "/data/genres.json",
      "summary": "Genre directory."
    },
    {
      "path": "/data/releases.json",
      "summary": "Local record releases we track."
    },
    {
      "path": "/data/posters.json",
      "summary": "Archived artwork index."
    },
    {
      "path": "/data/upcoming-events.json",
      "summary": "The homepage upcoming set."
    },
    {
      "path": "/search-index.json",
      "summary": "The site search index across every public entity."
    }
  ],
  "feeds": [
    {
      "path": "/feed.xml",
      "format": "atom",
      "summary": "The 20 newest articles."
    },
    {
      "path": "/rss/shows.xml",
      "format": "rss",
      "summary": "Upcoming shows. Accepts ?genre= to narrow, which is how to watch one genre without an account."
    },
    {
      "path": "/rss/new-shows.xml",
      "format": "rss",
      "summary": "Just-announced shows."
    },
    {
      "path": "/rss/free-shows.xml",
      "format": "rss",
      "summary": "Free shows."
    },
    {
      "path": "/rss/all-ages.xml",
      "format": "rss",
      "summary": "All-ages shows."
    },
    {
      "path": "/rss/show-changes.xml",
      "format": "rss",
      "summary": "Cancellations, postponements and date moves."
    },
    {
      "path": "/rss/releases.xml",
      "format": "rss",
      "summary": "Local record releases."
    },
    {
      "path": "/rss/announcements.xml",
      "format": "rss",
      "summary": "Artist announcements."
    },
    {
      "path": "/ical/shows.ics",
      "format": "ics",
      "summary": "Upcoming shows as a subscribable calendar."
    },
    {
      "path": "/venue/{slug}/shows.xml",
      "format": "rss",
      "summary": "One venue, as a feed."
    },
    {
      "path": "/venue/{slug}/shows.ics",
      "format": "ics",
      "summary": "One venue, as a calendar."
    },
    {
      "path": "/venue/{slug}/shows.json",
      "format": "json",
      "summary": "One venue, as JSON."
    },
    {
      "path": "/promoter/{slug}/shows.xml",
      "format": "rss",
      "summary": "One promoter, as a feed."
    },
    {
      "path": "/promoter/{slug}/shows.ics",
      "format": "ics",
      "summary": "One promoter, as a calendar."
    },
    {
      "path": "/promoter/{slug}/shows.json",
      "format": "json",
      "summary": "One promoter, as JSON."
    }
  ],
  "pages": {
    "sitemap": "/sitemap.xml",
    "robots": "/robots.txt",
    "structuredData": "Listing, article, artist and venue pages carry schema.org JSON-LD (MusicEvent, MusicGroup, MusicVenue, Article) in the served HTML.",
    "rendering": "Pages are prerendered. Every listing is in the HTML without running JavaScript. The exception is /search, which filters the search index in the browser.",
    "humanDocs": "/embed-help"
  },
  "contact": "/contact"
}
