API guide

Every card on this site is available as JSON from https://api.porodb.com. No key, no signup, no quota — all requests are GET, all responses are application/json, and CORS is open so you can call it straight from a browser app.

Fair use

There is no hard rate limit, which is a request rather than a promise. Keep bursts under roughly 10 requests per second and put a short delay between calls in a loop.

If you want more than a few hundred cards, do not crawl — download the bulk export once and work locally. It is one request instead of a thousand and it is faster for you.

Send a User-Agent that identifies your project. If something misbehaves, that is the difference between getting an email and getting blocked.

Endpoints

RequestReturns
GET /cards/search?q=…Search. Same syntax as the site — see the syntax guide.
GET /cards/named?exact=…One card by exact name.
GET /cards/:idOne card by its UUID.
GET /setsEvery set, with printing counts.
GET /sets/:codeOne set by code, e.g. ogn.
GET /bulk-dataIndex of the bulk exports.
GET /bulk/cardsThe whole catalogue — 1356 printings, ~1.2 MB.
GET /healthLiveness check.

Searching

/cards/search takes the same query syntax as the site's search box, documented in full on the syntax guide.

ExampleFinds
/cards/search?q=t:unit d:fury e<=3Cheap Fury units.
/cards/search?q=t:gear p:1Gear costing one rune.
/cards/search?q=s:ogn r:epicEpics in Origins.

Results are one printing per card by default — reprints and variants collapse into a single entry, and the rest are on that card's page. A query matching nothing returns 404, not an empty list.

Response shape

Lists are wrapped in an envelope:

{
  "object": "list",
  "total_cards": 41,
  "has_more": false,
  "next_page": null,
  "data": [ /* card objects */ ]
}

Errors use the same convention, with the HTTP status repeated in the body:

{
  "object": "error",
  "status": 404,
  "code": "not_found",
  "details": "Your query didn't match any cards. Adjust your search terms."
}

The card object

FieldMeaning
idStable UUID for this printing.
oracle_idShared by every printing of the same card.
namePrinted name, including any variant suffix.
type / domainsCard type; domains are also which runes may pay the rune cost.
energyEnergy cost.
powerRune cost — how many runes are recycled to play it. null when there is none.
mightCombat stat on units.
rules_text / flavor_textPlain text. Rules text keeps :rb_*: symbol shortcodes.
keywords / tagsLowercased arrays.
set / set_name / collector_numberWhich printing this is.
rarity / artist / variantPrint details. variant is alternate, signature, showcase or null.
riftbound_idRiot's own id, e.g. ogn-025-298. Not unique — 52 promos share one.
porodb_uriCanonical path for this printing on porodb.com.
imagesfull and thumb URLs.

Bulk data

/bulk/cards returns all 1356 printings in one response, about 1.2 MB. It is the same file the site itself builds from, so it will never disagree with what you see here. Fetch it once a day at most — card data only changes when a set does.

curl -s https://api.porodb.com/bulk/cards > cards.json

Caching

Responses are cached at Cloudflare's edge, so most requests never reach the origin. Respect these and you will rarely notice a limit exists.

EndpointBrowserEdge
/cards/search60s browser1h edge, 24h stale-while-revalidate
/cards/:id, /cards/named1h browser24h edge
/sets, /sets/:code1h browser24h edge
/bulk/cards1h browser24h edge, 7d stale-while-revalidate

Examples

# shell
curl -s "https://api.porodb.com/cards/search?q=t:gear%20p:1"

# PowerShell — note curl is an alias for Invoke-WebRequest, so use the native cmdlet
Invoke-RestMethod "https://api.porodb.com/sets" | Select-Object -ExpandProperty data

# browser / Node
const res = await fetch("https://api.porodb.com/cards/named?exact=Blind Fury");
const card = await res.json();
console.log(card.energy, card.power, card.domains);

Terms

Free for any use, commercial included. porodb is unofficial Fan Content under Riot Games' Legal Jibber Jabber policy — card names, text and images are Riot's, and your project inherits the same terms. A link back is appreciated but not required.