Open API
Your league, over HTTPS.
A Personal Access Token authenticates every call as you, not a service account, so the same auth, RLS, and per-action gates the app itself runs under apply unchanged. A token only carries the scopes it was minted with, least-privilege by default. Point Claude, Codex, or your own script at it.
What people are building
Three shapes the same token can take.
claude · degen mcp
find me a trade that improves my playoff odds
GET /leagues/{id}/trade-triggers
Someone's standing offer wants Xavier Worthy for a 2026 2nd. You're holding a 2027 1st and 3rd on the bench. Send it?
do it
POST /trade-triggers/{id}/offers
trade filled
curl · GET /roster
$ curl degen.gg/api/leagues/{id}/roster
{
"starters": [
{ "player": "J. Gibbs", "proj": 18.4 },
{ "player": "Ja'Marr Chase", "proj": 21.1 }
]
}trade triggers · automated
1Standing offer posted
2A roster crosses the line
3Trade fills, webhook fires
Reads
Scope read unless noted. Returns your own data plus the shared league data you're a member of.
| Method | Path | Query | Scope |
|---|---|---|---|
| GET | /leagues | — | read |
| GET | /season/current-week | — | read |
| GET | /leagues/{league_id}/roster | — | read |
| GET | /leagues/{league_id}/draft-picks | — | read |
| GET | /leagues/{league_id}/matchup | ?week= | read |
| GET | /leagues/{league_id}/matchups | ?week= | read |
| GET | /leagues/{league_id}/schedule | — | read |
| GET | /leagues/{league_id}/money-outlook | — | intelligence:read |
| GET | /leagues/{league_id}/market-pulse | — | intelligence:read |
| GET | /leagues/{league_id}/trade-triggers | ?relevant_to_roster= | read |
| GET | /leagues/{league_id}/free-agents | ?limit= | read |
| GET | /leagues/{league_id}/draft | — | read |
| GET | /drafts/{draft_id} | — | read |
| GET | /export | ?league_id=&include_history= | export:read |
Writes
Every write is idempotent with an optional key, rate-limited per token, and logged to an audit trail.
| Method | Path | Body | Scope |
|---|---|---|---|
| PATCH | /leagues/{league_id}/lineup | {player_a, slot_a, player_b, slot_b} | write:lineup |
| POST | /leagues/{league_id}/roster/transactions | {add?, drop?, week?} | write:waiver |
| POST | /leagues/{league_id}/trades | {to_roster_id, assets, week?} | write:trade |
| PATCH | /trades/{tx_id} | {action: accept|reject|cancel} | write:trade |
| POST | /leagues/{league_id}/trade-triggers | {criteria_kind, criteria, offered?, expires_at?} | write:trade_trigger |
| POST | /trade-triggers/{trigger_id}/offers | {assets} | write:trade_trigger |
| POST | /drafts/{draft_id}/picks | {player_id} | write:draft |
Notes on the mapping
- Paths above are a readable shape, not the wire protocol. Every call actually goes through one of two gateway functions, so the whole surface shares one auth path and one audit log instead of a hundred bespoke ones.
- Never on the allowlist: money movement, commissioner and governance actions, league settings, and anything touching another manager's team. A token can act as you, never as your league.
- Trade Triggers auto-execute. An offer that meets a trigger's standing terms fills the trade immediately and irreversibly, evaluated the moment it's submitted.
Token minting and full request/response docs ship with API access.