API Notice
Published by Ian Patel, Founder of WorldSolve
WorldSolve provides a free public API that allows researchers, builders, entrepreneurs, students, and developers to access structured problem records from the repository. The API can be used to discover, filter, analyze, and build applications around problems worth solving.
API endpoint
The current API endpoint is:
https://worldsolve.org/index.php?api=problemsThe API returns JSON data containing problem records and pagination metadata.
Basic request
You can retrieve the first page of problems using:
curl -L "https://worldsolve.org/index.php?api=problems"
The same request can be made with Python:
import requests
url = "https://worldsolve.org/index.php"
response = requests.get(
url,
params={"api": "problems"},
timeout=30
)
response.raise_for_status()
data = response.json()
print(data)
Response format
A successful response has the following general structure:
{
"ok": true,
"meta": {
"total": 4194,
"page": 1,
"per_page": 20,
"total_pages": 210,
"has_next": true
},
"data": [
{
"citation_id": "WS06733",
"id": 6733,
"title": "Problem title",
"explanation": "Problem description",
"category": "Social Civic Problems",
"status": "open",
"tags": ["social", "civic"],
"continent": "Global",
"country": "Global",
"contributor_name": "Ian Patel",
"created_at": "2026-08-20T16:40:00Z",
"year_horizon": "2030"
}
]
} The meta object contains the total number of records and pagination information. The data array contains the problem records returned for that request.
Pagination
The API returns a limited number of records per request. To retrieve a later page, include the page parameter.
import requests
url = "https://worldsolve.org/index.php"
response = requests.get(
url,
params={"api": "problems", "page": 2},
timeout=30
)
response.raise_for_status()
data = response.json()
for problem in data.get("data", []):
print(problem["citation_id"], problem["title"])
Retrieve all pages
Applications that need the complete public collection can continue requesting pages until has_next is false.
import requests
url = "https://worldsolve.org/index.php"
all_problems = []
page = 1
while True:
response = requests.get(
url,
params={"api": "problems", "page": page},
timeout=30
)
response.raise_for_status()
result = response.json()
if not result.get("ok"):
raise RuntimeError(result.get("error", "Unknown API error"))
all_problems.extend(result.get("data", []))
if not result.get("meta", {}).get("has_next", False):
break
page += 1
print(f"Retrieved {len(all_problems)} problems.")
Filtering
The problems endpoint supports optional filters. Query parameters should be URL-encoded when they contain spaces or special characters.
Filter by category
import requests
url = "https://worldsolve.org/index.php"
response = requests.get(
url,
params={"api": "problems", "category": "Social Civic Problems"},
timeout=30
)
response.raise_for_status()
data = response.json()
for problem in data.get("data", []):
print(f"[{problem['citation_id']}] {problem['title']}")
Use category names exactly as they are stored in the API. Current examples include:
Mathematics LogicClimate EnvironmentSocial Civic ProblemsEconomics ResourcesOther
Category names may change as the taxonomy develops. Applications should handle empty results gracefully.
Filter by status
To request only open problems, use:
params = {
"api": "problems",
"status": "open"
} Applications should inspect the returned response and should not assume that every problem will always remain open. WorldSolve records may be updated to reflect partial progress, resolution, or reclassification.
Other filters
| Parameter | Purpose | Example |
|---|---|---|
q | Searches problem text and location fields. | q=water |
keyword | Searches titles and explanations. | keyword=education |
category | Filters by category. | category=Other |
status | Filters by open or solved. | status=open |
continent | Filters by continent. | continent=Asia |
country | Filters by country. | country=India |
tag | Filters by tag. | tag=climate |
year_horizon | Filters by target year. | year_horizon=2030 |
contributor | Filters by contributor ID or name. | contributor=Ian+Patel |
sort | Sorts by newest, oldest, or ID. | sort=newest |
Available endpoints
| Endpoint | Description | Example |
|---|---|---|
problems | Returns a paginated list of public problems. | Open endpoint |
problem | Returns one problem and related problems. | Open endpoint |
categories | Returns problem counts grouped by category. | Open endpoint |
stats | Returns total, open, and solved problem counts. | Open endpoint |
Using citations
Every problem has a citation identifier, such as:
WS06733
A problem can be cited using its dedicated WorldSolve page:
https://worldsolve.org/index.php?view=problem&id=6733
Example citation:
WS06733, WorldSolve, "Implementing proven strategies against global cooperation remaining weaker than needed by 2030," WorldSolve.org, accessed August 2026. The & character must be written as & inside HTML source, but as a normal & in a terminal command or Python URL.
Error handling
A failed request may return:
{
"ok": false,
"error": "Description of the error"
} Applications should check both the HTTP status and the ok field:
if response.status_code != 200:
print("HTTP error:", response.status_code)
elif not data.get("ok"):
print("API error:", data.get("error"))
else:
print("Request successful")
Responsible use
Please use the API responsibly:
- Cache responses where appropriate.
- Avoid sending unnecessary repeated requests.
- Do not attempt to bypass rate limits.
- Attribute WorldSolve when displaying or redistributing records.
- Preserve each problem's citation ID and source URL.
- Do not present WorldSolve problem statements as verified facts unless you independently verify their sources.
- Respect contributor attribution.
- Contact Team Humans Club before creating a commercial derivative that substantially republishes the entire repository.