Scryfall MTG Card Search
Search for Magic: The Gathering cards using the Scryfall API.
API Overview
Base URL: https://api.scryfall.com
Required Headers:
headers = {
"User-Agent": "OpenClawMTGSkill/1.0",
"Accept": "application/json"
}
Rate Limiting: Insert 50-100ms delay between requests (max 10 req/sec).
Core Endpoints
Search Cards
GET /cards/search?q={query}
Parameters:
q(required): Fulltext search queryunique: cards|art|prints (default: cards)order: name|set|released|rarity|color|usd|tix|eur|cmc|power|toughness|edhrec|penny|artist|reviewdir: auto|asc|descpage: Page number for pagination
Named Card Lookup
GET /cards/named?exact={name}
GET /cards/named?fuzzy={name}
Use fuzzy for partial matches (e.g., "jac bele" โ "Jace Beleren").
Add &set={code} to limit to specific set.
Random Card
GET /cards/random
GET /cards/random?q={query}
Card by ID
GET /cards/{id}
GET /cards/{set_code}/{collector_number}
Autocomplete
GET /cards/autocomplete?q={partial_name}
Returns up to 20 card name suggestions.
Search Syntax Reference
See references/search_syntax.md for the complete search syntax guide.
Quick examples:
c:red pow=3- Red cards with power 3t:merfolk t:legend- Legendary merfolko:"draw a card"- Cards with "draw a card" in textcmc=3 r:rare- 3-mana rarese:dom- Cards from Dominariaf:standard- Standard legal cardsusd<1- Cards under $1
Implementation
Use the provided script for common operations:
python3 scripts/scryfall_search.py search "lightning bolt"
python3 scripts/scryfall_search.py named --exact "Black Lotus"
python3 scripts/scryfall_search.py random
python3 scripts/scryfall_search.py random --query "t:dragon"
Or make direct API calls with proper headers and rate limiting.
Card Object Key Fields
When displaying card info, prioritize these fields:
name,mana_cost,type_lineoracle_text,power,toughnessimage_uris.normal(for card image)prices.usd,prices.usd_foillegalities(format legality)set_name,rarity
For double-faced cards, check card_faces array.
Error Handling
- 404: Card not found
- 422: Invalid search query
- 429: Rate limited (wait and retry)
Always validate responses have object field; if object: "error", check details for message.