PokéAPI
Free Pokémon API with no key: stats, types, abilities, moves, evolutions and sprites for 1,000+ species. The most popular API for learning REST. Tested example.
Endpoint tested and returned HTTP 200 on 2026-08-19
What is the PokéAPI?
PokéAPI is a free, key-free REST API providing comprehensive Pokémon data — stats, types, abilities, moves, evolution chains, sprites and more — for over 1,000 species across every generation.
PokéAPI is probably the most used API in programming education, and it deserves the position. The data is deeply interlinked, well documented and consistently structured, so it exercises real skills: following resource links, handling nested arrays and managing many related requests.
That interlinking is also the main gotcha. Most references are returned as URLs rather than embedded objects — a Pokémon's abilities give you names and links, and you must follow those links for the actual descriptions. Plan for multiple requests, cache aggressively, and be aware that a naive implementation can fire dozens of calls to render one page.
Quick facts
- Base URL
https://pokeapi.co/api/v2- Authentication
- No key required. The maintainers ask that you cache responses locally rather than re-fetching.
- Rate limit
- No hard limit, but fair-use caching is explicitly requested. Data is static, so caching is easy.
- Pricing
- Free and open source.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the PokéAPI
Every request below was executed against the live API on 2026-08-19, and the response shown is the real body it returned — not an illustration.
1. Fetch data for a Pokémon
GET https://pokeapi.co/api/v2/pokemon/pikachu
curl 'https://pokeapi.co/api/v2/pokemon/pikachu'const res = await fetch("https://pokeapi.co/api/v2/pokemon/pikachu");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://pokeapi.co/api/v2/pokemon/pikachu", timeout=20)
res.raise_for_status()
print(res.json()){"abilities":[{"ability":{"name":"static","url":"https://pokeapi.co/api/v2/ability/9/"},"is_hidden":false,"slot":1},{"ability":{"name":"lightning-rod","url":"https://pokeapi.co/api/v2/ability/31/"},"is_hidden":true,"slot":3}],"base_experience":112,"cries":{"latest":"https://raw.githubusercontent.com/PokeAPI/cries/main/cries/pokemon/latest/25.ogg","legacy":"https://raw.githubusercontent.com/PokeAPIParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
<name-or-id> | path | Required | Pokémon name (lowercase) or numeric id. pikachu |
limit / offset | query | Optional | Pagination on list endpoints. 20 |
Response fields
id / nameinteger|string- National Pokédex number and lowercase name.
typesarray- Type slots, each with a nested type name and URL.
statsarray- Base stats — HP, attack, defense, special attack, special defense, speed.
abilitiesarray- Abilities with links; descriptions require a follow-up request.
spritesobject- Image URLs including front, back, shiny and official artwork.
movesarray- Every learnable move with the method and level — a very large array.
What you can build with the PokéAPI
- Build a Pokédex app — the classic portfolio project
- Practise chained and parallel API requests with linked resources
- Create team builders and stat comparison charts
- Teach caching strategy with a genuinely cacheable dataset
Common errors and how to fix them
404
Unknown name or id.
Fix: Names are lowercase and hyphenated for variants, e.g. `mr-mime`, not `Mr. Mime`.
Very slow page render
Following every linked resource fires dozens of requests.
Fix: Fetch only the links you actually render, batch with Promise.all, and cache — the data never changes.
Missing sprite images
Not every Pokémon has every sprite variant.
Fix: Null-check sprite fields and fall back to official artwork.
PokéAPI — frequently asked questions
Is PokéAPI free and does it need a key?
Yes, free with no API key or signup. The maintainers ask only that you cache responses, since the data is static and re-fetching wastes their bandwidth.
Why are abilities and moves returned as URLs?
PokéAPI is a hypermedia API — related resources are linked rather than embedded, keeping responses manageable. Follow the URL when you need the detail, and cache the result.
How do I avoid hammering PokéAPI?
Cache everything locally. The dataset is effectively immutable, so a response cached today is still valid indefinitely. Batch parallel fetches with Promise.all rather than looping sequentially.
Are Pokémon names case-sensitive?
Use lowercase. Variant forms are hyphenated, so it is `mr-mime` and `nidoran-f`, not the display spellings.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON Validator
Free online JSON validator: validate JSON and find syntax errors with the exact line and column. See root type, key counts and depth — instant and 100% private.
PokéAPI is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-19; always check the official documentation before relying on this API in production, as terms and limits can change.