Discover/Ticketera API
live

Ticketera APIshop.ticketera.com

Search Ticketera events, retrieve ticket prices and seating categories, and check real-time seat availability with 3 endpoints covering Puerto Rico and Latin America.

Endpoints
3
Updated
2mo ago

What is the Ticketera API?

The Ticketera API provides 3 endpoints to query events, pricing, and seat availability on shop.ticketera.com, a vivenu-powered ticketing platform. Use search_events to find events by keyword and retrieve slugs, then pass those slugs to get_event_details for ticket types with prices, venue coordinates, and seating configuration, or to get_empty_seats for a live seat-by-seat availability map.

Try it
Search keyword (e.g. 'basketball', 'concierto'). Use empty string for all events.
api.parse.bot/scraper/c9047e7d-d98b-4ce1-a2c5-5afa9be87ee9/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/c9047e7d-d98b-4ce1-a2c5-5afa9be87ee9/search_events?query=concierto' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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 shop-ticketera-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.

"""
Ticketera Empty Seats API Client

This module provides a client for interacting with the Ticketera Empty Seats API,
which allows you to search for events, get detailed event information, and check
available seats for performances in Puerto Rico.

Get your API key from: https://parse.bot/settings
"""

import os
import requests
from typing import Optional, Dict, Any


class ParseClient:
    """Client for interacting with the Ticketera Empty Seats API via Parse."""

    def __init__(self, api_key: Optional[str] = None):
        """
        Initialize the ParseClient.

        Args:
            api_key: API key for authentication. If not provided, will use
                     PARSE_API_KEY environment variable.

        Raises:
            ValueError: If no API key is provided and PARSE_API_KEY is not set.
        """
        self.base_url = "https://api.parse.bot"
        self.scraper_id = "c9047e7d-d98b-4ce1-a2c5-5afa9be87ee9"
        self.api_key = api_key or os.getenv("PARSE_API_KEY")
        if not self.api_key:
            raise ValueError(
                "API key not provided. Set PARSE_API_KEY environment variable or pass api_key parameter."
            )

    def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
        """
        Make a call to the Parse API.

        Args:
            endpoint: The endpoint name (e.g., 'search_events')
            method: HTTP method ('GET' or 'POST')
            **params: Query parameters or request body parameters

        Returns:
            Parsed JSON response from the API

        Raises:
            requests.exceptions.RequestException: If the API call fails
        """
        url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
        headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}

        if method.upper() == "GET":
            response = requests.get(url, headers=headers, params=params)
        else:
            response = requests.post(url, headers=headers, json=params)

        response.raise_for_status()
        return response.json()

    def search_events(self, query: str) -> Dict[str, Any]:
        """
        Search for events on Ticketera by keyword.

        Args:
            query: Search keyword (e.g., 'basketball', 'concierto').
                   Use empty string for all events.

        Returns:
            Dictionary containing search results with event information
        """
        return self._call("search_events", method="GET", query=query)

    def get_event_details(
        self, event_slug: str, shop_domain: Optional[str] = None
    ) -> Dict[str, Any]:
        """
        Get detailed event information including seating and ticket details.

        Args:
            event_slug: Event slug from search results
            shop_domain: Shop domain hosting the event (auto-detected if not specified)

        Returns:
            Dictionary containing detailed event information
        """
        params = {"event_slug": event_slug}
        if shop_domain:
            params["shop_domain"] = shop_domain
        return self._call("get_event_details", method="GET", **params)

    def get_empty_seats(
        self, event_slug: str, shop_domain: Optional[str] = None
    ) -> Dict[str, Any]:
        """
        Get all empty (available) seats for a seated event.

        Args:
            event_slug: Event slug from search results
            shop_domain: Shop domain hosting the event (auto-detected if not specified)

        Returns:
            Dictionary containing available seats information
        """
        params = {"event_slug": event_slug}
        if shop_domain:
            params["shop_domain"] = shop_domain
        return self._call("get_empty_seats", method="GET", **params)


