BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://pokeapi.co/api/v2/pokemon/pikachu'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://pokeapi.co/api/v2/pokemon/pikachu", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{"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/PokeAPI

Parameters

ParameterTypeRequiredDescription
<name-or-id>pathRequiredPokémon name (lowercase) or numeric id. pikachu
limit / offsetqueryOptionalPagination 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

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.