SWU API

Star Wars Unlimited Card Data API

Overview

The SWU API provides programmatic access to Star Wars Unlimited card data and competitive tournament results. All responses are JSON.

Base URL

https://api.swuapi.com
GET /health

Health check endpoint. Returns server status and last scrape info.

curl https://api.swuapi.com/health
const response = await fetch('https://api.swuapi.com/health');
const data = await response.json();
console.log(data.status); // "healthy"
{
  "status": "healthy",
  "cardCount": 5560,
  "lastScrape": {
    "completedAt": "2024-01-15T06:00:00.000Z",
    "status": "success",
    "cardsFound": 5560
  },
  "uptime": 3600
}
GET /sets

List all card sets/expansions.

curl https://api.swuapi.com/sets
const response = await fetch('https://api.swuapi.com/sets');
const { sets } = await response.json();

sets.forEach(set => {
  console.log(`${set.code}: ${set.name}`);
});
{
  "sets": [
    {
      "code": "SOR",
      "name": "Spark of Rebellion",
      "release_date": "2024-03-08",
      "total_cards": 252
    },
    {
      "code": "SHD",
      "name": "Shadows of the Galaxy",
      "release_date": "2024-07-12",
      "total_cards": 262
    }
  ]
}
GET /sets/:code

Get a single set by its code.

Path Parameters

Parameter Type Description
code string Set code (e.g., SOR, SHD, TWI)
curl https://api.swuapi.com/sets/SOR
const setCode = 'SOR';
const response = await fetch(`https://api.swuapi.com/sets/${setCode}`);
const set = await response.json();

console.log(set.name); // "Spark of Rebellion"
{
  "code": "SOR",
  "name": "Spark of Rebellion",
  "release_date": "2024-03-08",
  "total_cards": 252
}
GET /cards

List cards with pagination and optional filtering.

Query Parameters

Parameter Type Default Description
limit integer 100 Number of cards to return (max 500)
offset integer 0 Number of cards to skip
set string - Filter by set code (e.g., SOR, SHD)
type string - Filter by type (Leader, Unit, Event, Upgrade, Base)
rarity string - Filter by rarity (Common, Uncommon, Rare, Legendary, Special)
name string - Search by card name or subtitle (case-insensitive partial match)
# Get first 100 cards
curl https://api.swuapi.com/cards

# Get leaders from Spark of Rebellion
curl "https://api.swuapi.com/cards?set=SOR&type=Leader"

# Search by name
curl "https://api.swuapi.com/cards?name=Bossk"

# Paginate through results
curl "https://api.swuapi.com/cards?limit=50&offset=100"
// Get all leaders from SOR
const params = new URLSearchParams({
  set: 'SOR',
  type: 'Leader',
  limit: 50
});

const response = await fetch(
  `https://api.swuapi.com/cards?${params}`
);
const { cards, pagination } = await response.json();

console.log(`Found ${pagination.total} cards`);
cards.forEach(card => console.log(card.name));
{
  "cards": [
    {
      "id": "SOR_005",
      "name": "Luke Skywalker",
      "subtitle": "Faithful Friend",
      "type": "Leader",
      "rarity": "Special",
      // ... see Card Object for all fields
    }
  ],
  "pagination": {
    "limit": 100,
    "offset": 0,
    "total": 5560
  }
}
GET /cards/:id

Get a single card by any identifier: UUID, external_id (integer), collector_number (SOR_005), or card name slug (e.g., "entrenched").

Path Parameters

Parameter Type Description
id string | int | uuid UUID, external_id (integer), collector_number (e.g., SOR_005), or card name slug
# By UUID (unique, stable)
curl https://api.swuapi.com/cards/59e4854c-bd67-47f2-98c9-815d31736928

# By external_id (unique per variant)
curl https://api.swuapi.com/cards/5

# By collector_number (may match multiple variants)
curl https://api.swuapi.com/cards/SOR_005

# By slug
curl https://api.swuapi.com/cards/entrenched
const response = await fetch(
  'https://api.swuapi.com/cards/59e4854c-bd67-47f2-98c9-815d31736928'
);
const card = await response.json();