def main():
    """Demonstrate a practical workflow: search events and check seat availability."""
    client = ParseClient()

    print("=" * 70)
    print("TICKETERA EVENT AVAILABILITY CHECKER")
    print("=" * 70)

    # Step 1: Search for events
    search_query = "basketball"
    print(f"\n🔍 Searching for '{search_query}' events...\n")

    search_results = client.search_events(query=search_query)
    total_events = search_results.get("data", {}).get("total", 0)
    events = search_results.get("data", {}).get("results", [])

    print(f"Found {total_events} event(s)\n")

    if not events:
        print("No events found. Try a different search query.")
        return

    # Step 2: Process each event
    for idx, event in enumerate(events, 1):
        event_name = event.get("name", "Unknown Event")
        event_slug = event.get("event_slug")
        venue = event.get("venue", "Unknown Venue")
        category = event.get("category", "Unknown Category")
        date_html = event.get("date_html", "Date not available")
        ticket_url = event.get("ticket_url", "")

        print(f"\n{'─' * 70}")
        print(f"EVENT {idx}: {event_name}")
        print(f"{'─' * 70}")
        print(f"📍 Venue: {venue}")
        print(f"🏷️  Category: {category}")
        print(f"📅 Date: {date_html}")

        if not event_slug:
            print("⚠️  Event slug not available - skipping details")
            continue

        try:
            # Step 3: Get detailed event information
            print("\n📋 Fetching event details...")
            event_details = client.get_event_details(event_slug=event_slug)
            data = event_details.get("data", {})

            # Display event timing
            start_time = data.get("start", "N/A")
            end_time = data.get("end", "N/A")
            timezone = data.get("timezone", "N/A")
            print(f"   ⏰ Start: {start_time}")
            print(f"   ⏰ End: {end_time}")
            print(f"   🌍 Timezone: {timezone}")

            # Display location information
            location = data.get("location", {})
            if location and any(location.values()):
                print(f"\n   📌 Location:")
                if location.get("address"):
                    print(f"      Address: {location.get('address')}")
                if location.get("city"):
                    print(f"      City: {location.get('city')}")
                if location.get("country"):
                    print(f"      Country: {location.get('country')}")

            # Display seating categories
            categories = data.get("categories", [])
            if categories:
                print(f"\n   🪑 Seating Categories:")
                for cat in categories:
                    cat_name = cat.get("name", "Unknown")
                    total_seats = cat.get("total_seats", 0)
                    print(f"      - {cat_name}: {total_seats} seats")

            # Display available ticket types and prices
            tickets = data.get("tickets", [])
            if tickets:
                print(f"\n   🎫 Available Ticket Types:")
                for ticket in tickets:
                    ticket_name = ticket.get("name", "Unknown")
                    price = ticket.get("price", 0)
                    active = ticket.get("active", False)
                    status = "✓ Available" if active else "✗ Not Available"
                    print(f"      - {ticket_name}: ${price:.2f} ({status})")

            # Step 4: Get seat availability if event has seating
            seating_info = data.get("seating", {})
            if seating_info and seating_info.get("active"):
                print("\n📊 Checking seat availability...")
                empty_seats_data = client.get_empty_seats(event_slug=event_slug)
                seats_info = empty_seats_data.get("data", {})

                total_seats_map = seats_info.get("total_seats_in_map", 0)
                empty_seats_count = seats_info.get("empty_seats_count", 0)
                booked_seats_count = seats_info.get("booked_seats_count", 0)
                sold_out = seats_info.get("sold_out", False)

                occupancy_percent = (
                    (booked_seats_count / total_seats_map * 100)
                    if total_seats_map > 0
                    else 0
                )

                print(f"   Total Capacity: {total_seats_map} seats")
                print(
                    f"   Available: {empty_seats_count} seats ({100 - occupancy_percent:.1f}% free)"
                )
                print(f"   Booked: {booked_seats_count} seats ({occupancy_percent:.1f}% full)")

                if sold_out:
                    print(f"   ⛔ EVENT SOLD OUT")
                else:
                    # Show availability by section
                    section_summary = seats_info.get("section_summary", {})
                    if section_summary:
                        print(f"\n   🗂️  Availability by Section:")
                        for section, count in sorted(
                            section_summary.items(), key=lambda x: str(x[0])
                        ):
                            print(f"      Section {section}: {count} empty seats")

                    # Show sample of available seats
                    empty_seats = seats_info.get("empty_seats", [])
                    if empty_seats:
                        print(f"\n   📍 Sample Available Seats (first 5 of {len(empty_seats)}):")
                        for seat in empty_seats[:5]:
                            section = seat.get("section", "?")
                            row = seat.get("row", "?")
                            seat_num = seat.get("seat", "?")
                            category = seat.get("category", "?")
                            print(
                                f"      • Section {section}, Row {row}, Seat {seat_num} ({category})"
                            )
                        if len(empty_seats) > 5:
                            print(f"      ... and {len(empty_seats) - 5} more available seats")

                        if ticket_url:
                            print(f"\n   🔗 Get Tickets: {ticket_url}")
            else:
                print("   ℹ️  This event does not have assigned seating")

        except requests.exceptions.RequestException as e:
            print(f"   ❌ Error fetching event details: {e}")
        except Exception as e:
            print(f"   ❌ Unexpected error: {e}")

    print(f"\n{'=' * 70}")
    print("✅ Availability check complete!")
    print("=" * 70)


