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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

festivalapi-0.2.8.tar.gz (6.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

festivalapi-0.2.8-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file festivalapi-0.2.8.tar.gz.

File metadata

  • Download URL: festivalapi-0.2.8.tar.gz
  • Upload date:
  • Size: 6.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for festivalapi-0.2.8.tar.gz
Algorithm Hash digest
SHA256 1ea24ea0318e436919ccb4ad8933fc65f4c4e5973634012f69db6b7c886bd114
MD5 f87e0a34eb747340923260887e32e9d0
BLAKE2b-256 72e11a3df8322a81deb45a6c8ad5a7707ed0f516e5f69a02c1f65de507ee0e39

See more details on using hashes here.

File details

Details for the file festivalapi-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: festivalapi-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for festivalapi-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 8a0751790bc19b03e8c11edc20b9f39f46317bd0d38562ab6d840d539edfb892
MD5 2e7ac9b49e3f55d3bbcdee80e0b27293
BLAKE2b-256 8b93ec143fbd3474e35a3893a61688904580f3f3cf22016301102bbce482ed83

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.8 This release

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

1 file

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page