The hardest part of learning to call an API is finding one that works. Half the lists you will find point at services that have since started charging, moved behind a sign-up form, or quietly stopped responding. Every endpoint below was called before this was published, and the responses you see are the ones that came back.
None of them need a credit card. Only one needs anything resembling a key, and that key is the number 1.
What makes an API worth practising with
- No sign-up. If you have to make an account before you can see a response, you will lose an evening to the account and none of it to the code.
- Readable responses. A good practice API returns something you can understand by looking at it.
- Some mess. Data that is too tidy teaches you nothing. Real APIs return missing fields, odd shapes and inconsistent types, and you need practice with that.
- It stays up. Which is why every one of these was tested rather than copied from another list.
1. JSONPlaceholder — Fake posts, users and comments
The one to start with. It serves made-up blog posts, users, comments and to-dos, and it accepts POST, PUT and DELETE as well — it pretends to save them and hands back what a real API would. That makes it the only API on this list you can practise writing against without needing an account anywhere.
https://jsonplaceholder.typicode.com/posts/1What comes back:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi ...",
"body": "quia et suscipit\nsuscipit recusandae consequuntur exped..."
}Build with it: A full CRUD app: list posts, open one, add one, edit it, delete it. Every front-end tutorial’s first real project.
2. Open-Meteo — Weather, without an API key
Most weather APIs want a key and a credit card. This one wants neither. You pass a latitude and longitude and it returns current conditions and a forecast. Free for non-commercial use with no sign-up at all.
https://api.open-meteo.com/v1/forecast?latitude=28.61&longitude=77.21¤t=temperature_2mWhat comes back:
{
"latitude": 28.576448,
"longitude": 77.18678,
"generationtime_ms": 0.023245811462402344,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT"
}Build with it: A weather widget that asks the browser for the user’s location and shows the temperature. Teaches geolocation and query parameters in one go.
3. ZenQuotes — Random quotes
One endpoint, one random quote, no key. Useful precisely because the response is so small — you can see the whole thing at once while you are still learning what JSON looks like.
https://zenquotes.io/api/randomWhat comes back:
[
{
"q": "Night is a more quiet time to work. It aids thought.",
"a": "Alexander Graham Bell",
"h": "<blockquote>“Night is a more quiet time to work. ..."
}
]Build with it: A quote-of-the-day card with a refresh button. The smallest possible project that still involves a real network request.
4. TheMealDB — Recipes, ingredients and photos
Search recipes by name, ingredient or country. Each result carries the instructions, a photo and a list of ingredients with measures. The public test key is the number 1, which is in the URL below.
https://www.themealdb.com/api/json/v1/1/search.php?s=biryaniWhat comes back:
{
"meals": [
{
"idMeal": "52805",
"strMeal": "Lamb Biryani",
"strMealAlternate": null,
"strCategory": "Lamb",
"strArea": "India",
"strCountry": "India"
}
]
}Build with it: A recipe search app. The ingredient list is awkward in the response — twenty numbered fields rather than an array — which is excellent practice at reshaping data you did not design.
5. Dog CEO — Dog photos by breed
A free image API built on a public dataset of dog photographs. Random image, random by breed, or a list of every breed it knows.
https://dog.ceo/api/breeds/image/randomWhat comes back:
{
"message": "https://images.dog.ceo/breeds/mastiff-bull/n02108422_13...",
"status": "success"
}Build with it: An infinite-scroll gallery. Images are large enough to make you think about lazy loading, which most tutorials skip.
6. The Cat API — Cat photos, with a search endpoint
The same idea as Dog CEO with a slightly richer API: the basic search works with no key, and each result carries the image’s dimensions so you can size the container before it loads.
https://api.thecatapi.com/v1/images/searchWhat comes back:
[
{
"id": "Gcx2BUQkH",
"url": "https://s3.us-west-2.amazonaws.com/cdn2.thecatapi.com/i...",
"width": 1920,
"height": 1080
}
]Build with it: A gallery that does not jump about while it loads, because you have the dimensions up front.
7. PokeAPI — A large, deeply nested dataset
Every Pokemon, with its stats, types, abilities, moves and sprites. The response for a single Pokemon is around 300 KB of deeply nested JSON, which is the point: it is the best free API for practising digging into a structure you did not write.
https://pokeapi.co/api/v2/pokemon/pikachuWhat comes back:
{
"id": 25,
"name": "pikachu",
"base_experience": 112,
"height": 4,
"is_default": true,
"order": 35
}Build with it: A search-and-detail app. It will teach you more about nested objects and arrays than any tutorial, because you have to find the data yourself.
8. Frankfurter — Currency exchange rates
Rates published by the European Central Bank, with historical data going back years. No key, no rate limit worth worrying about.
https://api.frankfurter.dev/v1/latest?base=USD&symbols=INRWhat comes back:
{
"amount": 1.0,
"base": "USD",
"date": "2026-09-28",
"rates": {
"INR": 95.98
}
}Build with it: A currency converter. The historical endpoint lets you draw a chart, which is a natural next step once the basic conversion works.
9. Open Library — Books, authors and covers
The Internet Archive’s book database. Search by title, author or ISBN and get publication years, author names and cover images.
https://openlibrary.org/search.json?q=wings+of+fire&limit=1&fields=title,author_name,first_publish_yearWhat comes back:
{
"numFound": 489,
"start": 0,
"numFoundExact": true,
"num_found": 489,
"documentation_url": "https://openlibrary.org/dev/docs/api/search",
"q": "wings of fire"
}Build with it: A reading list app. Real book data is messy — missing years, several authors, alternative titles — which is exactly what production data is like.
10. Bible API — Scripture by reference
Pass a book, chapter and verse in the URL and get the text back. No key. Several translations available.
https://bible-api.com/john+3:16What comes back:
{
"reference": "John 3:16",
"verses": [
{
"book_id": "JHN",
"book_name": "John",
"chapter": 3,
"verse": 16,
"text": "\nFor God so loved the world, that he gave his one and o..."
}
],
"text": "\nFor God so loved the world, that he gave his one and o...",
"translation_id": "web",
"translation_name": "World English Bible",
"translation_note": "Public Domain"
}Build with it: A verse-of-the-day page, or a reference lookup. The URL format is unusually readable, which makes it a gentle introduction to path parameters.
11. CountriesNow — Country data
Population, capitals, currencies, flags and dial codes for every country. Worth knowing because the API most tutorials point at for this — REST Countries — was returning errors on every endpoint when this list was checked.
https://countriesnow.space/api/v0.1/countries/capital/q?country=indiaWhat comes back:
{
"error": false,
"msg": "country and capitals retrieved",
"data": {
"name": "India",
"capital": "New Delhi",
"iso2": "IN",
"iso3": "IND"
}
}Build with it: A country explorer with search and filtering. Also the data behind a phone-number input with the right dial codes.
12. GitHub REST API — Real production data
Public profiles, repositories, issues and commits, with no authentication for read-only requests. This is the only API on the list that is a real product rather than a practice toy, so its responses carry pagination, rate limit headers and proper error codes.
What comes back:
Build with it: A profile viewer that takes a username and shows their repositories. The rate limit headers are worth reading — they are how real APIs tell you to slow down.
How to call any of these from JavaScript
Every API above answers a plain GET request, so the same few lines work for all of them:
async function getQuote() {
const response = await fetch( 'https://zenquotes.io/api/random' );
if ( ! response.ok ) {
throw new Error( 'Request failed: ' + response.status );
}
const data = await response.json();
console.log( data[0].q ); // the quote
console.log( data[0].a ); // who said it
}
getQuote().catch( console.error );Two things there matter more than they look. response.ok is false for a 404 or a 500, and fetch does not throw on those by itself — without that check your code carries on and fails somewhere less obvious. And the .catch() at the end is what catches a dropped connection, which is a different failure from a bad response and needs handling separately.
Common questions
Which one should I start with?
JSONPlaceholder, because it is the only one that accepts writes. You can build a complete create-read-update-delete app against it without an account anywhere, and that is the shape of most real applications.
Why am I getting a CORS error?
Because the API has not allowed browser requests from your page. All the APIs listed here do allow them, so if you hit CORS it is usually a different service — or you are calling over http from an https page. The fix is never a browser extension that disables the check; it is to call the API from your own server and pass the result to the browser.
Can I use these in a real product?
Read each one’s terms first. Several are free for personal and learning use but ask you to pay or attribute once there is money involved. Open-Meteo and Frankfurter are explicit about non-commercial use being free; GitHub’s rate limits tighten sharply without authentication.
What if one of these stops working?
It happens, and it is why this list is checked rather than copied. REST Countries used to be the obvious recommendation for country data and every endpoint was returning an error when this was written, which is how CountriesNow ended up on the list instead.
Views: 3,780