Quizbowl Packets APIquizbowlpackets.com ↗
Access quizbowl question sets across HS, College, Middle School, and Pop Culture sections. Browse, filter, and retrieve packet download URLs via 3 endpoints.
What is the Quizbowl Packets API?
The quizbowlpackets.com API exposes 3 endpoints for browsing, filtering, and retrieving quizbowl question sets across four competition levels. The list_sets endpoint returns paginated set summaries including difficulty, set type, subjects, and year metadata. The get_set_details endpoint returns individual packet download URLs, file sizes, and editor comments for a given set. The search_sets endpoint runs case-insensitive text matching across set names, comments, and notes in one or all sections simultaneously.
curl -X GET 'https://api.parse.bot/scraper/c7250b51-eda1-4286-a4a8-90fb4dfc0367/list_sets?year=2025&limit=10&offset=0§ion=hs&subject=All-Subject&set_type=1&difficulty=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace quizbowlpackets-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Quizbowl Packets Archive API — typed SDK usage example.
Browse and search quizbowl question sets across all sections,
filter by difficulty and type, then drill into packet details.
"""
from parse_apis.quizbowl_packets_archive_api import (
QuizbowlPackets, QuestionSetSummary, Section, Difficulty, SetType
)
client = QuizbowlPackets()
# List recent high school tournament sets at Nationals difficulty
for summary in client.questionsetsummaries.list(
section=Section.HS, difficulty=Difficulty.NATIONALS, set_type=SetType.TOURNAMENT, limit=3
):
print(summary.set_name, summary.difficulty_label, summary.set_post_date)
# Search across all sections for sets matching "ACF"
for result in client.questionsetsummaries.search(query="ACF", limit=5):
print(result.set_id, result.set_name, result.section_name)
# Drill into a specific set's full details including packets
detail = client.questionsets.get(set_id=1)
print(detail.set_name, detail.season, detail.packet_count)
for packet in detail.packets:
print(packet.packet_name, packet.file_size, packet.is_finals)
# Construct a summary by ID and navigate to its detail
known = QuestionSetSummary(_api=client, set_id=3501)
full = known.details()
print(full.set_name, full.subjects, full.qrc_url)
List all quizbowl question sets for a given section with optional filtering by difficulty, set type, subject, and year. Returns paginated results sorted by most recently posted. Each section (hs, college, ms, popculture) maps to a separate subdomain. The full dataset for a section is fetched server-side and filtered client-side, so total reflects post-filter count.
| Param | Type | Description |
|---|---|---|
| year | string | Filter by year substring in the date field (e.g., '2024', '2025') |
| limit | integer | Maximum number of results to return |
| offset | integer | Number of results to skip for pagination |
| section | string | Section to list sets from. Accepted values: hs, college, ms, popculture |
| subject | string | Filter by subject keyword matched against the subjects field (e.g., 'History', 'Literature', 'All-Subject') |
| set_type | string | Filter by set type. Accepted values: 1 (Tournament), 2 (Side Event), 3 (One-off Packet), 4 (Theme Tournament), or label names: tournament, side event, one-off packet, theme tournament |
| difficulty | string | Filter by difficulty level. Accepted values: 1 (Novice), 2 (Regular), 3 (Regular-Plus), 4 (Nationals), or label names: novice, regular, regular-plus, nationals |
{
"type": "object",
"fields": {
"sets": "array of question set summary objects with set_id, set_name, difficulty, difficulty_label, set_type, set_type_label, subjects, year, and other metadata",
"limit": "integer pagination limit applied",
"total": "integer total matching sets before pagination",
"offset": "integer pagination offset applied",
"section": "string section code",
"section_name": "string human-readable section name"
},
"sample": {
"data": {
"sets": [
{
"year": "2026-03-31T00:00:00.000Z",
"set_id": 3501,
"section": "hs",
"comments": "HS Nats prep set also used for college mirrors",
"set_name": "2025 HISTONE",
"set_type": 1,
"subjects": "All-Subject",
"brief_note": "",
"difficulty": 4,
"archive_url": null,
"recommended": 0,
"section_name": "High School",
"set_post_date": "2026-04-02T15:46:56.000Z",
"discussion_url": "https://hsquizbowl.org/forums/viewtopic.php?t=29216",
"set_type_label": "Tournament",
"create_timestamp": "2026-04-01T04:49:55.000Z",
"difficulty_label": "Nationals",
"modified_timestamp": "2026-04-02T15:46:56.000Z"
}
],
"limit": 5,
"total": 604,
"offset": 0,
"section": "hs",
"section_name": "High School"
},
"status": "success"
}
}About the Quizbowl Packets API
Browsing and Filtering Sets
The list_sets endpoint accepts a section parameter (hs, college, ms, or popculture) and returns a paginated array of set summary objects. Each object includes set_id, set_name, difficulty (integer 1–4 mapping to Novice, Regular, Regular-Plus, or Nationals), difficulty_label, set_type (Tournament, Side Event, One-off Packet, or Theme Tournament), subjects, and year. You can combine filters — for example, passing difficulty=2, subject=History, and year=2024 to narrow results to Regular-difficulty history sets from 2024 in a specific section. Results are sorted by most recently posted and support limit/offset for pagination alongside a total count of matching records.
Set Details and Packet Downloads
The get_set_details endpoint takes a set_id (obtained from list_sets or search_sets) and returns a packets array where each element includes packet_name, packet_number, packet_url (direct download link), file_size, is_finals, and is_tiebreaker flags. The response also carries top-level fields like set_name, season (e.g. 2009-2010), subjects, comments (editor notes when present), qrc_url (a link to the question set's entry in the question database, or null), and packet_count.
Cross-Section Search
The search_sets endpoint accepts a required query string and an optional section filter. When section is omitted, the search runs across all four sections simultaneously and returns results tagged with their originating section and section_name. Results include the same metadata fields as list_sets — difficulty_label, set_type_label, and subjects — making cross-section discovery straightforward without knowing which section a set belongs to in advance.
The Quizbowl Packets API is a managed, monitored endpoint for quizbowlpackets.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when quizbowlpackets.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official quizbowlpackets.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a quizbowl practice tool that fetches packet download URLs via
get_set_detailsfor a given competition level and season - Filter all Collegiate Nationals-difficulty sets from a specific year using
list_setswithdifficulty=4andyearparameters - Search for thematic or invitational tournaments by name keyword using
search_setsacross all four sections at once - Compile a catalog of All-Subject tournaments by passing
subject=All-Subjecttolist_setsfor each section - Identify finals and tiebreaker packets within a set using the
is_finalsandis_tiebreakerflags fromget_set_details - Build a difficulty progression tracker by listing Novice through Nationals sets (
difficulty1–4) for a given subject area - Link users directly to a set's question database entry using the
qrc_urlfield returned byget_set_details
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does quizbowlpackets.com have an official developer API?+
What does `get_set_details` return beyond the basic set metadata?+
packets array with per-packet fields: packet_name, packet_number, packet_url (direct download link), file_size, is_finals, and is_tiebreaker. At the set level it also includes season, comments, subjects, qrc_url, and a packet_count integer.Can I search across all four sections at once, or must I query each separately?+
search_sets defaults to searching all four sections (hs, college, ms, popculture) when the section parameter is omitted. Each result in the response includes a section and section_name field so you can tell which section it originated from. If you want results from one section only, pass the relevant section value.Does the API expose the actual question and answer text from inside the packets?+
Are there any gaps in coverage for older sets or certain sections?+
subjects, comments, or qrc_url, and difficulty may also be null for sets where that metadata was not recorded. The year filter on list_sets matches against the date string, so sets with non-standard or missing date formats may not surface under a year filter.