API
Every page here is JSON underneath.
No key, no login, no rate limit on reads, Access-Control-Allow-Origin: *. Point a script, a Discord bot or an agent at it. Responses are plain JSON; card text is reproduced verbatim as disclosed on openCaseList, with highlight spans as segments (lvl 2 = read text, 1 = underlined context, 0 = unread, −1 = condensed). Please keep concurrency low; this runs on one small box. If you build something, link back to the card permalink so readers can verify.
Search
/api/search
qtext;modehybrid | semantic | keyword (default hybrid)sortrelevance | popularity | effectiveness | newest | oldest | tournamenteventpf, ld, oe (comma-separated; empty = all) ·seasonhspf26 … ·sidePro/Con/Aff/Negtopicslug (e.g. pf-2026-sepoct) ·targan argument label from/api/topic·tside·ans1 = answers only, 0 = position onlytournamentcanonical key from/api/tournaments·team"School Code" ·family/grouplit baselimit≤100 ·offset. Returnsresults[]withbody_hash,tag,cite,segments,teams,copies,max_elim,elim_name,school,team,tournament,caselist,families,origin_url.
/api/card/<body_hash>
- One card in full, with
runs[](every disclosed round it appeared in). Permalink page at/card/<hash>, preview image at/og/<hash>.png.
/api/answers/<body_hash>
- Disclosed A2 blocks written against the argument this card sits under, ranked by team count.
Topics
/api/topic?event=pf|ld
- Every argument on the current resolution per side:
name,raw(pass astarg),unique,teams,elim,answers,first_seen,new; pluslatest_drop,total_cards.
/api/topic_arg?event=&name=&side=
- The cards under one argument label, with each card's role in the position.
/api/ballot?event=pf|ld
- The newest tournament's elim side split, deepest position per side, and a reason-for-decision written from counts.
Teams and tournaments
/api/teams?event=pf|ld&q=
- Every disclosing team this season with docs, cards, tournaments, best elim, last drop.
/api/team?caselist=&school=&team=
- One team: every disclosed round, elim ladders per tournament, the positions they file (
rawworks astarg), signature cards. - Prep-out:
/api/prepout.docx?caselist=&school=&team=— their positions with the field's most-run disclosed answers under each, as a Verbatim .docx. - Watch:
/team/<caselist>/<school>/<team>/feed.xml— RSS of every round they post.
/api/tournaments?event=&season=
- Canonical tournaments (one key over the ~50 filename spellings), newest drop first.
The record
/api/drops
- Every weekly drop: date, per-event cards, docs, teams, the tournaments that first appeared. RSS at
/drops.xml.
/api/drop_card?event=pf|ld
- The most-run card that first appeared in the latest drop, inside the event's own caselist.
/api/stats
- Corpus totals by caselist.
/api/export.docx?h=<hash>,<hash>…&title=
- Up to 200 cards as a Verbatim-formatted .docx, tags as disclosed.
Example
curl -s "https://5.78.43.21.sslip.io/api/search?q=data%20center%20grid%20strain&topic=pf-2026-sepoct&sort=popularity&limit=3" \
| jq '.results[] | {tag, teams, elim_name, url: ("https://5.78.43.21.sslip.io/card/" + .body_hash)}'
Data: openCaseList, one public weekly archive per event. Not affiliated with openCaseList, the NSDA or Tabroom.