console.log(card.uuid);              // "59e4854c-..."
console.log(card.collector_number);   // "SOR_005"
console.log(card.external_id);        // 5
{
  "uuid": "59e4854c-bd67-47f2-98c9-815d31736928",
  "external_id": 5,
  "collector_number": "SOR_005",
  "external_uid": "2579145458",
  "name": "Luke Skywalker",
  "subtitle": "Faithful Friend",
  "setCode": "SOR",
  "cardNumber": "5",
  "type": "Leader",
  "type2": "Leader Unit",
  "rarity": "Special",
  "cost": 6,
  "power": 4,
  "hp": 7,
  "arena": "Ground",
  "aspects": ["Vigilance", "Heroism"],
  "traits": ["Force", "Rebel"],
  "keywords": [],
  "variantType": "Standard",
  "text": "Action [1 resource, exhaust]: Give a Shield token...",
  "deployBox": "On Attack: You may give another unit a Shield token.",
  "epicAction": "Epic Action: If you control 6 or more resources...",
  "isUnique": true,
  "isLeader": true,
  "frontImageUrl": "https://cdn.starwarsunlimited.com/...",
  "backImageUrl": "https://cdn.starwarsunlimited.com/...",
  "artist": "Borja Pindado",
  "variants": [981, 9745],
  "variantOf": null,
  "reprints": [100],
  "reprintOf": null
}
GET /export/all

Export all cards and sets as a single JSON payload. Useful for bulk imports or syncing.

# Download full export
curl https://api.swuapi.com/export/all -o cards.json

# Pipe to jq for processing
curl -s https://api.swuapi.com/export/all | jq '.meta'
const response = await fetch(
  'https://api.swuapi.com/export/all'
);
const { cards, sets, meta } = await response.json();

console.log(`Total cards: ${meta.totalCards}`);
console.log(`Total sets: ${meta.totalSets}`);
console.log(`Last scraped: ${meta.lastScrapedAt}`);

// Process all cards
const leaders = cards.filter(c => c.type === 'Leader');
console.log(`Found ${leaders.length} leaders`);
{
  "cards": [
    { /* card objects */ }
  ],
  "sets": [
    { /* set objects */ }
  ],
  "meta": {
    "totalCards": 5560,
    "totalSets": 19,
    "lastScrapedAt": "2024-01-15T06:00:00.000Z",
    "exportedAt": "2024-01-15T12:00:00.000Z"
  }
}
GET /tournaments

List SWU tournaments. Includes competitive events (PQ, SQ, RQ, GC), casual events (SS), and community events (INV).

Query Parameters

Parameter Type Default Description
limit integer 50 Number of tournaments to return (max 200)
offset integer 0 Number of tournaments to skip
tier string - Filter by tier: PQ, SQ, RQ, GC, SS, INV
format string - Filter by format: Premiere, Limited
eventType string - Filter by event type: main, side, lcq
tierLevel string - Filter by tier level: competitive, casual
official boolean - Filter by official status (true = FFG-sanctioned, false = community)
# List all tournaments
curl https://api.swuapi.com/tournaments

# Filter by tier and format
curl "https://api.swuapi.com/tournaments?tier=PQ&format=Premiere"
const response = await fetch(
  'https://api.swuapi.com/tournaments?tier=SQ'
);
const { tournaments, pagination } = await response.json();

