API

Read the same data programmatically. Anonymous use is rate-limited per IP. A free API key raises the limits.

Quick start

Domains with an invalid SPF record that appeared in the last 24 hours. Leave out the key header to try it anonymously.

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains?q=spf:invalid%20added:%3C24h&limit=50"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains?q=spf:invalid%20added:%3C24h&limit=50"Get a free key

Machine-readable: OpenAPI schema (JSON) for code generators, Postman or Insomnia.

Limits

Counted per IP or per key. Responses carry X-RateLimit-* headers; 429 includes Retry-After.

AnonymousFree key
Requests per minute560
Requests per day1005'000
Results per page25200
Cursor pagingnoyes

Expensive calls count more: /domains/count, /domains/{name}/related, /stats/overview and /insights/* count as 2, /facets as 5. Clients that keep exceeding the limit are blocked for an hour.

Endpoints

All under /api/v1, JSON, GET. Open one for an example request, its response, the parameters and every response field.

GET /domains Search domains

One page of domains matching q. Follow next_cursor for more (cursor paging needs an API key).

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains?q=spf:invalid%20added:%3C24h&limit=25"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains?q=spf:invalid%20added:%3C24h&limit=25"Open in browser

Example response SearchPage

{
  "items": [
    {
      "domain": "xn--brgli-kva.ch",
      "domain_unicode": "bürgli.ch",
      "first_seen": "2026-10-08T06:00:00",
      "status": "active",
      "removed_at": null,
      "dnssec": 1,
      "mx_provider": "infomaniak",
      "mx_hosted_by": "",
      "ns_hosted_by": "",
      "ns_provider": "hostpoint",
      "spf": "valid",
      "dmarc": "reject",
      "ipv6": 0,
      "web_country": "CH",
      "n_issues": 2,
      "checked_at": "2026-10-10T09:24:14",
      "exact": false
    }
  ],
  "next_cursor": "2026-10-08 06:00:00|garage.ch",
  "sort": "new"
}
{ "items": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch", "first_seen": "2026-10-08T06:00:00", "status": "active", "removed_at": null, "dnssec": 1, "mx_provider": "infomaniak", "mx_hosted_by": "", "ns_hosted_by": "", "ns_provider": "hostpoint", "spf": "valid", "dmarc": "reject", "ipv6": 0, "web_country": "CH", "n_issues": 2, "checked_at": "2026-10-10T09:24:14", "exact": false } ], "next_cursor": "2026-10-08 06:00:00|garage.ch", "sort": "new" }

Parameters

NameTypeDefaultDescription
qstringSearch query in the same language as the search field, e.g. spf:invalid provider:cyon garage. Empty = all active domains.
limitinteger25Page size. Capped at 25 anonymous, 100 web, 200 with an API key.
cursorstringnext_cursor of the previous page (API key required).
sortstringautorelevance (exact and prefix matches first), new (newest in the zone first), az (by name), checked (most recently analysed by the DNS harvester first; not yet analysed last); auto = relevance if q contains a name, else new.
Response fields (SearchPage, DomainHit)

SearchPage

itemsDomainHit[]Matching domains, one page
next_cursorstringPass as cursor for the next page; empty on the last page (cursor paging needs an API key)
sort"relevance" | "new" | "az" | "checked"Sort order actually used (auto resolves to relevance or new)

DomainHit

domainstringDomain name in ASCII (punycode for IDNs)
domain_unicodestringDomain name in Unicode
first_seendatetimeFirst seen in the zone (UTC). 1970-01-02 means: present before tracking started
status"active" | "removed"Whether the domain is currently in the zone
removed_atdatetime| nullWhen it left the zone (UTC), null while active
dnssecinteger1 if the registry has a DS record for it (DNSSEC signed), else 0
mx_providerstringMail provider derived from the MX records; 'none' without MX, '' before the first DNS check
mx_hosted_bystringFor self-named mail servers (a host under the domain's own name, e.g. mail.<domain>): who actually runs them, '' if unknown
ns_hosted_bystringFor self-named name servers (hosts under the domain's own name, e.g. ns1., ns., dns.<domain>): who runs them, from their addresses in the zone file; '' if unknown
ns_providerstringDNS provider derived from the name servers
spfstringSPF status: valid, none, permissive (+all), multiple, invalid_syntax, too_many_lookups; '' if not analysed
dmarcstringDMARC status: none, monitor (p=none), quarantine, reject, invalid, multiple; '' if not analysed
ipv6integer1 if the domain (or www) has an AAAA record, else 0
web_countrystringCountry of the first web server address (ISO code), '' if unknown
n_issuesintegerNumber of findings (see /issues)
checked_atdatetime| nullLast DNS check (UTC), null if not analysed yet
exactbooleanTrue when this is the exact domain searched for (relevance sort only)
GET /domains/count Count matches

Number of domains matching q. Counts as 2 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains/count?q=provider:cyon%20dmarc:none"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains/count?q=provider:cyon%20dmarc:none"Open in browser

Example response Count

{
  "count": 189891
}
{ "count": 189891 }

Parameters

NameTypeDefaultDescription
qstringSearch query in the same language as the search field, e.g. spf:invalid provider:cyon garage. Empty = all active domains.
Response fields (Count)

Count

countintegerNumber of matching domains
GET /facets Counts per filter value

For each filter, the most frequent values among the domains matching q (that filter itself ignored). Keys: provider, spf, dmarc, ns, issue, tag, spfinclude, rua, caa, dnssecstate, delegation, hostedby, nshostedby, dnssec, ipv6. dnssec and ipv6 hold one entry, value "true". Counts as 5 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/facets?q=treuhand"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/facets?q=treuhand"Open in browser

Example response { [key]: ValueCount[] }

{
  "key": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ]
}
{ "key": [ { "value": "hostpoint", "count": 430049 } ] }

Parameters

NameTypeDefaultDescription
qstringSearch query in the same language as the search field, e.g. spf:invalid provider:cyon garage. Empty = all active domains.
Response fields (ValueCount)

ValueCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value
GET /domains/{name} Domain details

Zone data, DNS records, analysis and the last 100 record changes of one domain. 404 if never in the zone.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains/garage.ch"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/domains/garage.ch"Open in browser

Example response DomainDetail

{
  "domain": "garage.ch",
  "domain_unicode": "garage.ch",
  "first_seen": "1970-01-02T00:00:00",
  "status": "active",
  "removed_at": null,
  "zone_ns": [
    "ns1.hostpoint.ch",
    "ns2.hostpoint.ch"
  ],
  "dnssec": 1,
  "a": [
    "217.26.48.101"
  ],
  "aaaa": [],
  "ns": [
    "ns1.hostpoint.ch",
    "ns2.hostpoint.ch"
  ],
  "mx": [
    {
      "prio": 10,
      "host": "mx1.mail.hostpoint.ch"
    }
  ],
  "txt": [
    "v=spf1 include:spf.protection.outlook.com -all"
  ],
  "caa": [
    "0 issue \"letsencrypt.org\""
  ],
  "dmarc_txt": [
    "v=DMARC1; p=reject; rua=mailto:dmarc@example.ch"
  ],
  "mx_provider": "hostpoint",
  "ns_provider": "hostpoint",
  "spf_status": "valid",
  "dmarc_status": "reject",
  "txt_tags": [
    "google",
    "microsoft-365"
  ],
  "issues": [
    "dmarc_no_rua"
  ],
  "dnssec_state": "ok",
  "nsec_mode": "nsec3",
  "nsec3_iterations": 0,
  "caa_issuers": [
    "letsencrypt.org"
  ],
  "soa_rname": "hostmaster.hostpoint.ch",
  "soa_mname": "ns1.hostpoint.ch",
  "soa_serial": 2026100901,
  "soa_expire": 1209600,
  "spf_includes": [
    "spf.protection.outlook.com"
  ],
  "dmarc_rua": [
    "example.ch"
  ],
  "www_state": "a",
  "dkim_selectors": [
    "selector1"
  ],
  "mx_hosted_by": "",
  "mx_hosted_source": "",
  "ns_hosted_by": "",
  "ns_ips": [
    "111.90.159.157"
  ],
  "bimi": [
    "v=BIMI1; l=https://example.ch/logo.svg"
  ],
  "mta_sts": [
    "v=STSv1; id=20261001"
  ],
  "tls_rpt": [
    "v=TLSRPTv1; rua=mailto:tls@example.ch"
  ],
  "lookup_state": "",
  "lookup_detail": "94.126.19.210:53 returned REFUSED for example.ch SOA",
  "lookup_since": null,
  "checked_at": "2026-10-10T09:24:14",
  "delegation": "ok",
  "history": [
    {
      "changed_at": "2026-10-09T14:02:11",
      "rrtype": "MX",
      "old": [
        "10 mx1.example.net"
      ],
      "new": [
        "10 mx1.mail.hostpoint.ch"
      ]
    }
  ]
}
{ "domain": "garage.ch", "domain_unicode": "garage.ch", "first_seen": "1970-01-02T00:00:00", "status": "active", "removed_at": null, "zone_ns": [ "ns1.hostpoint.ch", "ns2.hostpoint.ch" ], "dnssec": 1, "a": [ "217.26.48.101" ], "aaaa": [], "ns": [ "ns1.hostpoint.ch", "ns2.hostpoint.ch" ], "mx": [ { "prio": 10, "host": "mx1.mail.hostpoint.ch" } ], "txt": [ "v=spf1 include:spf.protection.outlook.com -all" ], "caa": [ "0 issue \"letsencrypt.org\"" ], "dmarc_txt": [ "v=DMARC1; p=reject; rua=mailto:dmarc@example.ch" ], "mx_provider": "hostpoint", "ns_provider": "hostpoint", "spf_status": "valid", "dmarc_status": "reject", "txt_tags": [ "google", "microsoft-365" ], "issues": [ "dmarc_no_rua" ], "dnssec_state": "ok", "nsec_mode": "nsec3", "nsec3_iterations": 0, "caa_issuers": [ "letsencrypt.org" ], "soa_rname": "hostmaster.hostpoint.ch", "soa_mname": "ns1.hostpoint.ch", "soa_serial": 2026100901, "soa_expire": 1209600, "spf_includes": [ "spf.protection.outlook.com" ], "dmarc_rua": [ "example.ch" ], "www_state": "a", "dkim_selectors": [ "selector1" ], "mx_hosted_by": "", "mx_hosted_source": "", "ns_hosted_by": "", "ns_ips": [ "111.90.159.157" ], "bimi": [ "v=BIMI1; l=https://example.ch/logo.svg" ], "mta_sts": [ "v=STSv1; id=20261001" ], "tls_rpt": [ "v=TLSRPTv1; rua=mailto:tls@example.ch" ], "lookup_state": "", "lookup_detail": "94.126.19.210:53 returned REFUSED for example.ch SOA", "lookup_since": null, "checked_at": "2026-10-10T09:24:14", "delegation": "ok", "history": [ { "changed_at": "2026-10-09T14:02:11", "rrtype": "MX", "old": [ "10 mx1.example.net" ], "new": [ "10 mx1.mail.hostpoint.ch" ] } ] }

Parameters

NameTypeDefaultDescription
name*(path)stringDomain name, ASCII (punycode) form, e.g. garage.ch
Response fields (DomainDetail, MxRecord, HistoryEntry)

DomainDetail

domainstringDomain name in ASCII
domain_unicodestringDomain name in Unicode
first_seendatetimeFirst seen in the zone (UTC); 1970-01-02 = before tracking started
status"active" | "removed"Whether the domain is currently in the zone
removed_atdatetime| nullWhen it left the zone (UTC), null while active
zone_nsstring[]Name servers listed by the registry (delegation)
dnssecinteger1 if the registry has a DS record, else 0
astring[]IPv4 addresses of the domain
aaaastring[]IPv6 addresses of the domain
nsstring[]Name servers the domain itself publishes
mxMxRecord[]MX records
txtstring[]TXT records
caastring[]CAA records
dmarc_txtstring[]TXT records at _dmarc.<domain>
mx_providerstringMail provider derived from MX ('none' without MX, '' if not analysed)
ns_providerstringDNS provider derived from the name servers
spf_statusstringSPF status (see DomainHit.spf)
dmarc_statusstringDMARC status (see DomainHit.dmarc)
txt_tagsstring[]Services recognised from TXT verification records
issuesstring[]Finding codes; /issues has a description of each
dnssec_statestringDNSSEC state: ok, none (unsigned), ds_mismatch, ds_no_dnskey, dnskey_no_ds; '' if not analysed
nsec_modestringAuthenticated denial: nsec, nsec3 or ''
nsec3_iterationsintegerNSEC3 hash iterations, -1 if not applicable
caa_issuersstring[]Certificate authorities allowed by CAA
soa_rnamestringSOA contact mailbox (as a name)
soa_mnamestringSOA primary name server
soa_serialintegerSOA serial
soa_expireintegerSOA expire (seconds)
spf_includesstring[]Domains included by SPF (who may send mail)
dmarc_ruastring[]Domains receiving DMARC aggregate reports
www_statestringwww.<domain>: a (has an address), cname, none; '' if not analysed
dkim_selectorsstring[]DKIM selectors found
mx_hosted_bystringFor self-named mail servers: who runs them
mx_hosted_sourcestringHow mx_hosted_by was derived: mx-ip (address of the MX host, exact), spf-ip, spf-a, spf (SPF include, a hint); '' if unknown
ns_hosted_bystringFor self-named name servers (hosts under the domain's own name, e.g. ns1., ns., dns.<domain>): who runs them, from the network of their glue addresses
ns_ipsstring[]Glue addresses of self-named name servers, from the zone file
bimistring[]TXT at default._bimi.<domain> (BIMI)
mta_stsstring[]TXT at _mta-sts.<domain> (MTA-STS)
tls_rptstring[]TXT at _smtp._tls.<domain> (TLS-RPT)
lookup_statestring'' = resolved; public = only public resolvers (1.1.1.1, 8.8.8.8) answered; otherwise why the domain cannot be resolved, also not through public resolvers: lame, not_loaded, dnssec, unreachable, nxdomain, other. The records shown are then those of the last successful resolution, if any
lookup_detailstringFor a domain that cannot be resolved: the public resolver's explanation (Extended DNS Error)
lookup_sincedatetime| nullFor a domain that cannot be resolved: since when (UTC)
checked_atdatetime| nullLast DNS check (UTC), null if not analysed yet
delegationstring| nullRegistry vs. zone name servers: ok, differs, disjoint, parent_extra, child_extra, child_no_ns. Only present once analysed
historyHistoryEntry[]Last 100 record changes, newest first

MxRecord

priointegerMX preference (lower is preferred)
hoststringMail server host name

HistoryEntry

changed_atdatetimeWhen the change was observed (UTC)
rrtypestringRecord type that changed (A, AAAA, NS, MX, TXT, CAA, ...)
oldstring[]Previous values
newstring[]New values
GET /changes Added or removed domains

Domains that entered or left the zone within a time window, newest first. Page with offset.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes?kind=removed&since=3d&limit=50&offset=100"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes?kind=removed&since=3d&limit=50&offset=100"Open in browser

Example response ChangeList

{
  "kind": "added",
  "since_hours": 24,
  "total": 812,
  "items": [
    {
      "domain": "neue-firma.ch",
      "ts": "2026-10-10T06:00:00"
    }
  ]
}
{ "kind": "added", "since_hours": 24, "total": 812, "items": [ { "domain": "neue-firma.ch", "ts": "2026-10-10T06:00:00" } ] }

Parameters

NameTypeDefaultDescription
kindstringaddedadded or removed
sincestring24hTime window: hours or days, e.g. 12h, 3d (max 9999).
limitinteger200Maximum number of items
offsetinteger0Skip this many items (paging)
Response fields (ChangeList, ChangeItem)

ChangeList

kind"added" | "removed"Requested kind
since_hoursintegerTime window in hours
totalintegerAll changes of this kind in the window (items may be fewer)
itemsChangeItem[]Newest first, up to limit, after skipping offset

ChangeItem

domainstringDomain name in ASCII
tsdatetimeSnapshot in which the change was seen (UTC)
GET /changes/providers Added and removed domains per DNS provider

Which DNS providers (name servers in the zone delegation) gained and lost the most domains within a time window.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/providers?since=30d&top=10"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/providers?since=30d&top=10"Open in browser

Example response ProviderChanges

{
  "since_hours": 168,
  "added": 3100,
  "removed": 2900,
  "top_added": [
    {
      "provider": "hostpoint",
      "added": 120,
      "removed": 95
    }
  ],
  "top_removed": [
    {
      "provider": "hostpoint",
      "added": 120,
      "removed": 95
    }
  ],
  "net": [
    {
      "provider": "hostpoint",
      "added": 120,
      "removed": 95
    }
  ]
}
{ "since_hours": 168, "added": 3100, "removed": 2900, "top_added": [ { "provider": "hostpoint", "added": 120, "removed": 95 } ], "top_removed": [ { "provider": "hostpoint", "added": 120, "removed": 95 } ], "net": [ { "provider": "hostpoint", "added": 120, "removed": 95 } ] }

Parameters

NameTypeDefaultDescription
sincestring7dTime window: hours or days, e.g. 24h, 30d (max 9999).
topinteger15Providers per list
Response fields (ProviderChanges, ProviderChange)

ProviderChanges

since_hoursintegerTime window in hours
addedintegerAll added domains in the window
removedintegerAll removed domains in the window
top_addedProviderChange[]Providers with the most added domains
top_removedProviderChange[]Providers with the most removed domains
netProviderChange[]Providers with the largest net change (added minus removed, either way)

ProviderChange

providerstringDNS provider (as in ns_provider)
addedintegerDomains with this provider that entered the zone
removedintegerDomains with this provider that left the zone
GET /changes/summary Change totals

Added and removed domains in the last 12 hours, 24 hours, 3, 7, 30 and 90 days. The zone is imported once a day.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/summary"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/summary"Open in browser

Example response ChangeSummary

{
  "added_12h": 310,
  "added_24h": 812,
  "added_3d": 2304,
  "added_7d": 5120,
  "added_30d": 21900,
  "added_90d": 64000,
  "removed_12h": 280,
  "removed_24h": 701,
  "removed_3d": 2010,
  "removed_7d": 4630,
  "removed_30d": 19800,
  "removed_90d": 58800
}
{ "added_12h": 310, "added_24h": 812, "added_3d": 2304, "added_7d": 5120, "added_30d": 21900, "added_90d": 64000, "removed_12h": 280, "removed_24h": 701, "removed_3d": 2010, "removed_7d": 4630, "removed_30d": 19800, "removed_90d": 58800 }
Response fields (ChangeSummary)

ChangeSummary

added_12hintegerDomains added in the last 12 hours
added_24hinteger... 24 hours
added_3dinteger... 3 days
added_7dinteger... 7 days
added_30dinteger... 30 days
added_90dinteger... 90 days
removed_12hintegerDomains removed in the last 12 hours
removed_24hinteger... 24 hours
removed_3dinteger... 3 days
removed_7dinteger... 7 days
removed_30dinteger... 30 days
removed_90dinteger... 90 days
GET /changes/daily Changes per day

Added and removed domains per day (UTC), oldest first. Days without changes are omitted.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/daily?days=7"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/changes/daily?days=7"Open in browser

Example response DailyChange[]

[
  {
    "day": "2026-10-09",
    "added": 790,
    "removed": 655
  }
]
[ { "day": "2026-10-09", "added": 790, "removed": 655 } ]

Parameters

NameTypeDefaultDescription
daysinteger30Number of days back
Response fields (DailyChange)

DailyChange

daydateDay (UTC)
addedintegerDomains added that day
removedintegerDomains removed that day
GET /stats/overview Zone statistics

Totals and provider, SPF, DMARC and finding distributions. Lists except ns_provider cover analysed domains only. Counts as 2 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/stats/overview"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/stats/overview"Open in browser

Example response Overview

{
  "active_domains": 2639107,
  "resolved_domains": 2633,
  "mail_domains": 1938,
  "dnssec_domains": 1409721,
  "ipv6_domains": 1032,
  "distinct_mx_providers": 185,
  "distinct_ns_providers": 18064,
  "ns_provider": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "mx_provider": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "spf": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "dmarc": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "issues": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "tags": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "spf_includes": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "dmarc_rua": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "caa_issuers": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "dnssec_state": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "delegation": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "mail_hosted_by": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "mail_hosted_source": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "self_named": [
    444,
    310
  ],
  "ns_hosted_by": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "ns_self_named": [
    4287,
    4100
  ],
  "unresolvable_domains": 148000,
  "lookup_state": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ]
}
{ "active_domains": 2639107, "resolved_domains": 2633, "mail_domains": 1938, "dnssec_domains": 1409721, "ipv6_domains": 1032, "distinct_mx_providers": 185, "distinct_ns_providers": 18064, "ns_provider": [ { "value": "hostpoint", "count": 430049 } ], "mx_provider": [ { "value": "hostpoint", "count": 430049 } ], "spf": [ { "value": "hostpoint", "count": 430049 } ], "dmarc": [ { "value": "hostpoint", "count": 430049 } ], "issues": [ { "value": "hostpoint", "count": 430049 } ], "tags": [ { "value": "hostpoint", "count": 430049 } ], "spf_includes": [ { "value": "hostpoint", "count": 430049 } ], "dmarc_rua": [ { "value": "hostpoint", "count": 430049 } ], "caa_issuers": [ { "value": "hostpoint", "count": 430049 } ], "dnssec_state": [ { "value": "hostpoint", "count": 430049 } ], "delegation": [ { "value": "hostpoint", "count": 430049 } ], "mail_hosted_by": [ { "value": "hostpoint", "count": 430049 } ], "mail_hosted_source": [ { "value": "hostpoint", "count": 430049 } ], "self_named": [ 444, 310 ], "ns_hosted_by": [ { "value": "hostpoint", "count": 430049 } ], "ns_self_named": [ 4287, 4100 ], "unresolvable_domains": 148000, "lookup_state": [ { "value": "hostpoint", "count": 430049 } ] }
Response fields (Overview, ValueCount)

Overview

active_domainsintegerDomains currently in the zone
resolved_domainsintegerOf those, analysed (DNS resolved) so far
mail_domainsintegerAnalysed domains that receive mail (have MX)
dnssec_domainsintegerDomains with a DS record
ipv6_domainsintegerDomains with IPv6
distinct_mx_providersintegerDistinct mail providers
distinct_ns_providersintegerDistinct DNS providers
ns_providerValueCount[]Top 25 DNS providers (all active domains)
mx_providerValueCount[]Top 25 mail providers (analysed domains, as all lists below)
spfValueCount[]SPF status distribution
dmarcValueCount[]DMARC status distribution
issuesValueCount[]Most frequent findings
tagsValueCount[]Most frequent TXT services
spf_includesValueCount[]Most included SPF domains
dmarc_ruaValueCount[]Most frequent DMARC report receivers
caa_issuersValueCount[]Most allowed certificate authorities
dnssec_stateValueCount[]DNSSEC validation states
delegationValueCount[]Delegation consistency states
mail_hosted_byValueCount[]Who runs self-named mail servers
mail_hosted_sourceValueCount[]How that was derived
self_namedinteger[][domains with a self-named mail server, of which the operator is known]
ns_hosted_byValueCount[]Who runs self-named name servers (all active domains)
ns_self_namedinteger[][domains with self-named name servers, of which the operator is known]
unresolvable_domainsintegerAnalysed domains that cannot be resolved, also not through public resolvers (counted in resolved_domains; left out of the lists above)
lookup_stateValueCount[]Why those domains cannot be resolved: lame, not_loaded, dnssec, unreachable, nxdomain, other

ValueCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value
GET /fields Filter names

Filter names the query language understands (name:value).

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/fields"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/fields"Open in browser

Example response string[]

[
  ""
]
[ "" ]
GET /issues Finding codes

Every finding code (as in issues and issue:) with a human-readable description.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/issues"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/issues"Open in browser

Example response { [key]: string }

{
  "key": ""
}
{ "key": "" }
GET /limits Rate limits

Current limits per access tier (anonymous, web UI, API key).

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/limits"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/limits"Open in browser

Example response Limits

{
  "anon": {
    "per_minute": 5,
    "per_day": 100,
    "max_page_size": 25,
    "cursor_paging": false
  },
  "key": {
    "per_minute": 5,
    "per_day": 100,
    "max_page_size": 25,
    "cursor_paging": false
  },
  "web": {
    "per_minute": 5,
    "per_day": 100,
    "max_page_size": 25,
    "cursor_paging": false
  }
}
{ "anon": { "per_minute": 5, "per_day": 100, "max_page_size": 25, "cursor_paging": false }, "key": { "per_minute": 5, "per_day": 100, "max_page_size": 25, "cursor_paging": false }, "web": { "per_minute": 5, "per_day": 100, "max_page_size": 25, "cursor_paging": false } }
Response fields (Limits, TierLimits)

Limits

anonTierLimitsAnonymous use, per IP address
keyTierLimitsWith a free API key, per key
webTierLimitsThe searchzone.ch website, per visitor IP (one search counts once)

TierLimits

per_minuteintegerRequests per minute
per_dayintegerRequests per day (UTC)
max_page_sizeintegerLargest limit for /domains
cursor_pagingbooleanWhether cursor paging is allowed
GET /insights/zone Zone insights

DNSSEC, name server and naming facts from the delegation data of all active domains. Counts as 2 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/zone"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/zone"Open in browser

Example response ZoneInsights

{
  "total": 2639107,
  "signed": 1409721,
  "ds_algorithms": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "ds_digests": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "ns_count": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "ns_provider_count": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "top_ns_hosts": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "shared_ns_sets": [
    {
      "ns": [
        "ns.hostpoint.ch",
        "ns2.hostpoint.ch",
        "ns3.hostpoint.ch"
      ],
      "count": 416998
    }
  ],
  "names": {
    "idn": 64404,
    "digits_only": 3358,
    "short": 29,
    "with_hyphen": 913398,
    "long": 11551
  }
}
{ "total": 2639107, "signed": 1409721, "ds_algorithms": [ { "value": "hostpoint", "count": 430049 } ], "ds_digests": [ { "value": "hostpoint", "count": 430049 } ], "ns_count": [ { "value": "hostpoint", "count": 430049 } ], "ns_provider_count": [ { "value": "hostpoint", "count": 430049 } ], "top_ns_hosts": [ { "value": "hostpoint", "count": 430049 } ], "shared_ns_sets": [ { "ns": [ "ns.hostpoint.ch", "ns2.hostpoint.ch", "ns3.hostpoint.ch" ], "count": 416998 } ], "names": { "idn": 64404, "digits_only": 3358, "short": 29, "with_hyphen": 913398, "long": 11551 } }
Response fields (ZoneInsights, ValueCount, SharedNsSet, NameStats)

ZoneInsights

totalintegerActive domains
signedintegerWith a DS record
ds_algorithmsValueCount[]DNSSEC algorithm numbers in DS records
ds_digestsValueCount[]DS digest types
ns_countValueCount[]Domains by number of name servers
ns_provider_countValueCount[]Domains by number of distinct DNS providers
top_ns_hostsValueCount[]Most used name server hosts
shared_ns_setsSharedNsSet[]Most used complete name server sets
namesNameStatsNaming patterns

ValueCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value

SharedNsSet

nsstring[]The name server set
countintegerDomains delegated to exactly this set

NameStats

idnintegerInternationalised names (xn--)
digits_onlyintegerNames made of digits only
shortintegerNames of at most 2 characters (+ .ch)
with_hyphenintegerNames containing a hyphen
longintegerNames longer than 30 characters
GET /insights/fun Fun facts about names

Records and oddities among the names of all active domains (longest, accents, palindromes, ...). Counts as 2 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/fun"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/fun"Open in browser

Example response FunFacts

{
  "total": 2639107,
  "median_length": 11,
  "longest": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "shortest": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "most_accents": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "accents_only": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "accent_letters": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "emoji": 0,
  "most_hyphens": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "longest_digits": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "palindromes": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "one_letter": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "doubled": {
    "count": 15,
    "examples": [
      {
        "domain": "xn--brgli-kva.ch",
        "domain_unicode": "bürgli.ch"
      }
    ]
  },
  "switzerland": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "classics": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "three_letters": {
    "taken": 15866,
    "total": 17576,
    "missing": [
      "1989"
    ]
  },
  "years": {
    "taken": 15866,
    "total": 17576,
    "missing": [
      "1989"
    ]
  }
}
{ "total": 2639107, "median_length": 11, "longest": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "shortest": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "most_accents": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "accents_only": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "accent_letters": [ { "value": "hostpoint", "count": 430049 } ], "emoji": 0, "most_hyphens": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "longest_digits": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "palindromes": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "one_letter": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "doubled": { "count": 15, "examples": [ { "domain": "xn--brgli-kva.ch", "domain_unicode": "bürgli.ch" } ] }, "switzerland": [ { "value": "hostpoint", "count": 430049 } ], "classics": [ { "value": "hostpoint", "count": 430049 } ], "three_letters": { "taken": 15866, "total": 17576, "missing": [ "1989" ] }, "years": { "taken": 15866, "total": 17576, "missing": [ "1989" ] } }
Response fields (FunFacts, FunFact, ValueCount, NameGap, FunExample)

FunFacts

totalintegerActive domains
median_lengthintegerMedian name length in characters, without .ch
longestFunFactLongest names (63 characters is the DNS maximum)
shortestFunFactAll names of 2 characters
most_accentsFunFactNames with the most non-ASCII letters; count = all internationalised names
accents_onlyFunFactNames made only of non-ASCII letters, such as äää.ch
accent_lettersValueCount[]How often each non-ASCII letter occurs in names
emojiintegerNames with characters outside the Latin script (the .ch registry does not allow them)
most_hyphensFunFactNames with the most hyphens; count = names with at least 5
longest_digitsFunFactLongest names made of digits only; count = all digits-only names
palindromesFunFactNames longer than 5 characters that read the same backwards
one_letterFunFactNames of one character repeated (at least 3 times), such as aaa.ch
doubledFunFactNames that are one word said twice, such as beobachterbeobachter.ch
switzerlandValueCount[]Names containing the country's name, per language
classicsValueCount[]Names containing Swiss classics (fondue, velo, ...)
three_lettersNameGapThree-letter names a-z in the zone
yearsNameGapYears 1900-2030 as names (1999.ch) in the zone

FunFact

countintegerNumber of active domains with this property
examplesFunExample[]Up to 5 of them, the most extreme first

ValueCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value

NameGap

takenintegerHow many of the candidate names are in the zone
totalintegerNumber of candidate names
missingstring[]Candidates not in the zone (first ones alphabetically); not in the zone does not mean free to register

FunExample

domainstringDomain name in ASCII (punycode for IDNs)
domain_unicodestringDomain name in Unicode
GET /insights/resolved DNS insights

Aggregations over analysed domains: shared addresses, mail x DNS providers, IPv6, hosting. Counts as 2 requests.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/resolved"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/insights/resolved"Open in browser

Example response ResolvedInsights

{
  "resolved": 2633,
  "top_ips": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "top_mx_hosts": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "owner_clusters": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "soa_contacts": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "mail_by_dns": {
    "mail": [
      "hostpoint",
      "google"
    ],
    "dns": [
      "hostpoint",
      "cloudflare"
    ],
    "cells": [
      {
        "mail": "hostpoint",
        "dns": "hostpoint",
        "count": 436
      }
    ]
  },
  "ipv6_by_dns": [
    {
      "provider": "hostpoint",
      "domains": 1200,
      "ipv6": 310
    }
  ],
  "hosting": {
    "enabled": true,
    "asns": [
      {
        "value": "hostpoint",
        "count": 430049,
        "name": "HOSTPOINT-AS"
      }
    ],
    "countries": [
      {
        "value": "hostpoint",
        "count": 430049
      }
    ]
  },
  "dnssec_state": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ],
  "nsec_mode": [
    {
      "value": "hostpoint",
      "count": 430049
    }
  ]
}
{ "resolved": 2633, "top_ips": [ { "value": "hostpoint", "count": 430049 } ], "top_mx_hosts": [ { "value": "hostpoint", "count": 430049 } ], "owner_clusters": [ { "value": "hostpoint", "count": 430049 } ], "soa_contacts": [ { "value": "hostpoint", "count": 430049 } ], "mail_by_dns": { "mail": [ "hostpoint", "google" ], "dns": [ "hostpoint", "cloudflare" ], "cells": [ { "mail": "hostpoint", "dns": "hostpoint", "count": 436 } ] }, "ipv6_by_dns": [ { "provider": "hostpoint", "domains": 1200, "ipv6": 310 } ], "hosting": { "enabled": true, "asns": [ { "value": "hostpoint", "count": 430049, "name": "HOSTPOINT-AS" } ], "countries": [ { "value": "hostpoint", "count": 430049 } ] }, "dnssec_state": [ { "value": "hostpoint", "count": 430049 } ], "nsec_mode": [ { "value": "hostpoint", "count": 430049 } ] }
Response fields (ResolvedInsights, ValueCount, MailByDns, Ipv6ByDns, Hosting, MailDnsCell, AsnCount)

ResolvedInsights

resolvedintegerAnalysed domains (the sample all lists refer to)
top_ipsValueCount[]Most shared web server addresses
top_mx_hostsValueCount[]Most used mail server hosts
owner_clustersValueCount[]Verification tokens shared by several domains (same owner)
soa_contactsValueCount[]Most frequent SOA contacts
mail_by_dnsMailByDnsMail provider x DNS provider matrix
ipv6_by_dnsIpv6ByDns[]IPv6 adoption per DNS provider (at least 5 domains)
hostingHostingWeb hosting networks and countries
dnssec_stateValueCount[]DNSSEC validation states
nsec_modeValueCount[]NSEC vs NSEC3

ValueCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value

MailByDns

mailstring[]Top mail providers (rows)
dnsstring[]Top DNS providers (columns)
cellsMailDnsCell[]Counts per combination (missing = 0)

Ipv6ByDns

providerstringDNS provider
domainsintegerAnalysed domains at this provider
ipv6integerOf those, with IPv6

Hosting

enabledbooleanFalse when no ASN database is configured (lists are then empty)
asnsAsnCount[]Most frequent web hosting networks (AS numbers)
countriesValueCount[]Most frequent web hosting countries

MailDnsCell

mailstringMail provider
dnsstringDNS provider
countintegerDomains with this combination

AsnCount

valuestringThe value (provider, status, issue code, ...)
countintegerNumber of domains with this value
namestringNetwork name of the AS
GET /cache/status Cache status

When the cached statistics (overview, insights, fun facts, trends) were computed and when they are refreshed. They are recomputed in the background every 6 hours and after each daily zone import.

Example request

curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/cache/status"
curl -H "Authorization: Bearer sz_..." "https://searchzone.ch/api/v1/cache/status"Open in browser

Example response { [key]: CacheInfo }

{
  "key": {
    "computed_at": "2026-10-15T09:34:36Z",
    "next_refresh": "2026-10-15T15:24:36Z"
  }
}
{ "key": { "computed_at": "2026-10-15T09:34:36Z", "next_refresh": "2026-10-15T15:24:36Z" } }
Response fields (CacheInfo)

CacheInfo

computed_atdatetime| nullWhen the cached answer was computed (UTC); null while it is not cached yet
next_refreshdatetime| nullWhen it will be recomputed in the background (UTC); also right after each zone import

Query syntax

The same language as the search field on the website (the q parameter). Open a group for its filters.

Domain name
blick.chName contains the text. The exact name and names starting with it come first.
^blickName starts with
blick.ch$Name ends with
^blick.ch$Exactly this name
idn:trueInternationalised names (umlauts)
Combining
treuhand garageSpace = AND: both must match
provider:cyon,hostpointComma inside one filter = OR
spf:invalid OR dmarc:noneThe word OR splits the whole query (AND binds tighter)
-issue:spf_no_allLeading minus excludes
Addresses

Every address filter also takes a range (1.2.3.0/24) or a prefix (1.2.*).

a:217.26.48.1A record (IPv4 address of the domain)
aaaa:2a00:d70::1AAAA record (IPv6 address of the domain)
ip:217.26.48.0/24A or AAAA
mx:217.26.48.1Address of one of the domain's mail servers (collected by newer harvests)
spf:217.26.48.1SPF lists this address directly in ip4:/ip6: (includes are not followed)
asn:13030Website hosted in this network (IPv4)
country:chWebsite hosted in this country (IPv4)
Mail
provider:cyonMail provider, or part of the MX host name (mx: works the same)
provider:self-namedMail server under the domain's own name (mail., mx.<domain>…)
hostedby:hostpointWho runs a self-named mail server (inferred)
spf:invalidFaulty SPF (syntax, several records, >10 lookups, +all); or one status: valid, none, permissive, multiple, too_many_lookups
dmarc:invalidFaulty DMARC (malformed, several records, or the lookup fails); or: none, monitor, quarantine, reject, temperror
spfinclude:google.comSPF authorises this sender (include/redirect)
rua:dmarcian.comDMARC reports go to
dkim:selector1DKIM selector found
TXT records
txt:sendgridTXT contains the text (matches from the start of a word, fast)
txt:"v=spf1 mx"Phrase in quotes
txtraw:endgriAny substring anywhere (slower)
tag:googleVerification or policy record of a service
owner:google:…Same verification token as another domain
DNS and zone
ns:cloudflareName server provider or part of the name
ns:self-namedName servers under the domain's own name (ns1., ns., dns.<domain>…)
nshostedby:hostpointWho runs self-named name servers (from their addresses in the zone file)
dnssec:trueSigned (DS record in the zone)
dsalg:13DNSSEC algorithm
dsdigest:4DS digest type
dnssecstate:ds_mismatchDS does not match DNSKEY (extended profile)
nsec:nsec3Denial of existence
nscount:1Number of name servers (also >3, <2)
redundancy:singleOnly one DNS provider
delegation:disjointRegistry and zone list different name servers
caa:letsencrypt.orgCAA allows this issuer
soarname:hostmaster.example.chSOA contact
www:nonewww: a, cname or none
ipv6:trueHas an AAAA record
Findings and lifecycle
issue:no_spf_but_mailA finding (see the Findings filter for all names)
analysed:trueResolved by a harvester
lookup:brokenCannot be resolved, also not through public resolvers; or a reason: lame, not_loaded, dnssec, unreachable, nxdomain; public: only public resolvers answered
added:<24hEntered the zone (h or d)
removed:<7dLeft the zone
Data: SWITCH open data for .ch, resolved by independent harvesters. Not affiliated with SWITCH. Terms of use · Impressum