if __name__ == "__main__":
    main()
All endpoints · 3 totalmissing one? ·

Search for events on Ticketera by keyword. Returns event names, venues, dates, ticket URLs, and event slugs that can be used with other endpoints.

Input
ParamTypeDescription
queryrequiredstringSearch keyword (e.g. 'basketball', 'concierto'). Use empty string for all events.
Response
{
  "type": "object",
  "fields": {
    "query": "string — the search term used",
    "total": "integer — number of results returned",
    "results": "array of event objects with id, name, date_html, venue, category, image, detail_url, ticket_url, event_slug, type"
  },
  "sample": {
    "data": {
      "query": "basketball",
      "total": 1,
      "results": [
        {
          "id": "2010",
          "name": "Criollos de Caguas BSN 2026 - Temporada Regular",
          "type": "events",
          "image": "https://www.ticketera.com/assets/img/New-Project-48304be501.jpg",
          "venue": "Coliseo Roger Mendoza",
          "category": "Deportes",
          "date_html": "<span class=\"m\">Mar</span> <span class=\"d\">31</span> - <span class=\"m\">May</span> <span class=\"d\">30</span><span class=\"y\">, 2026</span>",
          "detail_url": "https://www.ticketera.com/events/detail/criollos-de-caguas-bsn-2026-temporada-regular",
          "event_slug": "",
          "ticket_url": "https://www.ticketera.com/events/detail/criollos-de-caguas-bsn-2026-temporada-regular"
        }
      ]
    },
    "status": "success"
  }
}

About the Ticketera API

Event Search and Discovery

The search_events endpoint accepts a keyword query string — Spanish or English terms both work, e.g. 'concierto' or 'basketball' — and returns an array of event objects with fields including id, name, date_html, venue, category, image, detail_url, ticket_url, and event_slug. The event_slug is the key input required by the other two endpoints. Passing an empty string for query returns all available events.

Event Details and Ticket Pricing

get_event_details takes an event_slug and an optional shop_domain (defaults are auto-detected, but Ticketera hosts multiple subdomains such as choli.ticketera.com and cmh.ticketera.com). The response includes start and end as ISO datetimes, a location object with name, address, city, latitude, and longitude, a tickets array where each entry carries name, price, active, and category_ref, and a categories array with name, ref, seating_reference, and total_seats. The seating object indicates whether the event uses assigned seating via the active boolean.

Real-Time Seat Availability

get_empty_seats is only relevant when seating.active is true in the event details response. It returns an empty_seats array where each object includes seat_id, section, row, seat, and category, plus a section_summary map that groups available seat counts by section name. The response also surfaces empty_seats_count, booked_seats_count, and total_seats_in_map so you can compute fill rates. If no seats remain, sold_out is returned as true.