console.log(`Found ${pagination.total} Sector Qualifiers`);
{
  "tournaments": [
    {
      "melee_id": 67890,
      "name": "Star Wars: Unlimited Planetary Qualifier Austin",
      "display_name": "Planetary Qualifier (SEC) — Austin, TX, US",
      "date": "2026-02-15T00:00:00.000Z",
      "tier": "PQ",
      "tier_level": "competitive",
      "format": "Premiere",
      "official": true,
      "organizer": "Emerald Tavern Games",
      "player_count": 64,
      "melee_url": "https://melee.gg/Tournament/View/67890",
      "event_type": "main"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 130
  }
}
GET /tournaments/:meleeId

Get a single tournament by its ID.

Path Parameters

Parameter Type Description
meleeId integer Tournament ID
curl https://api.swuapi.com/tournaments/67890
{
  "melee_id": 67890,
  "name": "Star Wars: Unlimited Planetary Qualifier Austin",
  "date": "2026-02-15T00:00:00.000Z",
  "tier": "PQ",
  "format": "Premiere",
  "organizer": "Emerald Tavern Games",
  "player_count": 64,
  "melee_url": "https://melee.gg/Tournament/View/67890",
  "event_type": "main"
}
GET /tournaments/:meleeId/matches

Get all match results for a tournament, ordered by round number. Includes player names via join.

curl https://api.swuapi.com/tournaments/67890/matches
{
  "tournament": { "melee_id": 67890, "name": "PQ Austin", ... },
  "matches": [
    {
      "id": 1,
      "round_number": 1,
      "is_top_cut": false,
      "player1_account_melee_id": "abc-123",
      "player1_id": 42,
      "player1_name": "Alice",
      "player2_account_melee_id": "def-456",
      "player2_id": 17,
      "player2_name": "Bob",
      "player1_wins": 2,
      "player2_wins": 1,
      "draws": 0,
      "winner_account_melee_id": "abc-123",
      "winner_id": 42,
      "is_bye": false,
      "is_forfeit": false
    }
  ]
}
GET /tournaments/:meleeId/decklists

Get all submitted decklists for a tournament.

curl https://api.swuapi.com/tournaments/67890/decklists
{
  "tournament": { "melee_id": 67890, "name": "PQ Austin", ... },
  "decklists": [
    {
      "melee_id": "d1e2f3a4-...",
      "account_melee_id": "abc-123",
      "player_name": "Alice",
      "archetype": "Darth Vader - Command Center",
      "cards": [
        { "name": "Darth Vader", "count": 1 },
        { "name": "Superlaser Technician", "count": 3 }
      ]
    }
  ]
}
GET /players

List canonical players, deduplicated across multiple tournament accounts. Sorted by match count descending.

Query Parameters

Parameter Type Default Description
limit integer 50 Number of players to return (max 200)
offset integer 0 Number of players to skip
name string - Search by player name (case-insensitive partial match)
# Search for a player
curl "https://api.swuapi.com/players?name=skywalker"
{
  "players": [
    {
      "id": 42,
      "name": "42Mops",
      "account_count": "2",
      "tournament_count": "3",
      "match_count": "25"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 1
  }
}
GET /players/:id

Get a single player by their canonical ID. Also accepts an account ID as fallback.

Path Parameters

Parameter Type Description
id integer|string Player ID (integer) or account ID (string)
curl https://api.swuapi.com/players/42
{
  "id": 42,
  "name": "Alice",
  "account_count": "2",
  "accounts": [
    { "melee_id": "abc-123", "name": "Alice" },
    { "melee_id": "def-456", "name": "Alice" }
  ]
}
GET /players/:id/matches

Get all matches for a player across all tournaments and accounts. Includes tournament name, tier, and canonical player IDs.

curl https://api.swuapi.com/players/42/matches
{
  "player": { "id": 42, "name": "Alice" },
  "matches": [
    {
      "id": 42,
      "tournament_name": "PQ Austin",
      "tier": "PQ",
      "format": "Premiere",
      "round_number": 3,
      "player1_id": 42,
      "player1_name": "Alice",
      "player2_id": 17,
      "player2_name": "Bob",
      "player1_wins": 2,
      "player2_wins": 0
    }
  ]
}
GET /players/:id/decklists

Get all decklists submitted by a player across tournaments and accounts.

curl https://api.swuapi.com/players/42/decklists
{
  "player": { "id": 42, "name": "Alice" },
  "decklists": [
    {
      "melee_id": "d1e2f3a4-...",
      "tournament_name": "PQ Austin",
      "tier": "PQ",
      "archetype": "Darth Vader - Command Center",
      "cards": [ ... ]
    }
  ]
}
GET /matches

List matches across all tournaments with pagination and optional filters.

Query Parameters

Parameter Type Default Description
limit integer 50 Number of matches to return (max 200)
offset integer 0 Number of matches to skip
tournament integer - Filter by tournament melee_id
account string - Filter by account ID
# Get all matches for a tournament
curl "https://api.swuapi.com/matches?tournament=67890"

# Get all matches for an account
curl "https://api.swuapi.com/matches?account=abc-123-def"
{
  "matches": [
    {
      "id": 1,
      "tournament_melee_id": 67890,
      "tournament_name": "PQ Austin",
      "round_number": 1,
      "player1_id": 42,
      "player1_name": "Alice",
      "player2_id": 17,
      "player2_name": "Bob",
      "player1_wins": 2,
      "player2_wins": 1,
      "draws": 0,
      "winner_id": 42
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 24929
  }
}
GET /matches/:id

Get a single match by its database ID.

Path Parameters

Parameter Type Description
id integer Match database ID
curl https://api.swuapi.com/matches/42
{
  "id": 42,
  "tournament_melee_id": 67890,
  "tournament_name": "PQ Austin",
  "round_number": 3,
  "is_top_cut": false,
  "player1_account_melee_id": "abc-123",
  "player1_id": 42,
  "player1_name": "Alice",
  "player2_account_melee_id": "def-456",
  "player2_id": 17,
  "player2_name": "Bob",
  "player1_wins": 2,
  "player2_wins": 0,
  "draws": 0,
  "winner_account_melee_id": "abc-123",
  "winner_id": 42,
  "is_bye": false,
  "is_forfeit": false
}
GET /decklists

List decklists across all tournaments with pagination and filters.

Query Parameters

Parameter Type Default Description
limit integer 50 Number of decklists to return (max 200)
offset integer 0 Number of decklists to skip
tournament integer - Filter by tournament melee_id
account string - Filter by account ID
archetype string - Search by archetype name (case-insensitive partial match)
hasCards boolean - Filter to only decklists with card data (true)
# Find all Darth Vader decklists
curl "https://api.swuapi.com/decklists?archetype=Vader"

# Get decklists for a specific tournament
curl "https://api.swuapi.com/decklists?tournament=67890"
{
  "decklists": [
    {
      "melee_id": "d1e2f3a4-...",
      "player_name": "Alice",
      "tournament_name": "PQ Austin",
      "tier": "PQ",
      "archetype": "Darth Vader - Command Center",
      "cards": [
        { "name": "Darth Vader", "count": 1 }
      ]
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 5216
  }
}
GET /decklists/:meleeId

Get a single decklist by its ID. Includes full card list and player name.

Path Parameters

Parameter Type Description
meleeId string Decklist ID (UUID)
curl https://api.swuapi.com/decklists/d1e2f3a4-5678-90ab-cdef
{
  "melee_id": "d1e2f3a4-...",
  "player_melee_id": "abc-123",
  "player_name": "Alice",
  "tournament_melee_id": 67890,
  "archetype": "Darth Vader - Command Center",
  "cards": [
    { "name": "Darth Vader", "count": 1, "setCode": "SOR" },
    { "name": "Superlaser Technician", "count": 3, "setCode": "SOR" }
  ],
  "raw_decklist_string": "1 Darth Vader (SOR)\\n3 Superlaser Technician (SOR)..."
}
GET /archetypes

List archetypes (leader + normalized base combinations) with pagination and search. Common bases are normalized to color+HP (e.g., "Yellow30"), rare bases keep their name (e.g., "Tarkintown").

Parameter Type Default Description
limit integer 50 Number of archetypes to return (max 200)
offset integer 0 Number of archetypes to skip
name string - Search name or nickname (case-insensitive)
curl https://api.swuapi.com/archetypes

curl "https://api.swuapi.com/archetypes?name=Han+Solo"
const response = await fetch(
  'https://api.swuapi.com/archetypes?name=Han+Solo'
)
const { archetypes, pagination } = await response.json()
{
  "archetypes": [
    {
      "id": 1,
      "name": "Han Solo, Worth the Risk - Energy Conversion Lab",
      "nickname": "Han Solo (SHD) - Energy Conversion Lab",
      "leader_name": "Han Solo",
      "leader_subtitle": "Worth the Risk",
      "leader_set_code": "SHD",
      "base_name": "Energy Conversion Lab",
      "base_is_common": false,
      "decklist_count": "437"
    }
  ],
  "pagination": { "limit": 50, "offset": 0, "total": 285 }
}
GET /archetypes/:id

Get a single archetype by database ID. Includes decklist count.

Path Parameters

Parameter Type Description
id integer Archetype database ID
curl https://api.swuapi.com/archetypes/27
const response = await fetch(
  'https://api.swuapi.com/archetypes/27'
)
const archetype = await response.json()
{
  "id": 27,
  "name": "Han Solo, Worth the Risk - Energy Conversion Lab",
  "nickname": "Han Solo (SHD) - Energy Conversion Lab",
  "leader_name": "Han Solo",
  "leader_subtitle": "Worth the Risk",
  "leader_set_code": "SHD",
  "base_name": "Energy Conversion Lab",
  "base_is_common": false,
  "decklist_count": "437"
}
GET /archetypes/:id/decklists

Get all decklists for an archetype. Includes player names and tournament context. Paginated.

Path Parameters

Parameter Type Description
id integer Archetype database ID

Query Parameters

Parameter Type Default Description
limit integer 50 Number of decklists to return (max 200)
offset integer 0 Number of decklists to skip
curl https://api.swuapi.com/archetypes/27/decklists

curl "https://api.swuapi.com/archetypes/27/decklists?limit=10"
const response = await fetch(
  'https://api.swuapi.com/archetypes/27/decklists?limit=10'
)
const data = await response.json()
// data.archetype — the archetype object
// data.decklists — array of decklists
// data.pagination — { limit, offset, total }
{
  "archetype": {
    "id": 27,
    "name": "Han Solo, Worth the Risk - Energy Conversion Lab",
    "nickname": "Han Solo (SHD) - Energy Conversion Lab"
  },
  "decklists": [
    {
      "melee_id": "d1e2f3a4-...",
      "player_name": "Alice",
      "tournament_name": "Sector Qualifier - Paris",
      "tier": "SQ",
      "format": "Premiere",
      "archetype": "Han Solo, Worth the Risk - Energy Conversion Lab",
      "cards": [...]
    }
  ],
  "pagination": { "limit": 10, "offset": 0, "total": 437 }
}
GET /archetypes/resolve

Resolve an archetype name from a leader and base. Accepts any card identifier: card ID (SOR_017), strapi ID, full name, or subtitle.

Query Parameters

ParameterTypeRequiredDescription
leaderstringYesLeader identifier (e.g., "SOR_017", "Han Solo, Audacious Smuggler", "Audacious Smuggler")
basestringYesBase identifier (e.g., "JTL_030", "Mos Eisley", "Data Vault")
# By name
curl "https://api.swuapi.com/archetypes/resolve?leader=Han+Solo,+Audacious+Smuggler&base=Mos+Eisley"

# By card ID
curl "https://api.swuapi.com/archetypes/resolve?leader=SOR_017&base=JTL_030"

# By subtitle
curl "https://api.swuapi.com/archetypes/resolve?leader=Audacious+Smuggler&base=Data+Vault"
{
  "name": "Han Solo, Audacious Smuggler - Yellow 30",
  "nickname": "Han Solo (SOR) - Yellow 30",
  "leaderName": "Han Solo",
  "leaderSubtitle": "Audacious Smuggler",
  "leaderSetCode": "SOR",
  "baseName": "Yellow 30",
  "baseIsCommon": true
}
POST /deck-image

Generate a deck image (PNG) from a JSON card list or text decklist. Returns the image directly. Cards are resolved against the card database for art. Supports custom branding and card variant art.

Request Body

Send either JSON (Content-Type: application/json) or plain text decklist (Content-Type: text/plain).

JSON Fields

FieldTypeRequiredDescription
cardsarray*Array of card objects (see below)
textstring*Text decklist (e.g., "1 Han Solo (SOR) 017"). Use instead of cards
titlestringNoTitle text (default: leader name or "Deck")
subtitlestringNoSubtitle text (e.g., player name, event)
datestringNoDate string to display
brandingobjectNo{ url: "yoursite.com" } — override default swuapi branding

* Provide either cards or text, not both.

Card Object

FieldTypeDescription
namestringCard name (e.g., "Han Solo, Audacious Smuggler")
typestring"Leader", "Base", "Ground Unit", "Space Unit", "Event", "Upgrade"
countintegerNumber of copies (default 1)
variantstringCard variant for art (e.g., "Hyperspace", "Showcase"). Falls back to Standard

Text Decklist Format

Standard decklist format: COUNT NAME (SET) NUMBER, one card per line.

# JSON format
curl -X POST https://api.swuapi.com/deck-image \
  -H "Content-Type: application/json" \
  -d '{
    "cards": [
      {"name": "Han Solo, Audacious Smuggler", "type": "Leader", "variant": "Hyperspace"},
      {"name": "Mos Eisley", "type": "Base"},
      {"name": "Millennium Falcon, Piece of Junk", "type": "Space Unit", "count": 3},
      {"name": "Cunning", "type": "Event", "count": 3}
    ],
    "title": "Han Solo Aggro",
    "subtitle": "by terronk"
  }' --output deck.png

# Text decklist format
curl -X POST https://api.swuapi.com/deck-image \
  -H "Content-Type: application/json" \
  -d '{
    "text": "1 Han Solo (SOR) 017\n1 Mos Eisley (JTL) 030\n3 Cunning (SOR) 203\n3 Millennium Falcon (SOR) 155",
    "title": "Han Solo Aggro"
  }' --output deck.png

# Plain text body
curl -X POST https://api.swuapi.com/deck-image \
  -H "Content-Type: text/plain" \
  -d '1 Han Solo (SOR) 017
1 Mos Eisley (JTL) 030
3 Cunning (SOR) 203' --output deck.png
const response = await fetch('https://api.swuapi.com/deck-image', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    cards: [...],
    title: 'Han Solo Aggro',
    branding: { url: 'mysite.com' }  // optional
  })
})
const blob = await response.blob()
// Display or download the PNG image
GET /deck-image/decklist/:meleeId

