Skip to main content
parlae.ioBeta
Sign in

Syncing a Sleeper league with Parlae: what it reads and what it never touches

A Sleeper sync needs a username, no password. Here is every endpoint Parlae reads, where it keeps the result, and the writes it never makes.

By The Parlae deskPublished 5 min read

What "connect" means here

Sleeper offers no sign in with Sleeper. There is no OAuth screen, no permission grant, and no way for a third party to act inside your account. What Sleeper does offer is a public, read only API that answers questions about a user from the username alone. Sleeper's own documentation puts it plainly: no API token is necessary, because you cannot modify contents through the API.

So when the My Team page says Connect Sleeper, it is asking for one fact, your Sleeper username, and nothing else. Parlae never asks for a Sleeper password, never has a field for one, and could not use one if you typed it in. Everything below follows from that.

What the sync reads

The sync makes a fixed set of reads against api.sleeper.app, all public, all with no cookie or credential attached. Here is the full list from the import code.

Endpoint readWhat it gives Parlae
/user/{username}Your user id and display name
/user/{id}/leagues/nfl/{season}The leagues you are in this season, with their scoring and roster settings
/league/{id}, /league/{id}/users, /league/{id}/rostersLeague name and size, the managers, each roster's players, starters, record, FAAB used and waiver position
/league/{id}/drafts and /draft/{id}/picksThe completed draft, for the draft grader
/league/{id}/matchups/{week}Weekly scores, for the standings page
/user/{id}/drafts/nfl/{season}Your drafts, including mocks, for the live draft assistant
/players/nfl and /players/nfl/trending/addThe player file, and Sleeper's own count of leagues adding a player in the last 24 hours

Source: Parlae league import, standings, waiver intel and draft live modules.

Two things about that list. First, it is all data your league mates can already see inside the Sleeper app. Second, Parlae reads it and does not keep it. The server holds a response in memory for ten minutes so a page refresh does not hit Sleeper twice, and then it is gone. There is no database of your leagues on our side unless you sign in, which is covered below.

The scoring format is detected from the league's own settings: a reception value of 0.9 or more reads as PPR, 0.4 or more as half PPR, otherwise standard, and a lineup with a superflex slot or two quarterback slots outranks the reception split and reads as two quarterback. When neither can be read, the page says the default applied rather than guessing silently.

Where the result lives

By default, in your browser. The username and user id are stored under a single local storage key, and the saved team, roster and league slots, the same way. The My Team page says it directly: there is no sign in, no card and no deposit, and your team is saved in this browser. Clear the browser and the sync is gone; nothing remains anywhere else.

Signing in is optional and does one thing: it keeps your synced leagues on your account so a second device shows the same thing. In that case the league id, league name, season and your roster id are written to a row on your account. Still no password, still nothing Sleeper does not publish.

What Parlae never touches

It never writes to your league. Not a lineup change, not a waiver claim, not a drop, not a trade. The reason is not only policy. Sleeper's public API has no write endpoints, and Parlae does not use undocumented private ones. Every move the site recommends ends in a deep link that lands you as close to Sleeper's confirm screen as Sleeper's public URLs allow, and your own signed in Sleeper app makes the change.

Autopilot, the feature that runs the weekly homework for a synced league, is built on that line. Its first version is shadow mode: the engine decides and prints the receipt as "would have," and it never calls a Sleeper write. Its defaults are conservative on purpose. Lineups start on protect, which only flags a starter who is Out, on IR or on bye and shows the fix. Waivers start on prepare, which shows the plan and leaves the tap to you. Draft starts off. Even with every switch raised, the caps hold: no more than 10 percent of remaining FAAB on one name, no more than two claims a week, no drop of a player you have protected, and a Questionable starter stays in unless you flip a setting. Trades, keeper moves, IR and taxi moves are never automated on any setting.

The live draft is read only too

The live draft assistant follows your Sleeper draft as it happens. The baseline is polling: the browser reads the draft's picks from the public API about every 1.5 seconds, with a one second server cache so a room full of viewers costs Sleeper one read a second. Signed in users also get a live feed that delivers each pick the moment it lands. That feed only subscribes and keeps the connection alive. It never sends a pick, and it cannot: the assistant shows you the board, and you make the pick in Sleeper.

What could go wrong, honestly

Sleeper asks integrations to stay under 1,000 calls a minute or risk an IP block, and on draft night a busy assistant can trip a brief rate limit. When that happens the page says Sleeper is briefly rate limiting reads and retries by itself, rather than telling you the draft link is wrong. A player Sleeper's file does not know stays unresolved rather than being guessed. And a league mate's roster is exactly as public to Parlae as it is to you in the app, which is to say entirely, so if your league has a rule about outside tools, that is a conversation to have with your commissioner, not something the sync can enforce.

What to do with this

  1. Open My Team, type your Sleeper username, and pick the league. If a page ever asks for a Sleeper password under the Parlae name, close it; that is not us.
  2. Read the first card's status line and the fix under it, then tap through to Sleeper and confirm the move yourself. That tap is the whole product's design, not a missing feature.
  3. If you use two devices, sign in once so the leagues follow you. If you use one, do not bother; the browser already has everything, and the draft assistant will find your drafts from the same username.

Sources

  • Sleeper API documentation (docs.sleeper.com): read only, no authentication, stay under 1,000 calls per minute
  • Parlae Sleeper identity store (src/lib/fantasy/sleeper-identity.ts): username and user id in this browser only
  • Parlae league import (src/lib/fantasy/league-import.server.ts): endpoints read, ten minute cache, nothing persisted
  • Parlae account league store (src/lib/fantasy/user-leagues.server.ts): synced leagues saved to a signed in account
  • Parlae Autopilot types and engine (src/lib/fantasy/autopilot): shadow mode, default rungs, caps
  • Parlae live draft context and socket (src/lib/fantasy/draft-live.server.ts, sleeper-socket.ts)
  • Parlae My Team page, Sep 3 2026

By the Parlae deskGuide updated Sep 4, 2026 at 8:00 AM ETHow this is builtReport a wrong number