Utiliser les fichiers webatla

Chaque fichier est au format JSON Lines compressé en zstd, avec un domaine par ligne. Voici comment l’ouvrir, l’interroger et le charger dans votre stack. Chaque recette a été exécutée sur l’aperçu gratuit de 10 000 lignes, et le résultat affiché est celui qu’elle a produit.

Format
JSON Lines, compressé en zstd
.jsonl.zst
Une ligne par
Domaine, chaque clé toujours présente
les valeurs peuvent être null
Nom du fichier
Dataset et date d’export
all-data-2026-10-16.jsonl.zst
Fraîcheur
Un nouvel export chaque jour
mêmes colonnes chaque jour

1 · Ce que vous téléchargez

Ce que vous téléchargez

Chaque dataset webatla est au format JSON Lines : un domaine par ligne, un objet JSON par ligne. Les fichiers payants sont compressés en zstd.

FichierContenuFormat
Dataset completToutes les lignes du dataset.jsonl.zst
TrancheToutes les lignes d’un TLD, d’un suffixe de TLD, d’un pays (selon l’IP) ou d’une technologie, avec les mêmes champs que le fichier complet.jsonl.zst
Aperçu gratuit (10 000 lignes)Les 10 000 premières lignes du fichier complet.jsonl brut, non compressé
Aperçu de 20 lignes sur les pages de TLD, de pays et de technologieDes lignes du TLD, du pays ou de la technologie concernés, avec les mêmes noms de champs que le fichier payant. Il montre certaines des lignes les plus complètes, pas des lignes au hasard.sur la page

Téléchargez une tranche plutôt que de filtrer le fichier complet

Si vous n’avez besoin que d’une zone, d’un pays ou d’une technologie, sa tranche est déjà filtrée et bien plus petite.

L’aperçu gratuit montre le format, pas un mélange typique

La plupart des fichiers sont triés par suffixe de TLD, donc les 10 000 premières lignes ne couvrent que quelques suffixes du début de l’alphabet, et .com n’en fait pas partie. Un filtre qui ne renvoie rien sur l’aperçu peut renvoyer des millions de lignes sur le fichier complet. Utilisez l’aperçu pour construire et tester vos commandes. Elles s’exécutent à l’identique sur le fichier payant.

2 · Ouvrir le fichier

Regarder à l’intérieur sans décompresser

Tous les outils présentés ici lisent le fichier compressé en flux. La seule différence entre l’aperçu et le fichier payant est la façon de l’ouvrir.

Avant de commencer : choisissez un outil

sudo apt install zstd jq        # Debian, Ubuntu
brew install zstd jq duckdb     # macOS
pip install duckdb zstandard    # Python, any OS

Sous Windows, utilisez WSL.

La même commande sur l’aperçu et sur le fichier payant

# free preview (plain JSONL): give the file to jq directly
jq -c 'select(."Country by IP" == "BG") | {Domain, "TLD suffix", "IP address"}' \
  webatla-all-data-preview-10k.jsonl

# paid file or slice (.jsonl.zst): decompress on the fly into the same jq
zstd -dc all-data-2026-10-16.jsonl.zst \
  | jq -c 'select(."Country by IP" == "BG") | {Domain, "TLD suffix", "IP address"}'
Résultat réel sur l’aperçu gratuit de 10 000 lignes
{"Domain":"360.0.bg","TLD suffix":"0.bg","IP address":"31.13.236.27"}
{"Domain":"doktoranti5.0.bg","TLD suffix":"0.bg","IP address":"185.80.2.212"}
{"Domain":"edu5.0.bg","TLD suffix":"0.bg","IP address":"79.98.104.12"}
...

zstdcat lit les deux types de fichier, donc un seul pipeline fonctionne pour l’aperçu et pour le fichier payant : zstdcat FILE | ...

DuckDB

brew install duckdbwinget install DuckDB.cli