Generate a deck image from a saved decklist. Returns PNG directly. Includes player name and tournament as subtitle. Embed in <img> tags or share directly.

Path Parameters

ParameterTypeDescription
meleeIdstringDecklist ID (UUID)

Query Parameters

ParameterTypeDescription
brandUrlstringOverride branding URL
brandNamestringOverride branding name
# Download deck image for a specific decklist
curl https://api.swuapi.com/deck-image/decklist/2261b229-5a8a-4ced-8b75-b3e200bca054 --output deck.png

# With custom branding
curl "https://api.swuapi.com/deck-image/decklist/2261b229?brandUrl=mysite.com" --output deck.png
<!-- Embed directly in HTML -->
<img src="https://api.swuapi.com/deck-image/decklist/2261b229-5a8a-4ced-8b75-b3e200bca054" />
GET /metas

List all meta eras. A meta era is a competitive period defined by available card pool and ban list. Set releases and mid-set bans create distinct sub-eras.

ParameterTypeDefaultDescription
format string all Filter by format: premiere or limited
curl https://api.swuapi.com/metas

curl "https://api.swuapi.com/metas?format=premiere"
{
  "metas": [
    {
      "id": "JTL-pre-ban",
      "name": "Jump to Lightspeed (pre-ban)",
      "set": "JTL",
      "setName": "Jump to Lightspeed",
      "format": "premiere",
      "start": "2025-03-14",
      "end": "2025-04-11",
      "isCurrent": false,
      "bans": []
    },
    {
      "id": "JTL-post-ban",
      "name": "Jump to Lightspeed (post-ban)",
      "set": "JTL",
      "setName": "Jump to Lightspeed",
      "format": "premiere",
      "start": "2025-04-11",
      "end": "2025-07-11",
      "isCurrent": false,
      "bans": [
        { "card": "Jango Fett, Concealing the Conspiracy", "cardId": "TWI_016", "action": "suspended", "effectiveDate": "2025-04-11", "format": "premiere" }
      ]
    }
  ]
}
GET /metas/current

