ticketmaster-api
Integrate with Ticketmaster Discovery API to search events, attractions, venues, and classifications. Use when building event discovery apps, ticket platforms, venue finders, or entertainment search features. Access 230K+ events across US, Canada, Mexico, Australia, UK, and Europe. Includes authentication, rate limiting, and comprehensive API examples.
When & Why to Use This Skill
This Claude skill enables seamless integration with the Ticketmaster Discovery API, providing developers with structured access to a massive database of over 230,000 global events, venues, and attractions. It streamlines the development process by offering pre-configured authentication logic, rate-limit management, and comprehensive code examples for searching concerts, sports, and entertainment across North America, Europe, and Australia.
Use Cases
- Building event discovery applications that allow users to find local concerts, sports, and theater performances.
- Implementing location-based search features using geographic coordinates or postal codes to find nearby entertainment.
- Integrating real-time venue information, artist details, and event imagery into travel or lifestyle websites.
- Developing smart search bars with autocomplete suggestions for artists, teams, and event venues.
- Creating automated event calendars and listing services filtered by specific genres, classifications, or date ranges.
| name | ticketmaster-api |
|---|---|
| description | Integrate with Ticketmaster Discovery API to search events, attractions, venues, and classifications. Use when building event discovery apps, ticket platforms, venue finders, or entertainment search features. Access 230K+ events across US, Canada, Mexico, Australia, UK, and Europe. Includes authentication, rate limiting, and comprehensive API examples. |
When to Use This Skill
Use this skill when you need to work with Ticketmaster, including:
- Searching for concerts, sports events, and entertainment
- Building event discovery applications
- Integrating ticket information into websites or apps
- Finding venues and their details
- Searching for artists, sports teams, and attractions
- Implementing location-based event search
- Displaying event images and pricing information
- Building event calendars and listings
Overview
Ticketmaster Discovery API provides access to a comprehensive database of over 230,000+ events across multiple countries including the United States, Canada, Mexico, Australia, New Zealand, United Kingdom, Ireland, and other European countries.
Key Resources:
- https://developer.ticketmaster.com/products-and-docs/apis/getting-started/
- https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/
- Developer Portal: https://developer.ticketmaster.com/
Data Sources:
- Ticketmaster
- Universe
- FrontGate Tickets
- Ticketmaster Resale (TMR)
API Overview
Base URL
https://app.ticketmaster.com/{package}/{version}/{resource}.json?apikey={YOUR_KEY}
Components:
package: API package (e.g., discovery, commerce)version: API version (v1, v2, v3)resource: Endpoint resourceapikey: Your API key (required)
Discovery API v2 Base URL
https://app.ticketmaster.com/discovery/v2/
Authentication
Getting an API Key
- Register: Visit https://developer.ticketmaster.com/
- Login or Create Account: Register for an API key
- Get API Key: Available immediately in your dashboard
- Use in Requests: Append as
apikeyquery parameter
Example:
https://app.ticketmaster.com/discovery/v2/events.json?apikey=YOUR_API_KEY
API Key Usage
# All requests require apikey parameter
curl 'https://app.ticketmaster.com/discovery/v2/events.json?apikey=AbCdEfGh123456'
Error without API key:
{
"fault": {
"faultstring": "Invalid ApiKey",
"detail": {
"errorcode": "oauth.v2.InvalidApiKey"
}
}
}
Rate Limits
Default Limits
- Daily Quota: 5,000 API calls per day
- Rate Limit: 5 requests per second
- Pagination Limit: size × page < 1,000
Monitoring Usage
Response headers indicate your usage:
Rate-Limit: 5000
Rate-Limit-Available: 4723
Rate-Limit-Reset: 1445461429
Headers:
Rate-Limit: Total daily quotaRate-Limit-Available: Remaining requestsRate-Limit-Reset: UTC timestamp when quota resets
Rate Limit Exceeded
HTTP 429 Response:
{
"fault": {
"faultstring": "Rate limit quota violation. Quota limit exceeded.",
"detail": {
"errorcode": "policies.ratelimit.QuotaViolation"
}
}
}
Requesting Higher Limits
To increase limits:
- Demonstrate Terms of Service compliance
- Follow brand guidelines
- Proper data representation
- Contact Ticketmaster developer support
Core Endpoints
1. Search Events
Endpoint: GET /discovery/v2/events
Search for events with extensive filtering options.
Example Request:
curl 'https://app.ticketmaster.com/discovery/v2/events.json?city=Los+Angeles&classificationName=music&apikey=YOUR_KEY'
Key Parameters:
| Parameter | Type | Description |
|---|---|---|
keyword |
string | Search term for events |
attractionId |
string | Filter by performer/attraction |
venueId |
string | Filter by venue |
city |
array | Filter by city |
countryCode |
string | Country code (US, CA, MX, etc.) |
stateCode |
string | State/province code |
postalCode |
string | ZIP/postal code |
classificationName |
array | Genre/segment (e.g., music, sports) |
dmaId |
string | Designated Market Area ID |
startDateTime |
string | Start date filter (ISO 8601) |
endDateTime |
string | End date filter (ISO 8601) |
size |
string | Results per page (default: 20) |
page |
string | Page number (default: 0) |
sort |
string | Sort order |
Sorting Options:
name,asc/name,desc- Event namedate,asc/date,desc- Event daterelevance,desc- Search relevancedistance,asc- Distance from locationvenueName,asc/venueName,desc- Venue nameonSaleStartDate,asc/onSaleStartDate,desc- Sale daterandom- Random order
Response Example:
{
"_embedded": {
"events": [
{
"name": "Taylor Swift | The Eras Tour",
"type": "event",
"id": "Z7r9jZ1AdFKdo",
"url": "https://www.ticketmaster.com/event/Z7r9jZ1AdFKdo",
"locale": "en-us",
"images": [
{
"ratio": "16_9",
"url": "https://s1.ticketm.net/dam/a/123/abc-def-123.jpg",
"width": 1024,
"height": 576
}
],
"sales": {
"public": {
"startDateTime": "2024-11-15T10:00:00Z",
"endDateTime": "2024-12-01T02:00:00Z"
}
},
"dates": {
"start": {
"localDate": "2024-12-01",
"localTime": "19:00:00"
},
"timezone": "America/Los_Angeles"
},
"_embedded": {
"venues": [
{
"name": "SoFi Stadium",
"type": "venue",
"id": "KovZpZAEAlaA",
"city": {
"name": "Inglewood"
},
"state": {
"name": "California",
"stateCode": "CA"
},
"country": {
"name": "United States Of America",
"countryCode": "US"
},
"location": {
"longitude": "-118.33778",
"latitude": "33.95361"
}
}
],
"attractions": [
{
"name": "Taylor Swift",
"type": "attraction",
"id": "K8vZ917Gku7",
"classifications": [
{
"primary": true,
"segment": {
"id": "KZFzniwnSyZfZ7v7nJ",
"name": "Music"
},
"genre": {
"id": "KnvZfZ7vAeA",
"name": "Pop"
}
}
]
}
]
}
}
]
},
"page": {
"size": 20,
"totalElements": 1523,
"totalPages": 77,
"number": 0
}
}
2. Get Event Details
Endpoint: GET /discovery/v2/events/{id}
Retrieve detailed information about a specific event.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/events/Z7r9jZ1AdFKdo.json?apikey=YOUR_KEY'
3. Get Event Images
Endpoint: GET /discovery/v2/events/{id}/images
Retrieve all images associated with an event.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/events/Z7r9jZ1AdFKdo/images.json?apikey=YOUR_KEY'
Response:
{
"type": "event",
"id": "Z7r9jZ1AdFKdo",
"images": [
{
"ratio": "16_9",
"url": "https://s1.ticketm.net/dam/a/123/abc-def-123.jpg",
"width": 2048,
"height": 1152,
"fallback": false
},
{
"ratio": "3_2",
"url": "https://s1.ticketm.net/dam/a/456/def-ghi-456.jpg",
"width": 1024,
"height": 683,
"fallback": false
}
]
}
4. Search Attractions
Endpoint: GET /discovery/v2/attractions
Find artists, sports teams, and performers.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/attractions.json?keyword=Taylor+Swift&apikey=YOUR_KEY'
5. Search Venues
Endpoint: GET /discovery/v2/venues
Search for venues and locations.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/venues.json?city=New+York&apikey=YOUR_KEY'
6. Get Classifications
Endpoint: GET /discovery/v2/classifications
Browse event categories, genres, and segments.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/classifications.json?apikey=YOUR_KEY'
Response Structure:
{
"_embedded": {
"classifications": [
{
"segment": {
"id": "KZFzniwnSyZfZ7v7nJ",
"name": "Music"
},
"_embedded": {
"genres": [
{
"id": "KnvZfZ7vAeA",
"name": "Pop"
},
{
"id": "KnvZfZ7vAv6",
"name": "Rock"
}
]
}
}
]
}
}
7. Search Suggestions
Endpoint: GET /discovery/v2/suggest
Get autocomplete suggestions for event search.
Example:
curl 'https://app.ticketmaster.com/discovery/v2/suggest.json?keyword=swift&apikey=YOUR_KEY'
Common Use Cases
Use Case 1: Find Events by Location
Search events in a specific city:
const axios = require('axios');
async function findEventsByCity(city, apiKey) {
const response = await axios.get(
'https://app.ticketmaster.com/discovery/v2/events.json',
{
params: {
city: city,
size: 10,
apikey: apiKey
}
}
);
return response.data._embedded.events;
}
// Usage
findEventsByCity('San Francisco', 'YOUR_API_KEY')
.then(events => {
events.forEach(event => {
console.log(`${event.name} - ${event.dates.start.localDate}`);
});
});
Use Case 2: Geographic Radius Search
Find events within a radius:
import requests
def find_events_nearby(postal_code, radius, api_key):
"""Find events within radius of postal code"""
url = 'https://app.ticketmaster.com/discovery/v2/events.json'
params = {
'postalCode': postal_code,
'radius': radius,
'unit': 'miles', # or 'km'
'sort': 'distance,asc',
'apikey': api_key
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
return data['_embedded']['events']
else:
raise Exception(f"API Error: {response.status_code}")
# Usage
events = find_events_nearby('90210', '25', 'YOUR_API_KEY')
for event in events:
venue = event['_embedded']['venues'][0]
print(f"{event['name']} at {venue['name']}")
Use Case 3: Filter by Classification
Search for specific event types:
import requests
def search_music_events(genre, city, api_key):
"""Search for music events by genre"""
params = {
'classificationName': 'music',
'genreId': genre,
'city': city,
'sort': 'date,asc',
'apikey': api_key
}
response = requests.get(
'https://app.ticketmaster.com/discovery/v2/events.json',
params=params
)
return response.json()
# Example: Find Pop concerts in Los Angeles
results = search_music_events('KnvZfZ7vAeA', 'Los Angeles', 'YOUR_API_KEY')
Use Case 4: Date Range Search
Find events in a specific timeframe:
async function findEventsByDateRange(startDate, endDate, apiKey) {
const params = new URLSearchParams({
startDateTime: startDate, // ISO 8601: 2024-12-01T00:00:00Z
endDateTime: endDate,
sort: 'date,asc',
size: 20,
apikey: apiKey
});
const response = await fetch(
`https://app.ticketmaster.com/discovery/v2/events.json?${params}`
);
const data = await response.json();
return data._embedded.events;
}
// Find events in December 2024
findEventsByDateRange(
'2024-12-01T00:00:00Z',
'2024-12-31T23:59:59Z',
'YOUR_API_KEY'
);
Use Case 5: Event Details with Images
Get complete event information:
import requests
class TicketmasterClient:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = 'https://app.ticketmaster.com/discovery/v2'
def get_event_details(self, event_id):
"""Get detailed event information"""
url = f'{self.base_url}/events/{event_id}.json'
response = requests.get(url, params={'apikey': self.api_key})
return response.json()
def get_event_images(self, event_id):
"""Get all images for an event"""
url = f'{self.base_url}/events/{event_id}/images.json'
response = requests.get(url, params={'apikey': self.api_key})
return response.json()
def get_high_res_image(self, event_id):
"""Get highest resolution image"""
images_data = self.get_event_images(event_id)
# Find largest image
largest = max(
images_data['images'],
key=lambda img: img['width'] * img['height']
)
return largest['url']
# Usage
client = TicketmasterClient('YOUR_API_KEY')
event = client.get_event_details('Z7r9jZ1AdFKdo')
image_url = client.get_high_res_image('Z7r9jZ1AdFKdo')
print(f"Event: {event['name']}")
print(f"Image: {image_url}")
Best Practices
1. API Key Security
# ✅ Good: Use environment variables
import os
API_KEY = os.getenv('TICKETMASTER_API_KEY')
# ❌ Bad: Hardcode API key
API_KEY = 'AbCdEfGh123456'
2. Rate Limit Management
import time
import requests
class RateLimitedClient:
def __init__(self, api_key):
self.api_key = api_key
self.requests_this_second = 0
self.last_request_time = time.time()
def make_request(self, url, params):
"""Make request with rate limiting"""
# Wait if we've hit 5 requests this second
current_time = time.time()
if current_time - self.last_request_time < 1:
if self.requests_this_second >= 5:
time.sleep(1 - (current_time - self.last_request_time))
self.requests_this_second = 0
self.last_request_time = time.time()
else:
self.requests_this_second = 0
self.last_request_time = current_time
params['apikey'] = self.api_key
response = requests.get(url, params=params)
self.requests_this_second += 1
# Check response headers
if 'Rate-Limit-Available' in response.headers:
remaining = int(response.headers['Rate-Limit-Available'])
if remaining < 100:
print(f"Warning: Only {remaining} requests remaining today")
return response
3. Error Handling
def safe_api_call(url, params, api_key):
"""Make API call with comprehensive error handling"""
params['apikey'] = api_key
try:
response = requests.get(url, params=params, timeout=10)
if response.status_code == 200:
return response.json()
elif response.status_code == 401:
raise ValueError("Invalid API key")
elif response.status_code == 429:
raise ValueError("Rate limit exceeded")
elif response.status_code == 404:
return None # Resource not found
else:
raise Exception(f"API error: {response.status_code}")
except requests.exceptions.Timeout:
raise Exception("Request timeout")
except requests.exceptions.RequestException as e:
raise Exception(f"Request failed: {e}")
4. Pagination
def get_all_results(base_url, params, api_key, max_pages=10):
"""Retrieve all results with pagination"""
all_events = []
page = 0
params['apikey'] = api_key
while page < max_pages:
params['page'] = page
response = requests.get(base_url, params=params)
data = response.json()
if '_embedded' not in data or 'events' not in data['_embedded']:
break
events = data['_embedded']['events']
all_events.extend(events)
# Check if there are more pages
page_info = data['page']
if page >= page_info['totalPages'] - 1:
break
page += 1
return all_events
# Usage
events = get_all_results(
'https://app.ticketmaster.com/discovery/v2/events.json',
{'city': 'Chicago', 'size': 20},
'YOUR_API_KEY',
max_pages=5
)
5. Caching
from functools import lru_cache
import hashlib
import json
@lru_cache(maxsize=128)
def cached_search(search_params_json):
"""Cache API results to reduce calls"""
params = json.loads(search_params_json)
# Make API call
return fetch_events(params)
# Usage with immutable parameters
params = json.dumps({'city': 'Boston', 'size': 10}, sort_keys=True)
results = cached_search(params)
Advanced Features
1. Location-Based Search with Coordinates
// Search using latitude/longitude
const params = {
latlong: '34.0522,-118.2437', // Los Angeles
radius: '50',
unit: 'miles',
sort: 'distance,asc',
apikey: API_KEY
};
2. Negative Filtering
// Exclude specific classifications
const params = {
city: 'New York',
classificationName: '-sports,-theatre', // Exclude sports and theatre
apikey: API_KEY
};
3. Multi-City Search
// Search across multiple cities
const params = {
city: ['Los Angeles', 'San Francisco', 'San Diego'],
stateCode: 'CA',
apikey: API_KEY
};
4. Source Filtering
// Filter by data source
const params = {
source: 'ticketmaster', // or 'universe', 'frontgate', 'tmr'
apikey: API_KEY
};
Response Format
HAL Format
All responses use HAL (Hypertext Application Language):
{
"_links": {
"self": {
"href": "/discovery/v2/events?page=0&size=20"
},
"next": {
"href": "/discovery/v2/events?page=1&size=20"
}
},
"_embedded": {
"events": [...]
},
"page": {
"size": 20,
"totalElements": 500,
"totalPages": 25,
"number": 0
}
}
Image Formats
Images are available in multiple aspect ratios:
16_9: Widescreen (1920×1080, 1024×576, etc.)3_2: Standard (1024×683, 640×427, etc.)4_3: Traditional (800×600, 640×480, etc.)
Troubleshooting
Issue 1: Invalid API Key
Error:
{
"fault": {
"faultstring": "Invalid ApiKey"
}
}
Solutions:
- Verify API key in developer portal
- Check apikey parameter spelling
- Ensure no extra spaces in key
- Regenerate API key if needed
Issue 2: Rate Limit Exceeded
Error:
{
"fault": {
"faultstring": "Rate limit quota violation"
}
}
Solutions:
- Check
Rate-Limit-Availableheader - Implement rate limiting in code
- Cache responses to reduce calls
- Request higher limits if needed
Issue 3: No Results Found
Solutions:
- Broaden search criteria
- Check date ranges
- Verify location parameters
- Remove overly restrictive filters
- Check for typos in keywords
Issue 4: Pagination Limit
Error: No results beyond page 50 with size=20
Solution:
# Pagination limit: size × page < 1000
# Use smaller page size to go deeper
params = {
'size': 10, # Smaller size allows more pages
'page': 95, # Can now go to page 95 (10 × 95 < 1000)
'apikey': API_KEY
}
Integration Examples
React Component
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function EventSearch() {
const [events, setEvents] = useState([]);
const [city, setCity] = useState('');
const API_KEY = process.env.REACT_APP_TICKETMASTER_KEY;
const searchEvents = async () => {
const response = await axios.get(
'https://app.ticketmaster.com/discovery/v2/events.json',
{
params: {
city: city,
size: 10,
apikey: API_KEY
}
}
);
setEvents(response.data._embedded?.events || []);
};
return (
<div>
<input
type="text"
value={city}
onChange={(e) => setCity(e.target.value)}
placeholder="Enter city"
/>
<button onClick={searchEvents}>Search</button>
<div>
{events.map(event => (
<div key={event.id}>
<h3>{event.name}</h3>
<p>{event.dates.start.localDate}</p>
<img src={event.images[0]?.url} alt={event.name} />
</div>
))}
</div>
</div>
);
}
Node.js Express API
const express = require('express');
const axios = require('axios');
const app = express();
const API_KEY = process.env.TICKETMASTER_API_KEY;
app.get('/api/events', async (req, res) => {
try {
const { city, keyword, startDate, endDate } = req.query;
const response = await axios.get(
'https://app.ticketmaster.com/discovery/v2/events.json',
{
params: {
city,
keyword,
startDateTime: startDate,
endDateTime: endDate,
sort: 'date,asc',
apikey: API_KEY
}
}
);
res.json(response.data);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000);
Resources
Official Documentation
- Main Docs: https://developer.ticketmaster.com/products-and-docs/apis/getting-started/
- Discovery API: https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/
- Developer Portal: https://developer.ticketmaster.com/
- API Console: https://developer.ticketmaster.com/api-explorer/
API Coverage
- 230K+ Events across multiple countries
- Countries: US, Canada, Mexico, Australia, New Zealand, UK, Ireland, Europe
Related APIs
- Commerce API: Event offers and pricing
- Partner API: Advanced transaction capabilities
- International Discovery: Region-specific endpoints
Support
- Developer Forum: https://developer-support.ticketmaster.com/
- Email: developersupport@ticketmaster.com
Version Information
Last Updated: 2025-12-15 Skill Version: 1.0.0 API Version: Discovery API v2
Note: Always refer to the latest official Ticketmaster documentation for up-to-date information on API changes, new features, and best practices.