Skip to main content

Festival API — Python Client

PyPI version Python License: MIT

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
sort Sort field: name (default), deadline, or event_date
sort_dir Sort direction: asc (default) or desc (date sorts keep unknown dates last)

All list endpoints support page and per_page (default per_page is 50).

# Nearest deadlines first
upcoming = client.festivals.list(sort="deadline", sort_dir="asc")
# Latest event dates first
latest = client.festivals.list(sort="event_date", sort_dir="desc")

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

Requirements

  • Python 3.9+
  • Zero dependencies (stdlib urllib only)

License

MIT

Metadata

Release files for festivalapi 0.2.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for festivalapi 0.2.8
File Size Uploaded
festivalapi-0.2.8.tar.gz 6.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for festivalapi 0.2.8
File Interpreter ABI Platform
festivalapi-0.2.8-py3-none-any.whl Python 3 none any Details

Total release size: 12.7 kB

Release files / festivalapi-0.2.8.tar.gz

Download URL festivalapi-0.2.8.tar.gz
Size 6.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1ea24ea0318e436919ccb4ad8933fc65f4c4e5973634012f69db6b7c886bd114
BLAKE2b-256 checksum
How to use checksums
72e11a3df8322a81deb45a6c8ad5a7707ed0f516e5f69a02c1f65de507ee0e39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / festivalapi-0.2.8-py3-none-any.whl

Download URL festivalapi-0.2.8-py3-none-any.whl
Size 6.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8a0751790bc19b03e8c11edc20b9f39f46317bd0d38562ab6d840d539edfb892
BLAKE2b-256 checksum
How to use checksums
8b93ec143fbd3474e35a3893a61688904580f3f3cf22016301102bbce482ed83
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

0.2.8 This release

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

1 release file

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page