Get the current active meta era.

ParameterTypeDefaultDescription
format string premiere Format: premiere or limited
curl https://api.swuapi.com/metas/current
GET /metas/:id

Get a specific meta era by ID (e.g., JTL-post-ban, SOR, TWI-limited).

curl https://api.swuapi.com/metas/JTL-post-ban
GET /metas/dropdown

Get metas formatted for UI dropdowns. By default, when a set has sub-eras (pre-ban/post-ban), only the sub-eras are returned (not the full set entry). Sorted newest first.

ParameterTypeDefaultDescription
format string premiere Format: premiere or limited
includeFullSet boolean false Include full-set entries alongside sub-eras
curl https://api.swuapi.com/metas/dropdown
{
  "options": [
    { "id": "LAW", "name": "A Lawless Time", "isCurrent": true },
    { "id": "SEC", "name": "Secrets of Power", "isCurrent": false },
    { "id": "LOF-post-ban", "name": "Legends of the Force (post-ban)", "isCurrent": false },
    { "id": "LOF-pre-ban", "name": "Legends of the Force (pre-ban)", "isCurrent": false }
  ]
}
GET /metas/bans

List all ban/suspension events.

curl https://api.swuapi.com/metas/bans
GET /metas/sets

List all set release dates.

curl https://api.swuapi.com/metas/sets
GET /merges

