Open it, pick a section like Finance, News, Sports, or Science, then filter for entries with Auth: No. You get URLs you can hit right away from curl, HTTPie, or your app. When you want keys, you will see which ones have a free tier and the link to docs. I test with NASA's APOD using the DEMO_KEY, and no-key Dog API for instant wins.
You want a quick win. Open the public-apis/public-apis repo on GitHub. Scroll the categories, then press t to search inside the file for your topic. Focus on rows where Auth is No so you can hit them without setup.
Install HTTPie (a friendly curl-like HTTP client) so you can try URLs fast from the terminal.
bash
brew install httpie
Verify with a no-key call. Dog CEO Dog API is tagged No. This returns a random dog image URL you can drop into any prototype.
bash
http GET https://dog.ceo/api/breeds/image/random
You should see JSON with message and status. If you want a Science example, NASA's APOD works with DEMO_KEY and returns today’s space photo URL. Keep it under 30 requests per hour and 50 per day on DEMO_KEY. For production, request your own key. That is enough to prove the repo saves you time before you dig into deeper config.
You want a quick win. Open the public-apis/public-apis repo on GitHub. Scroll the categories, then press t to search inside the file for your topic. Focus on rows where Auth is No so you can hit them without setup.
Install HTTPie (a friendly curl-like HTTP client) so you can try URLs fast from the terminal.
bash
brew install httpie
Verify with a no-key call. Dog CEO Dog API is tagged No. This returns a random dog image URL you can drop into any prototype.
bash
http GET https://dog.ceo/api/breeds/image/random
You should see JSON with message and status. If you want a Science example, NASA's APOD works with DEMO_KEY and returns today’s space photo URL. Keep it under 30 requests per hour and 50 per day on DEMO_KEY. For production, request your own key. That is enough to prove the repo saves you time before you dig into deeper config.
Setup
Get the list
bash
git clone https://github.com/public-apis/public-apis.git
cd public-apis
The README.md is the catalog. It has columns for API, Description, Auth, HTTPS, CORS, Link, Category.
Install a test client
Pick one. I use HTTPie for readability. curl works too.
- macOS
- HTTPie:
bash
brew install httpie
- curl ships with macOS. Update if you need HTTP/3 or newer TLS:
bash
brew install curl
- Linux
- Debian/Ubuntu:
bash
sudo apt update && sudo apt install -y httpie
- Fedora:
bash
sudo dnf install -y httpie
- Arch:
bash
sudo pacman -S --noconfirm httpie
- Windows
- HTTPie via winget:
bash
winget install --id HTTPie.HTTPie -e
- Or Chocolatey:
bash
choco install httpie -y
Optional helpers
- jq (a JSON CLI filter) for pretty output and slicing fields.
- macOS:
bash
brew install jq
- Debian/Ubuntu:
bash
sudo apt install -y jq
- Windows (winget):
bash
winget install --id jqlang.jq -e
Verify
Start with a no-key API so you see a response in seconds.
- Dog CEO Dog API, Auth: No
bash
http GET https://dog.ceo/api/breeds/image/random
Expected output:
HTTP/1.1 200 OK
Content-Type: application/json
{
"message": "https://images.dog.ceo/breeds/hound-afghan/n02088094_12345.jpg",
"status": "success"
}
Pipe the URL only:
bash
http GET https://dog.ceo/api/breeds/image/random | jq -r .message
- NASA APOD, Auth: apiKey. Use the public DEMO_KEY for quick tests.
bash
http GET "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY"
Expected output snippet:
HTTP/1.1 200 OK
Content-Type: application/json
{
"title": "Astronomy Picture of the Day",
"media_type": "image",
"url": "https://apod.nasa.gov/apod/image/....jpg"
}
Rate limits on DEMO_KEY are 30 requests per hour and 50 per day. For sustained use, request your own key in the official docs.
Configuration tips
1) Filter the list locally for Auth: No entries in a category. This pulls API name and link from markdown rows.
bash
grep -n "| No |" README.md | awk -F'|' '{gsub(/\[|\]/, ""); printf "- %s -> %s\n", $2, $7}' | sed 's/ */ /g' | head -20
2) Keep a .env with keys for quick swaps. For testing NASA:
bash
printf "NASA_API_KEY=DEMO_KEY\n" > .env
Load it in Python and fetch APOD:
py
import os, requests
from dotenv import load_dotenv
load_dotenv()
key = os.getenv("NASA_API_KEY")
r = requests.get("https://api.nasa.gov/planetary/apod", params={"api_key": key})
r.raise_for_status()
print(r.json()["url"])
Install deps:
bash
pip install python-dotenv requests
3) Add basic retries and timeouts so free endpoints do not freeze your app.
py
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
s = requests.Session()
retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504])
s.mount("https://", HTTPAdapter(max_retries=retries))
print(s.get("https://dog.ceo/api/breeds/image/random", timeout=5).json())
4) Cache GETs during dev to stay under limits.
bash
pip install requests-cache
py
import requests_cache
requests_cache.install_cache("devcache", expire_after=300)
5) Avoid CORS pain in browser apps. Fetch server-side in your API layer or use a tiny local proxy during dev.
bash
npm init -y && npm i express node-fetch@2
ts
// proxy.js
const express = require('express')
const fetch = require('node-fetch')
const app = express()
app.get('/dog', async (_req, res) => {
const r = await fetch('https://dog.ceo/api/breeds/image/random')
res.json(await r.json())
})
app.listen(3000)
Run it:
bash
node proxy.js
Then call http://localhost:3000/dog from your frontend.
Troubleshooting
- 429 Too Many Requests on NASA APOD
- Cause: DEMO_KEY rate limit hit. - Fix: Wait for the window to reset or request your own key. Add retries with backoff. Cache responses during dev.
- CORS error in the browser console
- Cause: Many free APIs do not send permissive CORS headers. - Fix: Fetch from your backend or use the local proxy shown above. Do not ship with public CORS proxies.
- HTTPie command not found
- Cause: Install did not land on PATH. - Fix: Reinstall using your platform package manager. On Windows, reopen PowerShell after winget install. On macOS with Homebrew, ensure /opt/homebrew/bin is in PATH.
- JSON parser error but the body looks like HTML
- Cause: You hit a docs page or a wrong URL. - Fix: Recheck the Link column in the repo and copy the exact endpoint path from the API’s docs section, not the homepage.
When it beats RapidAPI
- You want to explore options without accounts. Public APIs gives you working URLs and auth notes in one file. No login, no SDK install.
- You teach a class or workshop. Students can test no-key endpoints in minutes. No billing setup or subscription traps.
- You are building a small feature and do not want a marketplace proxy in the middle. You call the provider direct, read their docs, and control headers and retries.
- You need offline browsing. Clone the repo and grep for candidates on a plane. Tag good ones in your own fork.
Sources
Want a hand?
Book a 30-min call.
Walk through your stack with us. We'll find the bottleneck and map out the exact wiring you need — free.