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
| Request | Returns |
|---|---|
| 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/:id | One card by its UUID. |
| GET /sets | Every set, with printing counts. |
| GET /sets/:code | One set by code, e.g. ogn. |
| GET /bulk-data | Index of the bulk exports. |
| GET /bulk/cards | The whole catalogue — 1356 printings, ~1.2 MB. |
| GET /health | Liveness check. |
Searching
/cards/search takes the same query syntax as the site's search
box, documented in full on the syntax guide.
| Example | Finds |
|---|---|
| /cards/search?q=t:unit d:fury e<=3 | Cheap Fury units. |
| /cards/search?q=t:gear p:1 | Gear costing one rune. |
| /cards/search?q=s:ogn r:epic | Epics 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
| Field | Meaning |
|---|---|
| id | Stable UUID for this printing. |
| oracle_id | Shared by every printing of the same card. |
| name | Printed name, including any variant suffix. |
| type / domains | Card type; domains are also which runes may pay the rune cost. |
| energy | Energy cost. |
| power | Rune cost — how many runes are recycled to play it. null when there is none. |
| might | Combat stat on units. |
| rules_text / flavor_text | Plain text. Rules text keeps :rb_*: symbol shortcodes. |
| keywords / tags | Lowercased arrays. |
| set / set_name / collector_number | Which printing this is. |
| rarity / artist / variant | Print details. variant is alternate, signature, showcase or null. |
| riftbound_id | Riot's own id, e.g. ogn-025-298. Not unique — 52 promos share one. |
| porodb_uri | Canonical path for this printing on porodb.com. |
| images | full 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.
| Endpoint | Browser | Edge |
|---|---|---|
| /cards/search | 60s browser | 1h edge, 24h stale-while-revalidate |
| /cards/:id, /cards/named | 1h browser | 24h edge |
| /sets, /sets/:code | 1h browser | 24h edge |
| /bulk/cards | 1h browser | 24h 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.