Get the merge log for sync consumers. When entities are merged (duplicate archetypes, duplicate players), this endpoint reports what was merged and when. Consumers should poll this periodically and re-point their local references.

Query Parameters

Parameter Type Default Description
since string (required) ISO 8601 timestamp — only return merges after this time
curl "https://api.swuapi.com/merges?since=2026-03-01T00:00:00Z"
{
  "merges": [
    {
      "entity_type": "archetype",
      "from_id": 99,
      "to_id": 42,
      "merged_at": "2026-03-20T15:30:00.000Z"
    },
    {
      "entity_type": "player",
      "from_id": 500,
      "to_id": 123,
      "merged_at": "2026-03-20T16:00:00.000Z"
    }
  ]
}

Card Object

Complete reference for all card fields.

Card Identifiers

Each card has several identifiers:

Field Type Description Unique?
uuidUUIDStable unique identifier (ours)Yes
external_idintegerSource API integer IDYes
collector_numberstringPrinted card code (SET_NUMBER format)No — variants share the same number
external_uidstringSource API string UIDYes

Examples:

Card uuid external_id collector_number variant_type
Standard Luke59e4...5SOR_005Standard
Foil Lukea3b2...9745SOR_005Standard Foil
Hyperspace Lukef1c7...981SOR_278Hyperspace

