Your decks
GET https://slinglab.gg/slinglab/api/v1/me/decks
Returns every deck on one account, including private decks, newest update first. Each deck includes a plain-text decklist. Published decks that other people can search are Public decks.
Authentication
An API key with decks:read returns the key owner's account. Send it as X-API-Key or Authorization: Bearer sk_live_....
An OAuth access token with decks:read returns the player who granted it:
GET /slinglab/api/v1/me/decks HTTP/1.1
Host: slinglab.gg
Authorization: Bearer sl_at_the_token
If you set a resource during the grant, use https://slinglab.gg/slinglab/api.
A key allows 60 requests a minute and 5,000 a day. An access token on this route allows 120 requests a minute for that player. Over the limit, the response is HTTP 429 with Retry-After. A rejected key uses the error body in API keys. A rejected token uses the error body in OAuth.
Body
The response includes at most 100 decks. total is the full count on the account. truncated is true when there are more than 100.
{
"decks": [
{
"id": "deck_id",
"name": "Deck name",
"game_family": "mtg",
"format": "commander",
"bracket": 3,
"description": "",
"is_public": false,
"commanders": ["Atraxa, Praetors' Voice"],
"updated_at": "2026-01-01T00:00:00.000Z",
"url": "https://slinglab.gg/decks/deck_id",
"decklist": "// Commander\n1 Atraxa, Praetors' Voice\n\n1 Sol Ring\n1 Command Tower"
}
],
"total": 12,
"truncated": false
}
url opens the deck on SlingLab. decklist is plain text. Commanders come first, under a // Commander line, and commanders repeats those names. The main deck has no header. Other boards use their own labels: // Sideboard, // Side Deck, // Extra Deck, // Maybeboard, // Tokens, // Legend, // Champion, // Base, // Runes, // Battlefields. Each card is one line, quantity then the name.
Successful responses include Cache-Control: no-store. A key response also includes X-RateLimit-Remaining and X-RateLimit-Daily-Remaining.