Festival API — Python Client
Python client for the Festival API — film festival data for developers: 14,000+ festivals across 190+ countries, with submission deadlines, entry fees, categories, and past winners/screened films.
pip install festivalapi
Quick Start
from festivalapi import FestivalAPI
client = FestivalAPI("fes_your_api_key")
# List festivals by category (supports page/per_page pagination)
festivals = client.festivals.list(category="short_film")
# Pagination: client.festivals.list(category="short_film", page=2, per_page=50)
# Filter by country (full name or code)
us = client.festivals.list(country="United States")
# Keyword search
results = client.festivals.list(q="Cambodia")
# Max entry fee + deadline filters
affordable = client.festivals.list(fee_max=25, deadline_before="2026-12-31")
# Get festival detail
festival = client.festivals.get(1)
# Get festival roster (past winners / screened films)
roster = client.festivals.roster(1)
# Pagination: client.festivals.roster(1, page=2, per_page=50)
# Get scored festivals (ranked 0-100)
scored = client.festivals.scored(min_score=70)
# Pagination: client.festivals.scored(min_score=70, page=2, per_page=50)
# List available category codes (requires auth)
categories = client.categories()
for cat in categories["results"]:
print(f'{cat["category"]} ({cat["count"]})')
# List available countries with festival counts (requires auth)
countries = client.countries()
for c in countries["results"]:
print(f'{c["country"]} ({c["festival_count"]})')
# Health check (no auth)
client.health()
Filters
client.festivals.list() supports:
| Param | Description |
|---|---|
category |
Category code (e.g. short_film, feature, documentary) |
country |
Full country name or code (e.g. United States, US, Australia, AU) |
genre |
Accepted genre (e.g. drama, comedy, horror) |
deadline_before |
Submission deadline before date (YYYY-MM-DD) |
fee_max |
Maximum submission fee in USD |
q |
Full-text search on festival name |
All list endpoints support page and per_page (default per_page is 50).
Endpoints & Credit Costs
Festival API uses a pre-paid credit system (free 50-credit trial on signup, then packs from $20). Each call costs credits:
| Method | Endpoint | Cost |
|---|---|---|
client.health() |
GET /v1/health |
Free |
client.festivals.list() |
GET /v1/festivals |
1 credit |
client.festivals.get(id) |
GET /v1/festivals/{id} |
5 credits |
client.festivals.roster(id) |
GET /v1/festivals/{id}/roster |
3 credits |
client.festivals.scored() |
GET /v1/festivals/scored |
10 credits |
client.categories() |
GET /v1/categories |
1 credit |
client.countries() |
GET /v1/countries |
1 credit |
Categories
Call client.categories() to get all 30 available category codes. Returns:
{
"count": 30,
"results": [
{"category": "short_film", "count": 6308},
{"category": "documentary", "count": 5344},
{"category": "feature", "count": 4609},
{"category": "animation", "count": 3990},
{"category": "music_video", "count": 3176},
{"category": "experimental", "count": 2222},
{"category": "web_series", "count": 2183},
{"category": "branded_content", "count": 1977},
...
]
}
Use the category field (lowercase) as the filter value — e.g. client.festivals.list(category="horror").
Countries
Call client.countries() to get all 192 countries with festival counts. Returns:
{
"count": 192,
"results": [
{"country": "United States", "festival_count": 4060},
...
]
}
Use the country name as the filter value — e.g. client.festivals.list(country="United States").
API Key
Sign up at festivalapi.com to get your free API key (50 free credits, no credit card). Your key starts with fes_. You can also set the FESTIVALAPI_KEY environment variable:
import os
from festivalapi import FestivalAPI
client = FestivalAPI(os.environ["FESTIVALAPI_KEY"])
Error Handling
from festivalapi import (
FestivalAPI,
AuthenticationError,
InsufficientCreditsError,
NotFoundError,
RateLimitError,
ServerError,
)
client = FestivalAPI("fes_your_api_key")
try:
festival = client.festivals.get(999999)
except NotFoundError:
print("Festival not found")
except InsufficientCreditsError as e:
print(f"Need more credits: {e}")
When your credit balance hits zero, API calls return HTTP 402 with your current balance and the required credits. Handle InsufficientCreditsError by alerting the user or pausing calls until credits are purchased.
Full API Reference
- Interactive docs: festivalapi.com/docs
- OpenAPI spec: festivalapi.com/v1/openapi.json
Requirements
- Python 3.9+
- Zero dependencies (stdlib
urllibonly)
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file festivalapi-0.2.7.tar.gz.
File metadata
- Download URL: festivalapi-0.2.7.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58b29852fe62f84289eeb5a968334ba3213e86404b9285a5ca9209b71f66d448
|
|
| MD5 |
1c6dafe7157acbfaeef92abeee1d63bc
|
|
| BLAKE2b-256 |
43d80070e090eaac9f9d8122e825e618fc4188cb513369a7a34f418dd0d172fe
|
File details
Details for the file festivalapi-0.2.7-py3-none-any.whl.
File metadata
- Download URL: festivalapi-0.2.7-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec9e5e9c566980b7cd19ee27389296adb06d1a26b5f9ae7353b8f180681eaefc
|
|
| MD5 |
b488e965be3a26e26a098fda31c20e13
|
|
| BLAKE2b-256 |
3488f10a71bd427227627bcfe751c70ae6fe6ffcc798d1154775eb93922a1b0b
|