Use uuid as the primary identifier. collector_number is not unique — foil and non-foil share the same printed number. Hyperspace cards have their own printed numbers.

Fields

Field Type Description
uuidUUIDStable unique identifier
external_idintSource API integer ID (unique per variant)
collector_numberstringPrinted card code (SET_NUMBER format, e.g., SOR_005)
external_uidstringSource API string UID
namestringCard name
subtitlestringCard subtitle
setCodestringSet code (e.g., SOR)
cardNumberstringNumber within set
serialCodestringFull serial code
typestringLeader, Unit, Event, Upgrade, Base
type2stringSecondary type (e.g., Leader Unit)
raritystringCommon, Uncommon, Rare, Legendary, Special
costintResource cost
powerintAttack power
hpintHealth points
upgradePowerintPower modifier (upgrades)
upgradeHpintHP modifier (upgrades)
arenastringGround or Space
aspectsarrayAspect names
aspectDuplicatesarrayDuplicate aspects
traitsarrayTrait names (Rebel, Jedi, etc.)
keywordsarrayKeywords (Ambush, Sentinel, etc.)
textstringCard ability text
deployBoxstringLeader deploy ability
epicActionstringEpic action text
rulesstringAdditional rules
variantTypestringStandard, Hyperspace, Standard Foil, Hyperspace Foil, Showcase, Prerelease Promo, etc.
isUniqueboolWhether card is unique
isLeaderboolIs a leader card
isBaseboolIs a base card
frontImageUrlstringFront card image URL
backImageUrlstringBack card image URL
thumbnailUrlstringThumbnail image URL
artFrontHorizontalboolFront art orientation
artBackHorizontalboolBack art orientation
artiststringCard artist name
variantsarraystrapiIds of variant cards
variantOfintstrapiId of original (if variant)
reprintsarraystrapiIds of reprint cards
reprintOfintstrapiId of original (if reprint)

