ticketmaster-api
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.
More from aeonbridge/ab-anthropic-claude-skills
evolution-api
Comprehensive skill for Evolution API - open-source WhatsApp integration platform with multi-service chatbot and automation support
68graphiti
Comprehensive skill for Graphiti and Zep - temporal knowledge graph framework for AI agents with dynamic context engineering
26langextract
Extract structured information from unstructured text using LLMs with source grounding. Use when extracting entities from documents, medical notes, clinical reports, or any text requiring precise, traceable extraction. Supports Gemini, OpenAI, and local models (Ollama). Includes visualization and long document processing.
18graphrag
Comprehensive skill for Microsoft GraphRAG - modular graph-based RAG system for reasoning over private datasets
12yt-dlp
Comprehensive skill for yt-dlp - feature-rich command-line audio/video downloader supporting thousands of sites
6agno
Comprehensive skill for building, deploying, and managing multi-agent AI systems with Agno framework
3