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.

Read the free tierTerms for the data and the API

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 / done
  • GET /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.

CodeHTTPWhat happened
invalid_domain400Not a valid registrable domain under the Public Suffix List.
not_public403An IP literal, localhost, .local, .internal, .onion or a private address. We check public sites only.
blocked_by_robots403robots.txt disallows StacklogBot. We obey it and we do not charge for the refusal.
opted_out403The owner asked us to stop measuring this domain.
unreachable404DNS or the connection failed. The message says which.
tls_error404The certificate could not be validated. We report it instead of ignoring it.
timeout408The 8 second budget ran out. You get the partial result, not an empty page.
rate_limited429Too fast. retry_after says how long to wait. Does not consume quota.
quota_exhausted429The free 20 a day or the pack balance is spent.
invalid_key401Unknown API key. Rate limited like any other client, so keys cannot be guessed at speed.
busy503The 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.

W3Techs API pricing

Check a siteStatisticsComparisons