Set Codes

Known set codes and their full names.

Code Name
SORSpark of Rebellion
SHDShadows of the Galaxy
TWITwilight of the Republic
JTLJump to Lightspeed
LOFLegends of the Force
SECSecrets of Power
LAWA Lawless Time

Meta Eras

Competitive periods defined by card pool and ban list. Set releases create new eras; mid-set bans split an era into pre-ban and post-ban sub-eras.

ID Name Start End
SORSpark of Rebellion2024-03-082024-07-12
SHDShadows of the Galaxy2024-07-122024-11-09
TWITwilight of the Republic2024-11-092025-03-14
JTL-pre-banJump to Lightspeed (pre-ban)2025-03-142025-04-11
JTL-post-banJump to Lightspeed (post-ban)2025-04-112025-07-11
LOF-pre-banLegends of the Force (pre-ban)2025-07-112025-09-22
LOF-post-banLegends of the Force (post-ban)2025-09-222025-11-07
SECSecrets of Power2025-11-072026-03-13
LAWA Lawless Time2026-03-13(current)

Ban Events

Card Action Date
Jango Fett, Concealing the ConspiracySuspended2025-04-11
Triple Dark RaidSuspended2025-04-11
DJ, Blatant ThiefSuspended2025-04-11
Force ThrowSuspended2025-09-22

Tournament Tiers

Competitive event tiers in Star Wars: Unlimited organized play.

Code Name Description
PQPlanetary QualifierLocal-level competitive events
SQSector QualifierRegional-level competitive events
RQRegional QualifierMajor regional events
GCGalactic ChampionshipTop-tier championship events

Aspect Colors

SWU has four gameplay aspects, each with a canonical color. Heroism and Villainy are alignment aspects that modify brightness.

Aspect Color Name Hex Sample
Aggression Red #A83632
Command Green #338D5A
Cunning Yellow #C5A14F
Vigilance Blue #4B86AA

Alignment Modifiers

Alignment Effect Use
Heroism Lighter, slightly desaturated Hero leaders (Han Solo, Sabine, Luke, etc.)
Villainy Darker, more saturated Villain leaders (Vader, Palpatine, Boba Fett, etc.)

Base Naming Convention

Base HP Rarity Naming Example
30CommonColor 30Red 30, Yellow 30
28CommonForce ColorForce Blue, Force Red
27CommonSplash ColorSplash Green, Splash Yellow
variesRare/SpecialCard nameTarkintown, Data Vault, ECL

Archetype Nicknames

Each archetype has a short nickname: FirstName (SET) BaseNick. Titles/ranks are stripped to get the character's name. (SET) is only included when multiple distinct leaders share the same first name.

Full Name Nickname Rule
Han Solo, Audacious Smuggler - Red 30Han RedSimple first name + base color
Darth Vader, Dark Lord of the Sith - Force BlueVader (SOR) Force BlueTitle stripped, (SET) for disambiguation
Grand Admiral Thrawn, Patient and Insightful - Data VaultThrawn (SOR) DVMulti-word title stripped, base abbreviated
Grand Moff Tarkin, Oversector Governor - TarkintownTarkin TTSW title stripped, base abbreviated
Moff Gideon, Formidable Commander - Red 30Gideon RedSW title stripped
Grand Inquisitor, Hunting the Jedi - TarkintownGrand Inquisitor TTFull name IS the character's identity
The Mandalorian, Sworn To The Creed - Red 30Mando RedSpecial case
Boba Fett, Any Methods Necessary - Energy Conversion LabBoba (JTL) ECLMultiple Bobas need (SET)

Base Abbreviations in Nicknames

BaseNickname
TarkintownTT
Energy Conversion LabECL
Data VaultDV
Lake CountryLake
Red 30 / Blue 30 / etc.Red / Blue / etc.
Force Blue / Splash Green / etc.Unchanged
Other rare basesFull name