The same answer, as JSON
Every page on this site is a view of this API. Same data, same evidence, same limits. Start free without an account and without an e-mail address.
Limits
Twenty lookups a day per client, no key, no account. Cached repeats, the statistics endpoints, the catalogue and history reads are free on top of that and do not count. A refused, failed or robots blocked lookup does not count either.
Free tier
Twenty lookups a day per client, no key, no account. Cached repeats, the statistics endpoints, the catalogue and history reads are free on top of that and do not count. A refused, failed or robots blocked lookup does not count either.
GET /api/site/{domain}
One public domain in, the full categorised report with per finding evidence out, plus the change log we already hold.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/site/{domain} {"ok":true,"domain":"example.sk","final_url":"https://www.example.sk/","fetched_at":"…","cached":false, "categories":[{"id":"cms","findings":[{"slug":"wordpress","version":"6.6","confidence":"certain", "evidence":[{"type":"meta","key":"generator","value":"WordPress 6.6"}]}]}], "hygiene":{"passed":9,"total":13},"changes":[],"quota":{"scope":"free","remaining":19}}GET /api/site/{domain}?stream=1
The same lookup as Server Sent Events, so the page fills in stage by stage instead of showing a spinner.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/site/{domain}?stream=1 event: cached / dns / tls / http / fingerprints / hygiene / doneGET /api/site/{domain}/history
Every change we recorded for one domain. History starts the day we first measured it; we never backfill.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/site/{domain}/history {"ok":true,"domain":"example.sk","first_seen":"…","observations":14,"changes":[…]}GET /api/changes
Recent technology changes across the whole survey panel. Query: tld, category, slug, since, limit.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/changes {"ok":true,"since":"…","n":38,"items":[{"domain":"example.sk","ts":"…","category":"cms","kind":"switched"}]}GET /api/stats/{tld}
Aggregate usage for .sk or .cz across every category. ETag and Cache-Control public, max-age 3600.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/stats/{tld} {"ok":true,"tld":"sk","as_of":"…","panel":{…},"categories":[{"id":"cms","items":[{"slug":"wordpress", "usage_pct":38.4,"share_pct":56.3,"n":28497,"se_pct":0.18,"change_30d_pp":0.4,"series":[…]}]}]}GET /api/stats/{tld}/{category}
One category in full, with the long tail, the weekly series for 52 weeks and the method line.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/stats/{tld}/{category} {"ok":true,"tld":"sk","category":"cms","items":[…],"method":"usage_pct = detected / successfully scanned"}GET /api/compare
Two technologies side by side, with the .sk versus .cz split and the switch counts in both directions.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/compare {"ok":true,"a":{…},"b":{…},"split":{"rows":[{"key":"sk"},{"key":"cz"}]},"switches_12m":{"a_to_b":14,"b_to_a":31}}GET /api/technologies
The catalogue: every category we report, every technology we can name, and the signal types behind it.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/technologies {"ok":true,"generated":"…","categories":[{"id":"cms","label":"Content management","label_sk":"Redakčný systém"}]}GET /api/key
What this key is and what is left on it. Header X-API-Key required. The only account like surface there is.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/key {"ok":true,"pack":"10k","quota_total":10000,"quota_used":1487,"quota_left":8513,"rate":{"per_minute":100}}GET /api/health
Liveness and provenance: database size, queue depth, pinned ruleset, ASN table date, last survey run.
curl https://homelab.tailbf8f27.ts.net/sitetech/api/health {"ok":true,"version":"1.0.0","db":{…},"ruleset":{"name":"webappanalyzer","pinned":"…"},"survey":{…}}
Errors
Always the same shape: ok false, a stable code and an English sentence. The code is what you branch on; the sentence is what you show a human.
| Code | HTTP | What happened |
|---|---|---|
| invalid_domain | 400 | Not a valid registrable domain under the Public Suffix List. |
| not_public | 403 | An IP literal, localhost, .local, .internal, .onion or a private address. We check public sites only. |
| blocked_by_robots | 403 | robots.txt disallows StacklogBot. We obey it and we do not charge for the refusal. |
| opted_out | 403 | The owner asked us to stop measuring this domain. |
| unreachable | 404 | DNS or the connection failed. The message says which. |
| tls_error | 404 | The certificate could not be validated. We report it instead of ignoring it. |
| timeout | 408 | The 8 second budget ran out. You get the partial result, not an empty page. |
| rate_limited | 429 | Too fast. retry_after says how long to wait. Does not consume quota. |
| quota_exhausted | 429 | The free 20 a day or the pack balance is spent. |
| invalid_key | 401 | Unknown API key. Rate limited like any other client, so keys cannot be guessed at speed. |
| busy | 503 | The queue is full. Retry-After is set. Better than a slow death. |
Limits
- Without a key
- 20 lookups a day, at most one every 3 seconds.
- With a key
- 3 requests a second, 100 a minute, plus the pack balance.
- Per target
- One fetch of any given domain per 60 seconds across all clients. Everyone else gets the cached result.
- Per lookup
- 3 s connect, 5 s read, an 8 s hard budget, 512 KB of HTML, 3 redirects, GET only.
- Flood guard
- 50 API requests a second and 1000 a minute per client, cached reads included. It is there so one client cannot flood the server; it consumes nothing.
Packs
Paid once. Credits are valid 24 months and the balance is visible at any time through GET /api/key. No subscription, no auto renewal, no card kept on file.
- 1,000 requestsEffective 2.90 EUR per hundred requests.29 €one off, without VAT
- 10,000 requestsEffective 1.49 EUR per hundred requests.149 €one off, without VAT
The packs open when the service goes live. Until then the free tier is the whole product, and there is nothing to pay for.
Unused credits come back in full within 14 days of purchase, on a one line e-mail, no reason needed. Credits already spent are not refunded, because the work was done.
Prices are without VAT. VAT is added at checkout according to the country of the buyer, through Stripe Tax under the OSS rules, and the invoice comes from Stripe.
The honest comparison
W3Techs publishes its API pricing on its own page. Read it there, with the date, and compare it with ours yourself. We will not quote a competitor from memory, and we make no claim about the quality of their data.