Documentation

This guide covers everything you need to know about using free public APIs listed in our directory. Whether you are building a side project, a prototype, or learning to code, these APIs provide valuable data without cost.

Introduction

FWVAPI is a curated directory of free and open public APIs. Our goal is to help developers discover useful APIs quickly without sifting through outdated lists or broken endpoints.

Each API entry in our catalog includes:

Quick Start

The fastest way to get started is to pick an API from our catalog that does not require authentication. Here is an example using the REST Countries API:

curl -s "https://restcountries.com/v3.1/name/netherlands" | python3 -m json.tool

This returns detailed information about the Netherlands, including population, area, languages, and currencies.

Authentication

APIs in our directory use one of three authentication methods:

Type Description Header Example
Free No authentication required. Make requests immediately. N/A
API Key Register for a free key. Pass it as a query parameter or header. X-API-Key: your_key
OAuth Standard OAuth 2.0 flow. Requires app registration. Authorization: Bearer token

Making Requests

Most APIs in our catalog follow RESTful conventions. Here are the standard HTTP methods you will encounter:

Method Purpose Example
GET Retrieve data GET /api/v1/users
POST Create a resource POST /api/v1/users
PUT Update a resource PUT /api/v1/users/42
DELETE Remove a resource DELETE /api/v1/users/42

Common Query Parameters

Many APIs support these standard query parameters:

Rate Limiting

Most APIs enforce rate limits to prevent abuse. Common response headers include:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1709856000
Retry-After: 30

Best practices for handling rate limits:

Error Handling

Standard HTTP status codes are used across most APIs:

Code Meaning Action
200SuccessProcess the response
400Bad RequestCheck your query parameters
401UnauthorizedVerify your API key or token
403ForbiddenCheck permissions or plan limits
404Not FoundVerify the endpoint URL
429Too Many RequestsWait and retry with backoff
500Server ErrorRetry later; not your fault

Pagination

APIs with large datasets typically support pagination. Two common patterns:

Offset-based

GET /api/items?page=2&per_page=25
# Response includes:
# "total": 342, "page": 2, "per_page": 25

Cursor-based

GET /api/items?cursor=eyJpZCI6MTAwfQ&limit=25
# Response includes:
# "next_cursor": "eyJpZCI6MTI1fQ"

cURL Examples

Simple GET request

# Get current weather for Amsterdam
curl -s "https://api.open-meteo.com/v1/forecast?latitude=52.37&longitude=4.89¤t_weather=true"

# Get a random user
curl -s "https://randomuser.me/api/" | python3 -m json.tool

# Get country information
curl -s "https://restcountries.com/v3.1/alpha/NL"

With API key

# OpenWeatherMap (replace YOUR_KEY)
curl -s "https://api.openweathermap.org/data/2.5/weather?q=Amsterdam&appid=YOUR_KEY&units=metric"

Python Examples

import requests

# No authentication required
response = requests.get("https://api.open-meteo.com/v1/forecast", params={
    "latitude": 52.37,
    "longitude": 4.89,
    "current_weather": True
})
data = response.json()
print(f"Temperature: {data['current_weather']['temperature']}C")

# With API key
API_KEY = "your_api_key_here"
response = requests.get(
    "https://api.openweathermap.org/data/2.5/weather",
    params={"q": "Amsterdam", "appid": API_KEY, "units": "metric"}
)
weather = response.json()
print(f"Weather: {weather['weather'][0]['description']}")

JavaScript Examples

// Using fetch (browser or Node.js 18+)
const response = await fetch(
  "https://api.open-meteo.com/v1/forecast?latitude=52.37&longitude=4.89¤t_weather=true"
);
const data = await response.json();
console.log(`Temperature: ${data.current_weather.temperature}C`);

// With error handling
async function fetchAPI(url) {
  try {
    const res = await fetch(url);
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  } catch (err) {
    console.error("API Error:", err.message);
    return null;
  }
}

const countries = await fetchAPI("https://restcountries.com/v3.1/all");
console.log(`Found ${countries.length} countries`);