SELECT Domain, TLD, "Country by IP", "HTTP status"
FROM read_json('all-data-2026-10-16.jsonl.zst',
  columns = {Domain: 'VARCHAR', TLD: 'VARCHAR',
             "Country by IP": 'VARCHAR', "HTTP status": 'INTEGER'})
LIMIT 3;
Résultat réel sur l’aperçu gratuit de 10 000 lignes
Domain       TLD  Country by IP  HTTP status
360.0.bg     bg   BG             200
digsys.0.bg  bg   NULL           200
dnssec.0.bg  bg   NULL           0

zstdcat + jq

brew install zstd jqapt install zstd jq

zstdcat dns-2026-10-16.jsonl.zst | head -n 1 | jq .
Résultat réel sur l’aperçu gratuit de 10 000 lignes
{
  "Domain": "360.0.bg",
  "TLD suffix": "0.bg",
  "TLD": "bg",
  "Domain type": "ICANN",
  ...

Python

pip install zstandard

import io, json, zstandard
with open("dns-2026-10-16.jsonl.zst", "rb") as fh:
    stream = zstandard.ZstdDecompressor().stream_reader(fh, read_across_frames=True)
    for line in io.TextIOWrapper(stream, encoding="utf-8"):
        row = json.loads(line)
        mx = (row["DNS records"] or {}).get("MX") or []
        if any((m.get("host") or "").lower().endswith(".google.com") for m in mx):
            print(row["Domain"])
Résultat réel sur l’aperçu gratuit de 10 000 lignes
edu5.0.bg
shopping.9guacu.br
ffe.a.se
...

Compter les lignes et lister les champs

brew install zstd jqapt install zstd jq

zstd -dc all-data-2026-10-16.jsonl.zst | wc -l
zstd -dc all-data-2026-10-16.jsonl.zst | head -n 1 | jq -r 'keys_unsorted[]'
Résultat réel sur l’aperçu gratuit de 10 000 lignes
10000
Domain
TLD suffix
TLD
Domain type
HTTP status
...

Créer votre propre échantillon aléatoire

L’aperçu gratuit n’est pas aléatoire. Pour obtenir un échantillon représentatif à partir d’un fichier que vous avez téléchargé :

Linux: shufmacOS: gshuf (brew install coreutils)

zstd -dc all-data-2026-10-16.jsonl.zst | shuf -n 1000 > random-1000.jsonl
wc -l < random-1000.jsonl
Résultat réel sur l’aperçu gratuit de 10 000 lignes
1000

3 · Répondre aux questions

Les questions auxquelles répond le fichier quotidien

D’abord la réponse, la requête DuckDB à un clic. Ouvrez un terminal dans le dossier de votre téléchargement, tapez duckdb et collez la requête.

Ventes Technologies

Quelles boutiques WooCommerce sont hébergées en Allemagne ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes
ariana.acDE
fjak.acDE
empower.abudhabiDE

Classées par PR value, enregistrées dans woocommerce-de.csv avec 12 lignes. Un CSV que votre CRM ou votre tableur sait ouvrir.

Afficher la requête
COPY (SELECT Domain, "PR value" FROM read_json('technologies-2026-10-16.jsonl.zst',
    columns = {Domain: 'VARCHAR', "Country by IP": 'VARCHAR',
               Technologies: 'JSON', "PR value": 'DOUBLE'})
  WHERE "Country by IP" = 'DE' AND list_contains(CASE json_type(Technologies)
    WHEN 'OBJECT' THEN json_keys(Technologies)
    WHEN 'ARRAY' THEN from_json(Technologies, '["VARCHAR"]') END, 'WooCommerce')
  ORDER BY "PR value" DESC
) TO 'woocommerce-de.csv';
Dataset Technologies →
Marketing produit Technologies

Quel outil de création de sites propulse le plus de sites web ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes
WordPress628 · 80,6 %
Wix52 · 6,7 %
Squarespace45 · 5,8 %
Drupal22 · 2,8 %
Webflow20 · 2,6 %
Joomla12 · 1,5 %

Part parmi ces six outils, pas parmi tous les sites web. Exécutez la requête sur la tranche d’un pays pour comparer un seul marché.

Afficher la requête
SELECT tech, count(*) AS sites,
       round(100 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM (SELECT unnest(CASE json_type(Technologies)
        WHEN 'OBJECT' THEN json_keys(Technologies)
        WHEN 'ARRAY' THEN from_json(Technologies, '["VARCHAR"]') END) AS tech
      FROM read_json('technologies-2026-10-16.jsonl.zst', columns = {Technologies: 'JSON'}))
WHERE tech IN ('WordPress', 'Wix', 'Squarespace', 'Webflow', 'Drupal', 'Joomla')
GROUP BY tech ORDER BY sites DESC;
Dataset Technologies →
Protection de marque RDAP & WHOIS

Quels nouveaux domaines contiennent le nom de votre marque ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes, exécuté le 16 oct. 2026
kayorashop.store2026-10-11
moonovaactivewearshop.com2026-10-10
shopcastava.com2026-10-01

Enregistrés au cours des 30 derniers jours, avec le registrar. Remplacez shop par le nom de votre marque.

Afficher la requête
SELECT "Domain creation date"[:10] AS created, Domain, Registrar
FROM read_json('rdap-whois-2026-10-16.jsonl.zst', columns = {Domain: 'VARCHAR',
  "Domain creation date": 'VARCHAR', Registrar: 'VARCHAR'})
WHERE Domain LIKE '%shop%'
  AND "Domain creation date" >= CAST(current_date - 30 AS VARCHAR)
ORDER BY created DESC;
Dataset RDAP & WHOIS →
Investissement en domaines Websites + Ranking

Quels sites web classés expirent dans les 30 prochains jours ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes, exécuté le 16 oct. 2026
adamcadre.ac2026-10-24
ama.ab.ca2026-10-31
psychologistsassociation.ab.ca2026-11-09

Triés par PR value. De nombreux registres renouvellent automatiquement, alors voyez-y une liste de surveillance, pas une liste de domaines qui vont se libérer.

Afficher la requête
SELECT Domain, "Domain expiration date"[:10] AS expires
FROM read_json('websites-ranking-2026-10-16.jsonl.zst', columns = {Domain: 'VARCHAR',
  "Domain expiration date": 'VARCHAR', "PR value": 'DOUBLE'})
WHERE "Domain expiration date"
  BETWEEN CAST(current_date AS VARCHAR) AND CAST(current_date + 30 AS VARCHAR)
ORDER BY "PR value" DESC LIMIT 3;
Dataset Websites + Ranking →
E-mail & infrastructure DNS

Qui gère le DNS de ces domaines ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes
cloudflare.com2 277 · 25,1 %
registrar-servers.com704 · 7,7 %
domaincontrol.com622 · 6,8 %

Part des domaines avec un enregistrement NS exploitable, regroupée selon les deux derniers segments du nom d’hôte.

Afficher la requête
CREATE OR REPLACE MACRO provider(h) AS
  array_to_string(string_split(lower(rtrim(h, '.')), '.')[-2:], '.');
SELECT provider(json_extract_string("DNS records", '$.NS[0]')) AS dns,
  count(*) AS domains, round(100 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM read_json('dns-2026-10-16.jsonl.zst', columns = {"DNS records": 'JSON'})
WHERE dns <> '' GROUP BY dns ORDER BY domains DESC, dns LIMIT 3;
Dataset DNS →
Ventes All data

Quelles entreprises utilisent Google Workspace pour leurs e-mails ?

Résultat réel sur l’aperçu gratuit de 10 000 lignes
edu5.0.bgGoogle
shopping.9guacu.brGoogle
ffe.a.seGoogle

456 domaines dans l’aperçu gratuit, lus à partir de leurs enregistrements MX. Pour Microsoft 365, testez plutôt .mail.protection.outlook.com.

Afficher la requête
zstd -dc all-data-2026-10-16.jsonl.zst | jq -r '
  select(any(."DNS records".MX[]?.host;
             ascii_downcase | test("(^|\\.)(google|googlemail)\\.com$")))
  | .Domain' > google-workspace.txt
Dataset All data →

4 · Créer une liste

Créer une liste à partir du fichier complet ou d’une tranche

Le fichier complet ne tient pas dans un tableur, alors filtrez-le d’abord, ou partez d’une tranche : une technologie, un TLD, un suffixe de TLD ou un pays en fichier à part, depuis sa page webatla ou l’API. Avec un accès à Technologies ou à All data, chaque page de technologie propose un bloc de téléchargement pour sa tranche.

À partir du fichier complet

Un TLD ou un suffixe

jq

Le TLD est le dernier segment du nom de domaine. Le suffixe de TLD est le suffixe public exact.

# every domain under one TLD (de covers every suffix that ends in .de)
zstd -dc all-data-2026-10-16.jsonl.zst | jq -c 'select(.TLD == "de")' > de.jsonl

# exactly one suffix
zstd -dc all-data-2026-10-16.jsonl.zst | jq -c 'select(."TLD suffix" == "2ix.de")' > 2ix.de.jsonl

# a suffix that equals its TLD (com, de, ac) has no file of its own:
# filter the TLD slice instead
zstd -dc webatla-all-data-ac-2026-10-16.jsonl.zst | jq -c 'select(."TLD suffix" == "ac")' > ac.jsonl
Résultat réel sur l’aperçu gratuit de 10 000 lignes
de.jsonl      224 lines
2ix.de.jsonl   52 lines
ac.jsonl     5463 lines

Les sites web hébergés dans un pays, rapidement

grep + jq

Un site web est une ligne avec une adresse IP, et son pays est celui où le serveur est hébergé (un code ISO en majuscules). grep écarte les lignes qui ne peuvent pas correspondre, puis jq vérifie le reste avec exactitude.

zstd -dc all-data-2026-10-16.jsonl.zst \
  | grep -F '"Country by IP":"DE"' \
  | jq -c 'select(."IP address" != null and ."Country by IP" == "DE")' > de-websites.jsonl
Résultat réel sur l’aperçu gratuit de 10 000 lignes
de-websites.jsonl: 595 lines, the same as jq alone

Exporter en CSV pour Excel ou Google Sheets

jq

Excel n’affiche que 1 048 576 lignes au maximum, alors filtrez d’abord. Importez le CSV en UTF-8 (Data, From Text/CSV) pour que les noms non latins s’affichent correctement.

zstd -dc all-data-2026-10-16.jsonl.zst | jq -nr '
  ["Domain","TLD suffix","HTTP status","Technologies"],
  (inputs | [.Domain, ."TLD suffix", ."HTTP status",
             (.Technologies | if . then tojson else null end)])
  | @csv' > all-data.csv
Résultat réel sur l’aperçu gratuit de 10 000 lignes
"Domain","TLD suffix","HTTP status","Technologies"
"360.0.bg","0.bg",200,"{""HTTP/2"":{""version"":null},...}"
...  10,001 lines

À partir d’une tranche

Ventes

Prospects dans un seul marché

La tranche WooCommerce, puis on garde un seul pays.

COPY (
  SELECT Domain AS Website, "Country by IP" AS Country
  FROM read_json('webatla-technologies-WooCommerce-2026-10-16.jsonl.zst',
    columns = {'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'PR value': 'DOUBLE'})
  WHERE "Country by IP" = 'DE'
  ORDER BY "PR value" DESC
) TO 'woocommerce-germany.csv';
Résultat réel sur l’aperçu gratuit de 10 000 lignes
Website,Country
ariana.ac,DE
fjak.ac,DE
empower.abudhabi,DE
Agences

Liste d’upsell : sites HubSpot qui utilisent aussi WordPress

La tranche HubSpot, puis on garde les stacks qui incluent WordPress.

COPY (
  SELECT Domain AS Website, "Country by IP" AS Country
  FROM read_json('webatla-technologies-HubSpot-2026-10-16.jsonl.zst', columns = {
    'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'Technologies': 'JSON'})
  WHERE list_contains(CASE json_type(Technologies) WHEN 'OBJECT' THEN json_keys(Technologies)
    ELSE json_extract_string(Technologies, '$[*]') END, 'WordPress')
) TO 'hubspot-on-wordpress.csv';
Résultat réel sur l’aperçu gratuit de 10 000 lignes
Website,Country
ateliercrescendo.ac,US
Opérations commerciales

Un fichier par territoire

Découpez une tranche en un CSV par pays de serveur.

COPY (
  SELECT Domain AS Website, coalesce("Country by IP", 'unknown') AS Country
  FROM read_json('webatla-technologies-WooCommerce-2026-10-16.jsonl.zst',
    columns = {'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR'})
) TO 'woocommerce-by-country'
  (FORMAT csv, PARTITION_BY (Country), WRITE_PARTITION_COLUMNS true, OVERWRITE);
Résultat réel sur l’aperçu gratuit de 10 000 lignes
woocommerce-by-country/Country=DE/data_0.csv
woocommerce-by-country/Country=US/data_0.csv
...
Cela tient-il dans un tableur ?Une feuille Excel contient 1 048 576 lignes
Sites HubSpot 375 063 Tient dans une feuille
Sites WordPress 23 798 524 À filtrer ou à découper
All data, le fichier complet 420 933 308 Trop volumineux pour n’importe quel tableur

5 · Le charger

Postgres, Parquet ou une jointure avec votre propre liste

PostgreSQL

psql

Chaque ligne devient un enregistrement jsonb, avec un index GIN sur Technologies.

psql -c 'CREATE TABLE domains (doc jsonb)'
zstdcat technologies-2026-10-16.jsonl.zst \
  | psql -c "\copy domains FROM STDIN WITH (FORMAT csv, QUOTE e'\x01', DELIMITER e'\x02')"
psql -c "CREATE INDEX ON domains USING gin ((doc->'Technologies'))"
psql -c "SELECT doc->>'Country by IP' AS country, count(*) AS sites FROM domains
         WHERE doc->'Technologies' ? 'WordPress' GROUP BY 1 ORDER BY 2 DESC, 1 LIMIT 5"
Résultat réel sur l’aperçu gratuit de 10 000 lignes
COPY 10000
 country | sites
---------+-------
 US      |   300
 DE      |   110
 CA      |    29

Parquet

DuckDB

Des colonnes typées, avec Technologies sous forme de liste de noms. Se charge dans BigQuery, Snowflake, Spark ou pandas.

CREATE OR REPLACE MACRO techs(t) AS CASE json_type(t) WHEN 'OBJECT'
  THEN json_keys(t) WHEN 'ARRAY' THEN t->>'$[*]' ELSE []::VARCHAR[] END;
COPY (SELECT "Domain" AS domain, "Country by IP" AS country,
             "PR value" AS pr_value, techs("Technologies") AS technologies
      FROM read_json('technologies-2026-10-16.jsonl.zst', columns = {
        'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR',
        'PR value': 'DOUBLE', 'Technologies': 'JSON'}))
TO 'technologies.parquet' (FORMAT parquet);
Résultat réel sur l’aperçu gratuit de 10 000 lignes
technologies.parquet: 10000 rows
domain · country · pr_value · technologies (list of names)

Enrichissez votre propre liste

DuckDB

Votre CSV d’un côté, l’export de l’autre, mis en correspondance sur Domain.

SELECT c.domain, w."Country by IP" AS country, w."Registrar" AS registrar,
       w."HTTP status" AS http, w."Domain creation date"[:10] AS created
FROM read_csv('my-domains.csv') c
LEFT JOIN read_json('all-data-2026-10-16.jsonl.zst', columns = {
    'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'Registrar': 'VARCHAR',
    'HTTP status': 'INTEGER', 'Domain creation date': 'VARCHAR'}) w
  ON w."Domain" = lower(trim(c.domain))
ORDER BY 1;
Résultat réel sur l’aperçu gratuit de 10 000 lignes
domain              country  registrar                    http  created
Tamm.AbuDhabi       AE       ADSIC Registry Operator      200   2018-07-09
easy.ac             US       MarkMonitor Inc.             200   2014-02-27
global.abb          US       CSC Corporate Domains, Inc.  301   2019-10-03

6 · Mises à jour quotidiennes

Voir ce qui a changé pendant la nuit

Un nouvel export arrive chaque jour. Comparez deux jours sur Domain et n’envoyez en aval que les changements. Inversez les deux fichiers pour lister les domaines qui ont disparu.

COPY (
  SELECT "Domain" FROM read_json('all-active-domains-2026-10-16.jsonl.zst',
                                 columns = {'Domain': 'VARCHAR'})
  EXCEPT
  SELECT "Domain" FROM read_json('all-active-domains-2026-10-15.jsonl.zst',
                                 columns = {'Domain': 'VARCHAR'})
) TO 'new-since-yesterday.csv' (HEADER false);

7 · Pièges courants

Les pièges classiques

Les noms de champs contiennent des espaces

Mettez-les entre guillemets, en SQL comme en jq.

jq: ."TLD suffix"SQL: "TLD suffix" = 'com.sa'

DNS Status est du texte

Il contient le texte "TRUE" ou "FALSE", pas un booléen, alors comparez-le comme une chaîne de caractères.

select(."DNS Status" == "TRUE")

Technologies existe sous plusieurs formes

Un objet qui associe des noms à des versions (ou à des objets contenant une version), une liste de noms, ou null. Lisez les clés d’un objet et les éléments d’une liste, et vous obtenez une seule liste dans les deux cas.

jq: (.Technologies // []) | if type == "object" then keys else . end

Ne décompressez jamais un fichier complet sur le disque

Le fichier All data complet fait environ 34 Go une fois compressé et plusieurs centaines de Go une fois décompressé. Lisez-le en flux, comme le fait chaque recette ici.

Vérifiez les premières lignes

Dans DuckDB, un nom de colonne mal orthographié renvoie NULL, et non une erreur.

8 · Dépannage

Quand quelque chose ne va pas

SymptômeCause et solution
zstd: … unsupported format sur l’aperçu gratuitL’aperçu est du JSONL brut, non compressé. Donnez-le directement à jq, ou utilisez zstdcat, qui lit les deux.
Python renvoie beaucoup moins de lignes que zstd -dc FILE | wc -lLe fichier contient de nombreuses trames zstd et a été lu avec un appel qui s’arrête après la première. Utilisez stream_reader avec read_across_frames=True, comme dans la recette Python.
Erreur jq (syntax error) sur .TLD suffixMettez entre guillemets les noms qui contiennent des espaces : ."TLD suffix"
Le SQL renvoie 0 ligne sans erreur'Country by IP' entre guillemets simples est une chaîne, pas une colonne. Utilisez des guillemets doubles pour les noms de colonnes.
DuckDB s’arrête en cours de route avec Expected OBJECT, but got ARRAYLa détection automatique du schéma n’examine que les premières lignes. Déclarez les colonnes, avec les champs imbriqués en JSON.
Mon téléchargement est-il complet ?zstd -tq FILE && echo OK affiche OK lorsque le fichier se décompresse entièrement.

Chaque recette fonctionne sur le fichier quotidien complet

Un accès mensuel ou annuel, un export frais chaque jour et une API pour les tranches. Chaque compte peut aussi télécharger un aperçu gratuit de 10 000 lignes de chaque dataset.