Reliability & maintenance

The Ticketera API is a managed, monitored endpoint for shop.ticketera.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when shop.ticketera.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 shop.ticketera.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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Display upcoming concerts and shows in Puerto Rico filtered by category using search_events.
  • Build a ticket price comparison view by pulling the tickets array from get_event_details across multiple events.
  • Show a section-level seat availability heatmap using section_summary from get_empty_seats.
  • Alert users when seats become available in a specific section by polling get_empty_seats for low empty_seats_count.
  • Enrich event listings with venue geocoordinates (latitude, longitude) from get_event_details for a map view.
  • Track sold-out events by monitoring the sold_out boolean across multiple event slugs.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does Ticketera have an official public developer API?+
Ticketera is built on the vivenu platform. vivenu does publish a developer API at https://developer.vivenu.com, but it requires a vendor account and is not publicly accessible for reading arbitrary event data. This Parse API covers public event data without requiring a vendor account.
What does `get_empty_seats` return for a general-admission event?+
General-admission events where seating.active is false in get_event_details are not supported by get_empty_seats. The endpoint is designed for assigned-seating events and returns per-seat detail including section, row, and seat identifiers. For GA events, ticket availability is indicated by the active field on each entry in the tickets array from get_event_details.
Does the API cover events on Ticketera subdomains other than shop.ticketera.com?+
Yes. Both get_event_details and get_empty_seats accept an optional shop_domain parameter. Known subdomains include choli.ticketera.com and cmh.ticketera.com. If shop_domain is omitted, the API attempts to auto-detect the correct domain from the event slug.
Can I retrieve order history or user purchase data through this API?+
No. The API covers event discovery, ticket pricing, and seat availability — all publicly visible data. Authenticated user data such as order history, booking confirmations, or account details is not exposed. You can fork this API on Parse and revise it to add endpoints that target any additional public surfaces on Ticketera.
Does `search_events` support pagination for large result sets?+
The endpoint returns a total count alongside the results array, but there are no page or offset parameters currently exposed. If you need to paginate across a large event catalog, you can fork this API on Parse and revise it to add pagination support.
Page content last updated . Spec covers 3 endpoints from shop.ticketera.com.
Related APIs in EntertainmentSee all →
seatgeek.com API
Search for events and performers, view ticket listings with pricing data, and explore venue information across multiple event categories. Get real-time insights into event details, ticket price trends, and what's currently trending to help you find and compare tickets.
SeeTickets.com API
Search for events and get detailed information about tickets, venues, and event categories on See Tickets. Browse upcoming events by category, view venue details, and find what you're looking for with search suggestions.
etix.com API
Search for live events across venues and categories, discover what's playing today or this weekend, and check real-time ticket availability for concerts, shows, and other ticketed events. Get detailed event information and browse featured homepage listings to find and book tickets for your next outing.
eventbrite.com API
Search Eventbrite for events by keyword, location, or category. Retrieve full event details, ticket pricing and availability, organizer profiles, and batch event data.
stubhub.com API
Search and discover tickets across StubHub's marketplace by looking up events, performers, and categories to find exactly what you want to attend. Browse event details, performer schedules, and curated category collections to compare available tickets and make informed purchasing decisions.
marketplace.ticketek.com.au API
Search and browse resale tickets on Ticketek Marketplace across Australian events by keyword, view available performances and dates, and check detailed ticket listings with current pricing. Find all available ticket types for any city on a specific date to discover live entertainment options.
viagogo.com API
Search for events and browse tickets across Viagogo's catalog, discovering performer schedules, ticket listings, and categories all in one place. Get detailed information about available tickets and events to find exactly what you're looking for.
vividseats.com API
Search for events, venues, and performers, then browse current ticket listings with detailed seat information and pricing to find the perfect show. Analyze historical sales data to track ticket price trends and make informed purchasing decisions.