Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Set lineups, claim waivers, answer trades and read your leagues. Use it in ChatGPT, Claude or any AI agent over MCP, or in n8n, Make and scripts over REST.
13 tools Read and write
Sleeper has a public API and no official MCP server (checked 28 Oct 2026). The API needs no token because it cannot change anything: no lineup, waiver claim, trade or chat message. Cotlet runs 13 Sleeper tools hosted, 6 of them writes, over MCP for agents and REST for scripts.
| What you need | Sleeper API | GitHub MCP + your login | Cotlet |
|---|---|---|---|
| Read leagues, matchups and transactions | Yes, no token | Yes | Yes |
| See your pending claims and trade offers | No | One server, private API | Yes |
| Set lineups, bid, trade, post in chat | No, read-only | One server, off by default | Yes, asks before bids and trades |
| Runs with your computer off | Yes | Only if you host it | Yes, hosted |
| Allowed by Sleeper's terms | Yes, non-commercial | No, sections 11.1 and 11.3 | No, sections 11.1 and 11.3 |
Checked 28 Oct 2026. Sources: Sleeper API documentation · Sleeper Support: How to Trade · Sleeper Support: How does FAAB bidding work? · Sleeper Terms of Service · joscaz/sleeper-mcp on GitHub
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your Sleeper password, and no bid, trade or chat message goes out until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Log in to Sleeper in a Cloud Browser. Create a Cotlet account, open Sleeper in its Cloud Browser, log in with the account that manages your teams and press Enable for agents.
Add the Cotlet address. Put https://cotlet.dev/mcp/v1 into the MCP server or connector settings of your agent.
Let the agent in. Chat apps send you to a Cotlet sign-in page. Code editors, n8n and scripts take an API key from the console.
The same address, https://cotlet.dev/mcp/v1, carries Sleeper together with your other apps. Enabled Sleeper after you connected? Refresh the connector so the 13 tools appear.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-sleeper \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-sleeper": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-sleeper]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: sleeper_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: sleeper_write Create a Cotlet API key with access to Sleeper and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Connect Sleeper in Cotlet and enable it for agents. Account access: A Sleeper account that manages a team in the league.
curl https://cotlet.dev/api/v1/sleeper/leagues \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "sleeper",
"tool": "list_leagues",
"result": {
"leagues": [
{
"league_id": "L-5521",
"name": "Sunday Scaries",
"team": "Gridiron Ghosts",
"status": "In season"
},
{
"league_id": "L-7710",
"name": "Office Dynasty",
"team": "Waiver Wire Wizards",
"status": "In season"
}
]
}
} Returns each league with its name, the team you manage and its status. The agent calls this first to get the league_id the other tools take.
Leagues you archived are not listed.
Keep the same selection when continuing a list. Compare changed record values as well as identifiers when refreshing your destination.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read your starters and bench in a league. Use get_lineup in your configured content report. |
| Make | HTTP > Make a request | Read the matchups and scores of one league week. Use list_matchups in your configured content report. |
| Python or Node.js | REST API | Read the processed adds, drops and trades of a league. Use list_transactions in your configured content report. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads Sleeper; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Start with list_leagues for the league ids. set_lineup refuses a player whose game has kicked off, because Sleeper locks him.
Returns each league with its name, the team you manage and its status. The agent calls this first to get the league_id the other tools take. Leagues you archived are not listed.
MCP callsleeper_read → list_leagues
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues
| Name | Type | Description |
|---|---|---|
| season string | string | Season year, for example 2026. Defaults to the current season. |
{
"leagues": [
{
"league_id": "L-5521",
"name": "Sunday Scaries",
"team": "Gridiron Ghosts",
"status": "In season"
},
{
"league_id": "L-7710",
"name": "Office Dynasty",
"team": "Waiver Wire Wizards",
"status": "In season"
}
]
} Returns your starting slots in the order the Team tab shows them, then your bench and any injured reserve. Each player has a position and the injury status shown in the app. It reads the roster as it is now and does not look ahead to future weeks.
MCP callsleeper_read → get_lineup
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/lineup
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to read, from list_leagues. |
{
"league_id": "league_8c41d2"
} {
"league_id": "L-5521",
"starters": [
{
"slot": "QB",
"player": "Dean Mercer",
"status": "Active"
},
{
"slot": "RB",
"player": "Jamal Okoye",
"status": "Out"
},
{
"slot": "WR",
"player": "Eli Brandt",
"status": "Active"
}
],
"bench": [
{
"player": "Tyrese Boone",
"position": "RB",
"status": "Active"
}
]
} Returns each pairing with both team names, their records and their points so far. Scores of a live week change until the games end. Weeks that have not started show no points.
MCP callsleeper_read → list_matchups
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/matchups
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to read, from list_leagues. |
| week integer | integer | Week to read. Defaults to the current week. |
{
"league_id": "league_8c41d2"
} {
"league_id": "L-5521",
"week": 8,
"matchups": [
{
"teams": [
"Gridiron Ghosts",
"Blitz Brothers"
],
"record": [
"5-2",
"4-3"
],
"points": [
131.4,
118.9
]
},
{
"teams": [
"Waiver Wire Wizards",
"Fourth and Long"
],
"record": [
"3-4",
"2-5"
],
"points": [
102.2,
97.6
]
}
]
} Puts the player in the slot and moves the old starter to the bench. It refuses a player whose game has already started, because Sleeper locks those players. It reaches no one and one more call undoes it, so it does not wait for your approval.
MCP callsleeper_write → set_lineup
REST endpointPUT https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/lineup
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to change, from list_leagues. |
| slot string required | string | Starting slot to fill, as get_lineup names it. |
| player_id string required | string | Player to start in that slot, from get_lineup or list_free_agents. |
{
"league_id": "league_8c41d2",
"slot": "slot",
"player_id": "player_8c41d2"
} {
"league_id": "L-5521",
"slot": "RB",
"started": "Tyrese Boone",
"benched": "Jamal Okoye",
"status": "saved"
} Bids are blind until waivers process, at the time your commissioner set. A claim can be cancelled until then.
Returns available players the way the Players tab lists them, with the injury status and whether the player is on waivers. Players on waivers can only be claimed, not added at once. The list is capped at the first page the app shows.
MCP callsleeper_read → list_free_agents
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/free-agents
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to read, from list_leagues. |
| position string | string | Filter by the position names of the Players tab. |
| query string | string | Part of a player name. |
{
"league_id": "league_8c41d2"
} {
"league_id": "L-5521",
"players": [
{
"player_id": "P-3301",
"name": "Tyrese Boone",
"position": "RB",
"status": "Active",
"on_waivers": true
},
{
"player_id": "P-2189",
"name": "Colt Reyes",
"position": "RB",
"status": "Questionable",
"on_waivers": false
}
]
} Returns the moves of the league newest first: who added or dropped whom, trades and the FAAB bid that won a claim. The app shows full bid details for a processed waiver; the tool returns the winning move.
MCP callsleeper_read → list_transactions
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/transactions
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to read, from list_leagues. |
| week integer | integer | Week to read. Defaults to the current week. |
{
"league_id": "league_8c41d2"
} {
"league_id": "L-5521",
"transactions": [
{
"type": "waiver",
"team": "Blitz Brothers",
"added": "Colt Reyes",
"dropped": "Mo Vance",
"bid": 9
},
{
"type": "trade",
"teams": [
"Fourth and Long",
"Gridiron Ghosts"
],
"summary": "Two players for one and a 2027 round 3 pick"
}
]
} Returns the claims shown under Team, then Transactions: the player, who you drop and the bid in leagues with FAAB. Claims with the same bid keep the order you set. A processed claim moves out of this list into the league transactions.
MCP callsleeper_read → list_waiver_claims
REST endpointGET https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/waiver-claims
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to read, from list_leagues. |
{
"league_id": "league_8c41d2"
} {
"league_id": "L-5521",
"claims": [
{
"claim_id": "C-9041",
"add": "Tyrese Boone",
"drop": "Mo Vance",
"bid": 12
}
]
} Creates the claim the way the waiver icon in the Players tab does. Bids are blind: other managers cannot see yours. The claim stays pending until the league processes waivers, and you can cancel it before then. By default you confirm each call; you can switch that off for this tool.
MCP callsleeper_write → submit_waiver_claim
REST endpointPOST https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/waiver-claim/submit
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League to change, from list_leagues. |
| add_player_id string required | string | Player to claim, from list_free_agents. |
| drop_player_id string | string | Player to drop if your roster is full. |
| bid integer | integer | FAAB bid in dollars. Leave out in leagues that do not use FAAB. |
{
"league_id": "L-5521",
"add_player_id": "P-3301",
"drop_player_id": "P-1180",
"bid": 12
} {
"league_id": "L-5521",
"claim_id": "C-9041",
"add": "Tyrese Boone",
"drop": "Mo Vance",
"bid": 12,
"status": "pending"
} Removes the claim from Team, then Transactions, and returns the bid to your budget in FAAB leagues. It reaches no one and you can place the claim again, so it does not wait for your approval. A claim that already processed cannot be cancelled.
MCP callsleeper_write → cancel_waiver_claim
REST endpointPOST https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/waiver-claim/cancel
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League of the claim. |
| claim_id string required | string | Claim to cancel, from list_waiver_claims. |
{
"league_id": "league_8c41d2",
"claim_id": "claim_8c41d2"
} {
"league_id": "L-5521",
"claim_id": "C-9041",
"status": "cancelled"
} Trades can carry players, draft picks and FAAB dollars. Every manager in the league reads the chat.
Returns each open offer with the teams, what each side gives and who still has to accept. Sleeper shows offers on the Trade screen of the Team tab. Offers that were accepted, declined or expired are not listed.
MCP callsleeper_read → list_trade_offers
REST endpointGET https://cotlet.dev/api/v1/sleeper/trade-offers
| Name | Type | Description |
|---|---|---|
| league_id string | string | Only this league. Defaults to every league. |
{
"offers": [
{
"trade_id": "T-3120",
"league_id": "L-5521",
"from": "Fourth and Long",
"gives": [
"Eli Brandt"
],
"gets": [
"2027 round 2 pick"
],
"waiting_on": [
"Gridiron Ghosts"
]
}
]
} Opens the offer from the Trade screen. Sleeper lets a trade include players, current and future draft picks and FAAB dollars. If every side accepts, the trade goes to the league review period before it is processed. By default you confirm each call; you can switch that off for this tool.
MCP callsleeper_write → propose_trade
REST endpointPOST https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/trade/propose
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League of the trade. |
| partner_team string required | string | Team to trade with, as list_leagues or list_matchups name it. |
| give array required | array | Player ids, draft picks or FAAB dollars you give. |
| get array required | array | Player ids, draft picks or FAAB dollars you ask for. |
{
"league_id": "league_8c41d2",
"partner_team": "partner team",
"give": "give",
"get": "get"
} {
"league_id": "L-5521",
"trade_id": "T-3144",
"to": "Blitz Brothers",
"gives": [
"Jamal Okoye"
],
"gets": [
"Colt Reyes"
],
"status": "sent"
} Answers the offer the way the Trade screen does. Accepting hands over players and picks once the review period of the league ends. Declining tells the other manager. By default you confirm each call; you can switch that off for this tool.
MCP callsleeper_write → respond_to_trade
REST endpointPOST https://cotlet.dev/api/v1/sleeper/trades/{trade_id}/replies
| Name | Type | Description |
|---|---|---|
| trade_id string required | string | Offer to answer, from list_trade_offers. |
| decision string required | string | accept or decline. |
{
"trade_id": "trade_8c41d2",
"decision": "decision"
} {
"trade_id": "T-3120",
"decision": "decline",
"status": "declined"
} Posts as you in the league chat, where every manager reads it. Messages cannot be edited by the tool. By default you confirm each call; you can switch that off for this tool.
MCP callsleeper_write → send_league_message
REST endpointPOST https://cotlet.dev/api/v1/sleeper/leagues/{league_id}/message
| Name | Type | Description |
|---|---|---|
| league_id string required | string | League whose chat to post in. |
| text string required | string | Message text. |
{
"league_id": "league_8c41d2",
"text": "text"
} {
"league_id": "L-5521",
"message_id": "M-8801",
"status": "posted"
} Your logged-in Sleeper profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 13 Sleeper tools. Never the session token.
Your leagues, rosters, pending claims, trade offers and league chats.
Sleeper Picks, the wallet, deposits, league dues, password and settings.
You type the code from Sleeper yourself. We never do.
Disable Sleeper for agents, reset the browser, or log out in Sleeper.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"A user's provision of credentials, tokens, or authorization to a third-party does not constitute authorization from Sleeper, and Sleeper's authorization must be obtained independently and directly from Sleeper."
Section 11.1 bans letting "any application, platform, service, or tool not developed or expressly authorized by Sleeper" log into your account on your behalf without written consent, and bans access "through any automated means, bot, script". Section 11.2 lets Sleeper suspend the account, revoke its sessions and block the tool. Cotlet has no agreement with Sleeper, so using it breaks these sections, and the risk sits with your account. We found no public case of a Sleeper account closed for automation or a third-party tool (checked 28 Oct 2026).
The terms also ban use "for the benefit of any third-party or to send unsolicited communications". Run the agent only for teams you manage, and post only in leagues you play in.
Sleeper ships app updates through the season. When a screen or field moves, we fix the tool on our side and the same prompt keeps working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Set lineup | One more call, until the player's game kicks off |
| Submit waiver claim | Cancel or edit it under Team, Transactions before waivers run |
| Cancel waiver claim | Place the claim again before waivers run |
| Propose or accept a trade | Once all sides accept, only the commissioner can veto or reverse it |
| Send league message | No, the tool cannot edit or remove it |
4 of 13 tools ask first: submit_waiver_claim, propose_trade, respond_to_trade and send_league_message. Lineup moves and claim cancels reach no other manager, so they run at once. For a Sunday morning run you can switch the wait off per tool.
An accepted trade sits in the league review period, then Sleeper processes it at midnight PST. With the wait set to none it goes through at once.
{
"name": "submit_waiver_claim",
"arguments": {
"league_id": "L-5521",
"add_player_id": "P-3301",
"drop_player_id": "P-1180",
"bid": 12
}
} curl -X POST https://cotlet.dev/api/v1/sleeper/leagues/L-5521/waiver-claim/submit \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"add_player_id":"P-3301","drop_player_id":"P-1180","bid":12}' {
"league_id": "L-5521",
"claim_id": "C-9041",
"add": "Tyrese Boone",
"drop": "Mo Vance",
"bid": 12,
"status": "pending"
} Scripts and cron jobs call the same tools over REST at /api/v1/sleeper, with one key and one price. A claim on a player who is no longer available fails, and a failed call costs nothing. The tools table lists the REST path of each tool.
About $15 a monthin season, for a manager in 3 leagues, 2,580 credits. Sleeper leagues stay free to play.
| Job | Calls | Credits |
|---|---|---|
| Lineup check in 3 leagues, weekly | 7 × 4 | 280 |
| Sunday injury swap before kickoff | 5 × 4 | 200 |
| FAAB bids after the games, weekly | 8 × 4 | 320 |
| Answer a trade offer, twice a week | 2 × 8 | 160 |
| Tuesday recap in league chat | 3 × 4 | 120 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,580 |
The month is our example: 3 leagues, 108 calls, during the NFL season. Sleeper publishes no figure for leagues per manager. Five leagues roughly double the lineup and waiver rows. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| joscaz/sleeper-mcp | 28 read tools on the public API plus 11 account tools on Sleeper's private GraphQL: lineups, IR, waivers, trades, league chat. 3 stars, MIT, last commit 17 Oct 2026. | You host it with your Sleeper token or password in its config. Writes are off until you remove --read-only. Same terms problem as ours. |
| FloSchl8/sleeper-mcp, sourknives/sleeper-mcp-server | Read the public API: leagues, players, matchups, drafts. 29 and 25 stars. | No writes and no pending claims. Last commits 5 Oct 2025 and 11 Aug 2026. |
| FantasyBot | ChatGPT app and Claude connector with 15 read-only tools for ESPN, Yahoo and Sleeper. Needs only your Sleeper username. | "Can never make a trade, drop a player, or change your lineup." |
| FantasyPros league sync | Rankings and advice for your synced league, as an approved Sleeper partner. | Advice only; you make the moves in Sleeper. |
For questions about your league, a free read-only server or FantasyBot is enough and stays inside Sleeper's API rules. Moves need a logged-in session: joscaz/sleeper-mcp gives you that on your own computer, Cotlet gives it hosted, with approvals before bids and trades.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the Sleeper tools go to contact@cotlet.dev.
Create a free account at https://cotlet.dev, open Sleeper under Integrations in the console and log in to Sleeper in its Cloud Browser. The trial starts with your first app, no card asked.
Sign up at cotlet.dev, log in to Sleeper once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your Sleeper account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in Sleeper: set the weekly lineup; bid on waiver wire targets; answer trade offers. You ask in plain words, and anything that reaches other people waits for your OK first.
Sleeper's Terms of Service say users may not access or extract data through automated means, bots or scripts, and that no third party may access the Services through a user's account without a written agreement. An agent acting in your session can fall under that, so use it on your own account at your own risk. For read-only data, the public API is the route Sleeper documents (checked 28 Oct 2026).
No. The tools cover season-long fantasy leagues only. Sleeper Picks is a separate real-money game in the Sleeper Support Center, and the tools do not enter contests, move money or touch the wallet.
Not before waivers run: Sleeper bids are blind. After they process, Sleeper shows every bid for a player to the whole league, and list_transactions returns the winning move.
For reading, yes: leagues, rosters, matchups and transactions need no token. It cannot set a lineup, bid, trade or post, and it does not show your pending claims or offers. Commercial use needs a license from Sleeper.
No. Nothing tells an agent that a trade offer arrived. Run it on a schedule instead, for example list_trade_offers every evening.
Only the door differs. Both carry the same 13 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with Sleeper or Blitz Studios, Inc.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy