Skip to main content

A Python package for accessing JD Wetherspoon's venue and menu data

Project description

Wetherspoons API - Python

A Python package for accessing JD Wetherspoon's venue and menu data, including drink information with pricing and alcohol unit calculations.

This is a Python port of the original TypeScript package by Joss Bird.

⚠️ Disclaimer

THIS SOFTWARE IS PROVIDED FOR EDUCATIONAL AND INFORMATIONAL PURPOSES ONLY.

This is a Python port of the original TypeScript package created by Joss Bird. The original work serves as the foundation for this implementation.

Research Purposes Only: This software is intended solely for research, educational, and informational purposes. There is no intention to harm JD Wetherspoon plc, interfere with their business operations, or violate their terms of service.

The authors and contributors of this software:

  • Are not affiliated with, endorsed by, or connected to JD Wetherspoon plc in any way
  • Do not authorize or condone the use of this software for any purpose that may violate terms of service or applicable laws
  • Accept no responsibility or liability for how this software is used by third parties
  • Make no warranties regarding the accuracy, completeness, or reliability of the data accessed through this API

Users of this software are solely responsible for ensuring their use complies with all applicable laws, terms of service, and regulations. The authors disclaim all liability for any damages, legal issues, or consequences arising from the use of this software.

USE AT YOUR OWN RISK.

Installation

pip install wetherspoons-api-python

MCP Server (Open Standard)

This package includes an MCP (Model Context Protocol) server that provides an open standard interface for the Wetherspoons API. MCP is compatible with various AI systems, not just Claude.

Quick start (uvx):

uvx --from wetherspoons-api-python[mcp] wetherspoons-mcp

Available MCP tools:

  • search_venues - ✅ RECOMMENDED FIRST: Search for venues by name (e.g., "The Watchman") - returns venue_ref for other tools
  • get_venues - ⚠️ Returns up to 796 venues! Use with search param to filter, or use search_venues instead
  • get_venue_details - Get detailed venue information (requires venue_ref from search)
  • get_menus - Fetch menus for a sales area
  • get_menu_details - Get detailed menu information
  • get_drinks - Fetch drinks with price per unit calculation

Recommended workflow:

  1. Use search_venues(name: "The Watchman") to find the venue and get its venue_ref (e.g., 5447)
  2. Use get_venue_details(venue_ref: 5447) to get venue details
  3. Use get_drinks(venue_ref: 5447, sales_area_id: ...) to get drink prices

MCP client configuration:

{
  "mcpServers": {
    "wetherspoons": {
      "command": "uvx",
      "args": ["--from", "wetherspoons-api-python[mcp]", "wetherspoons-mcp"]
    }
  }
}

Or for development:

git clone https://github.com/slack2450/wetherspoons-api.git
cd wetherspoons-api-python
pip install -e .

Features

  • 🏪 Fetch all Wetherspoons venues
  • 📍 Get detailed venue information
  • 🍺 Access venue menus and drinks
  • 💰 Calculate price per unit (PPU) for alcoholic beverages
  • ✅ Type-safe with Pydantic validation
  • 🔄 Automatic handling of different portion sizes

Usage

Get All Venues

from wetherspoons_api import venues

all_venues = venues()
print(all_venues)
# [
#   HighLevelVenue(franchise='lloyds', id=123, is_closed=False, 
#                 name='The Moon Under Water', venue_ref=456),
#   ...
# ]

Get Venue Details

from wetherspoons_api import venues, get_venue

all_venues = venues()
venue = all_venues[0]
details = get_venue(venue)

print(details)
# DetailedVenue(can_place_order=True, franchise='lloyds', id=123,
#              name='The Moon Under Water', sales_areas=[{'id': 789}],
#              venue_can_order=True, venue_ref=456)

Get Drinks with Price Analysis

from wetherspoons_api import venues, get_drinks

all_venues = venues()
venue = all_venues[0]
drinks = get_drinks(venue)

print(drinks)
# [
#   Drink(name='Ruddles Best', units=2.27, product_id=12345,
#         price=249, ppu=109.69),
#   ...
# ]
# Sorted by best value (lowest price per unit first)

Get Menus

from wetherspoons_api import venues, get_venue, get_menus, get_menu

all_venues = venues()
venue = all_venues[0]
details = get_venue(venue)

# Get all menus for a sales area
menus = get_menus(details, details.sales_areas[0]['id'])

# Get detailed menu information
drinks_menu = next((m for m in menus if m.name == 'Drinks'), None)
if drinks_menu:
    detailed_menu = get_menu(drinks_menu)
    print(detailed_menu.data['categories'])

