Search the independent web.
One HTTP endpoint. Send a query, get back ranked, deduplicated results from the WebAtlas index — no scraping, no headless browsers, no rate-limit roulette.
The WebAtlas API gives programmatic access to the same index that powers WebAtlas search. Every request is authenticated with an API key tied to a subscription plan, and every response is plain JSON — ranked by relevance, deduplicated by domain, and optionally filtered for safe search.
Authentication
Every request needs a key query parameter. Keys are issued per plan from your
WebAtlas Cloud dashboard
after subscribing, and look like this:
wa_3f8a1b2c4d9e7f1a0b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e
Keys are passed in the URL, not in a header — this keeps simple GET requests
copy-pasteable in a browser or curl one-liner.
Quickstart
A minimal search request with curl:
curl
"https://cloud.webatlasindex.pl/api.php?q=polish+search+engines&key=YOUR_API_KEY"
The same request in JavaScript:
const res = await fetch(
"https://cloud.webatlasindex.pl/api.php?q=polish+search+engines&key=YOUR_API_KEY"
);
const data = await res.json();
console.log(data.results);
And in Python:
import requests
res = requests.get(
"https://cloud.webatlasindex.pl/api.php",
params={"q": "polish search
engines", "key": "YOUR_API_KEY"},
)
data = res.json()
print(data["results"])
Endpoint
This is the only endpoint in the API. All search functionality is controlled through query parameters below.
Parameters
| Parameter | Type | Description |
|---|---|---|
| keyrequired | string | Your API key, format wa_<48 hex chars>. Get one from the
dashboard. |
| qrequired | string | Search query. Max 200 characters. URL-encode spaces and special characters. |
| langoptional | string | 2-letter language filter (e.g. pl, en, de).
Non-letter characters are stripped automatically. |
| dateoptional | string | Filter by publish date. Accepts any format strtotime() understands
(e.g. 2026-06-01). Invalid dates are ignored silently. |
| safeoptional | boolean | Set to true to exclude adult content and known unsafe domains from
results. Default is off. |
| pageoptional | integer | Page number for pagination, starting at 1. Default 1. |
Response format
All responses are JSON with a top-level success boolean.
Successful response
{
"success": true,
"query": "polish search",
"pagination": {
"page": 1,
"total": 5,
"total_pages": 1,
"max_reached": false
},
"results": [
{
"url": "https://webatlasindex.pl/example-page",
"title": "WebAtlas Index — Polish
independent website index",
"description": "Search results from the
WebAtlas Index for quality, ad-free content.",
"language": "pl",
"publish_date": "2026-06-01",
"indexed_at": "2026-06-10
12:00:00"
}
]
}
Fields
| pagination.total | Total matching results across all pages, capped at 20. |
| pagination.total_pages | Number of pages available, 20 results per page. |
| pagination.max_reached | True when the 20-result cap was hit — refine your query for more precision rather than paging further. |
| results[].url | Canonical URL of the indexed page. |
| results[].title | Page title as indexed. |
| results[].description | Extracted page description or summary. |
| results[].language | Detected 2-letter language code. |
| results[].publish_date | Publish date if detected, otherwise null. |
| results[].indexed_at | Timestamp when WebAtlas last indexed the page. |
Error response
{
"success": false,
"error": {
"code": 401,
"message": "Invalid or missing API
key."
}
}
Errors
The HTTP status code always matches error.code in the response body.
q parameter, or query exceeds 200
characters.GET.Plans & quotas
Every API key belongs to exactly one plan. Quota resets on the 1st of each month.
| Plan | Price | Monthly quota | Rate limit |
|---|---|---|---|
| Starter | $2/mo | 1,000 requests | 30 req/min |
| Growth | $18/mo | 10,000 requests | 50 req/min |
| Business | $80/mo | 50,000 requests | 90 req/min |
| Agency | $150/mo | 100,000 requests | 300 req/min |
Manage your subscription, view usage, and regenerate keys anytime from the Dashboard.
Rate limits
Rate limits are enforced per minute, per API key, on top of your monthly quota. Exceeding either
returns 429 with a message identifying which limit was hit.
- Per-minute limit resets every minute — back off and retry after a few seconds.
- Monthly quota resets on the 1st — upgrade your plan from the dashboard if you're consistently hitting it.
- Results are cached for performance. Identical queries (same
q,lang,date,safe,page) are served from our cache in accordance with our Usage License (12–48h refresh cycle) and Privacy Policy, reducing latency without impacting your quota.