API Reference

Functions

venues() -> List[HighLevelVenue]

Fetches all Wetherspoons venues.

Returns: List of venue objects with basic information.

get_venue(venue: HighLevelVenue) -> DetailedVenue

Gets detailed information about a specific venue.

Parameters:

  • venue: A venue object from venues()

Returns: Detailed venue information including sales areas and ordering capabilities.

get_menus(venue: DetailedVenue, sales_area_id: int) -> List[HighLevelMenu]

Fetches all menus for a specific sales area in a venue.

Parameters:

  • venue: A detailed venue object from get_venue()
  • sales_area_id: The ID of the sales area

Returns: List of menu objects.

get_menu(high_level_menu: HighLevelMenu) -> DetailedMenu

Gets detailed menu information including all products and categories.

Parameters:

  • high_level_menu: A menu object from get_menus()

Returns: Detailed menu with categories, item groups, and products.

get_drinks(high_level_venue: HighLevelVenue) -> List[Drink]

Fetches all drinks from a venue's drinks menu, calculates alcohol units and price per unit, then sorts by best value.

Parameters:

  • high_level_venue: A venue object from venues()

Returns: List of drinks sorted by price per unit (best value first).

Models

HighLevelVenue

class HighLevelVenue:
    franchise: str
    id: int
    is_closed: bool
    name: str
    venue_ref: int
    address: Optional[Address]

DetailedVenue

class DetailedVenue:
    can_place_order: Optional[bool]
    franchise: str
    id: int
    is_closed: Optional[bool]
    name: str
    sales_areas: List[dict]
    venue_can_order: Optional[bool]
    venue_ref: Union[str, int]
    address: Optional[Address]

Drink

class Drink:
    name: str
    units: float        # Alcohol units
    product_id: int
    price: int          # Price in pence
    ppu: float          # Price per unit in pence

How It Works

The package:

  1. Connects to the JD Wetherspoon API
  2. Validates all responses using Pydantic models for type safety
  3. Calculates alcohol units based on ABV and volume information
  4. Determines the best value portion size for each drink
  5. Sorts drinks by price per unit to help find the best deals

Development

# Install dependencies
pip install -r requirements.txt

# Install in development mode
pip install -e .

# Run tests
pytest

# Run tests with coverage
pytest --cov=wetherspoons_api --cov-report=html

# Run specific test
pytest tests/test_api.py::TestVenues::test_venues_filters_open_venues

Testing

The package includes comprehensive unit tests with pytest. Tests use mocking to avoid hitting the live API during development.

# Run all tests
pytest

# Run with verbose output
pytest -v

# Run with coverage
pytest --cov=wetherspoons_api

License

MIT © Joss Bird - Original TypeScript version

Python port maintains the same MIT license.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Issues

Report bugs and feature requests at https://github.com/slack2450/wetherspoons-api/issues

Original TypeScript Version

This is a Python port of the original wetherspoons-api TypeScript package.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wetherspoons_api_python-1.2.3.tar.gz (15.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wetherspoons_api_python-1.2.3-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file wetherspoons_api_python-1.2.3.tar.gz.

File metadata

  • Download URL: wetherspoons_api_python-1.2.3.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wetherspoons_api_python-1.2.3.tar.gz
Algorithm Hash digest
SHA256 cdd9e9d44a6326c7c41da14b41b6cdaef9e737f9856b4c6d2597ac2cbc93badf
MD5 e7932c1507986b6d153a765165bc16b4
BLAKE2b-256 9b10129314415b47b3be45114800205be093607233a7a3535cce9cbd98617ec5

See more details on using hashes here.

Provenance

The following attestation bundles were made for wetherspoons_api_python-1.2.3.tar.gz:

Publisher: publish.yml on jr551/wetherspoons-api-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wetherspoons_api_python-1.2.3-py3-none-any.whl.

File metadata

File hashes

Hashes for wetherspoons_api_python-1.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0cf4bfd2bd94eca40cceb0c0cd80f5495b53d968e64a24749dd9b138fed3cbd6
MD5 77680f50c4e040466665f5e4b474aae5
BLAKE2b-256 77c7b3781d3e05593ec2ecee43861000f914ff669350b0cc242b9803441a6a04

See more details on using hashes here.

Provenance

The following attestation bundles were made for wetherspoons_api_python-1.2.3-py3-none-any.whl:

Publisher: publish.yml on jr551/wetherspoons-api-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page