Cómo usar los archivos de webatla

Cada archivo es JSON Lines comprimido con zstd, con un dominio por línea. Aquí verá cómo abrirlo, hacerle preguntas y cargarlo en su stack. Cada receta se ejecutó con la muestra gratuita de 10.000 filas y la salida que ve es la que se imprimió.

Formato
JSON Lines, comprimido con zstd
.jsonl.zst
Una fila por
Dominio, todas las claves siempre presentes
los valores pueden ser null
Nombre del archivo
Dataset y fecha de exportación
all-data-2026-10-16.jsonl.zst
Actualización
Una exportación nueva cada día
las mismas columnas cada día

1 · Qué descarga

Qué descarga

Cada dataset de webatla es JSON Lines: un dominio por línea, un objeto JSON por línea. Los archivos de pago se comprimen con zstd.

ArchivoQué contieneFormato
Dataset completoTodas las filas del dataset.jsonl.zst
CorteTodas las filas de un TLD, un sufijo de TLD, un país (por IP) o una tecnología, con los mismos campos que el archivo completo.jsonl.zst
Muestra gratuita (10.000 filas)Las primeras 10.000 líneas del archivo completo.jsonl texto plano, sin comprimir
Vista previa de 20 filas en las páginas de TLD, país y tecnologíaFilas de ese TLD, país o tecnología, con los mismos nombres de campo que el archivo de pago. Muestra algunas de las filas más completas, no filas aleatorias.en la página

Descargue un corte en lugar de filtrar el archivo completo

Si necesita una zona, un país o una tecnología, su corte ya está filtrado y es muchas veces más pequeño.

La muestra gratuita enseña el formato, no una mezcla típica

La mayoría de los archivos están ordenados por sufijo de TLD, así que las primeras 10.000 líneas cubren solo unos pocos sufijos del principio del alfabeto, y .com no está entre ellos. Un filtro que no devuelve nada en la muestra gratuita puede devolver millones de filas en el archivo completo. Use la muestra gratuita para crear y probar sus comandos. Se ejecutan sin cambios en el archivo de pago.

2 · Abrir el archivo

Mire dentro sin descomprimirlo

Todas estas herramientas leen el archivo comprimido como un flujo. La única diferencia entre la muestra gratuita y el archivo de pago es cómo se abre.

Antes de empezar: elija una herramienta

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

En Windows, use WSL.

El mismo comando con la muestra gratuita y con el archivo de pago

# 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"}'
Salida real con la muestra gratuita de 10.000 filas
{"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 lee ambos tipos de archivo, así que una misma cadena de comandos sirve para la muestra gratuita y para el archivo de pago: 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;
Salida real con la muestra gratuita de 10.000 filas
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 .
Salida real con la muestra gratuita de 10.000 filas
{
  "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"])
Salida real con la muestra gratuita de 10.000 filas
edu5.0.bg
shopping.9guacu.br
ffe.a.se
...

Contar las filas y listar los campos

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[]'
Salida real con la muestra gratuita de 10.000 filas
10000
Domain
TLD suffix
TLD
Domain type
HTTP status
...

Crear su propia muestra aleatoria

La muestra gratuita no es aleatoria. Para obtener una muestra representativa de un archivo que ya ha descargado:

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
Salida real con la muestra gratuita de 10.000 filas
1000

3 · Responder preguntas

Preguntas que responde el archivo diario

Primero la respuesta, con la consulta de DuckDB a un clic. Abra una terminal en la carpeta de su descarga, escriba duckdb y pegue la consulta.

Ventas Technologies

¿Qué tiendas WooCommerce están alojadas en Alemania?

Salida real con la muestra gratuita de 10.000 filas
ariana.acDE
fjak.acDE
empower.abudhabiDE

Ordenadas por PR value y guardadas como woocommerce-de.csv con 12 filas. Un CSV que abre su CRM o su hoja de cálculo.

Mostrar la consulta
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 de producto Technologies

¿Qué creador de sitios web impulsa más sitios?

Salida real con la muestra gratuita de 10.000 filas
WordPress628 · 80,6 %
Wix52 · 6,7 %
Squarespace45 · 5,8 %
Drupal22 · 2,8 %
Webflow20 · 2,6 %
Joomla12 · 1,5 %

Proporción entre estos seis creadores de sitios web, no entre todos los sitios web. Ejecútelo sobre un corte por país para comparar un mercado.

Mostrar la consulta
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 →
Protección de marca RDAP & WHOIS

¿Qué dominios nuevos contienen el nombre de su marca?

Salida real con la muestra gratuita de 10.000 filas, ejecutada el 16 oct 2026
kayorashop.store2026-10-11
moonovaactivewearshop.com2026-10-10
shopcastava.com2026-10-01

Registrados en los últimos 30 días, con el registrador. Cambie shop por el nombre de su marca.

Mostrar la consulta
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 →
Inversión en dominios Websites + Ranking

¿Qué sitios web con ranking caducan en los próximos 30 días?

Salida real con la muestra gratuita de 10.000 filas, ejecutada el 16 oct 2026
adamcadre.ac2026-10-24
ama.ab.ca2026-10-31
psychologistsassociation.ab.ca2026-11-09

Ordenados por PR value. Muchos registros renuevan automáticamente, así que trátelo como una lista de seguimiento y no como una lista de dominios que se liberan.

Mostrar la consulta
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 →
Correo e infraestructura DNS

¿Quién gestiona el DNS de estos dominios?

Salida real con la muestra gratuita de 10.000 filas
cloudflare.com2277 · 25,1 %
registrar-servers.com704 · 7,7 %
domaincontrol.com622 · 6,8 %

Proporción de dominios con un registro NS utilizable, agrupados por las dos últimas etiquetas del nombre de host.

Mostrar la consulta
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 →
Ventas All data

¿Qué empresas usan Google Workspace para el correo?

Salida real con la muestra gratuita de 10.000 filas
edu5.0.bgGoogle
shopping.9guacu.brGoogle
ffe.a.seGoogle

456 dominios en la muestra gratuita, leídos a partir de sus registros MX. Para Microsoft 365, busque en su lugar .mail.protection.outlook.com.

Mostrar la consulta
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 · Crear una lista

Cree una lista a partir del archivo completo o de un corte

El archivo completo no cabe en una hoja de cálculo, así que fíltrelo primero o parta de un corte: una tecnología, un TLD, un sufijo de TLD o un país como archivo propio, desde su página de webatla o desde la API. Con acceso a Technologies o a All data, cada página de tecnología tiene un cuadro de descarga para su corte.

Desde el archivo completo

Un TLD o un sufijo

jq

El TLD es la última etiqueta del dominio. El sufijo de TLD es el sufijo público exacto.

# 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
Salida real con la muestra gratuita de 10.000 filas
de.jsonl      224 lines
2ix.de.jsonl   52 lines
ac.jsonl     5463 lines

Sitios web alojados en un país, rápido

grep + jq

Un sitio web es una fila con una dirección IP, y su país es donde está alojado el servidor (un código ISO en mayúsculas). grep descarta las líneas que no pueden coincidir y después jq comprueba el resto con exactitud.

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
Salida real con la muestra gratuita de 10.000 filas
de-websites.jsonl: 595 lines, the same as jq alone

Exportar a CSV para Excel o Google Sheets

jq

Excel muestra como máximo 1.048.576 filas, así que filtre primero. Importe el CSV como UTF-8 (Data, From Text/CSV) para que los nombres con caracteres no latinos se vean bien.

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
Salida real con la muestra gratuita de 10.000 filas
"Domain","TLD suffix","HTTP status","Technologies"
"360.0.bg","0.bg",200,"{""HTTP/2"":{""version"":null},...}"
...  10,001 lines

Desde un corte

Ventas

Clientes potenciales de un mercado

El corte de WooCommerce y, después, un solo país.

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';
Salida real con la muestra gratuita de 10.000 filas
Website,Country
ariana.ac,DE
fjak.ac,DE
empower.abudhabi,DE
Agencias

Lista de venta adicional: sitios HubSpot que también usan WordPress

El corte de HubSpot y, después, los stacks que incluyen 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';
Salida real con la muestra gratuita de 10.000 filas
Website,Country
ateliercrescendo.ac,US
Operaciones de ventas

Un archivo por territorio

Divida un corte en un CSV por cada país del servidor.

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);
Salida real con la muestra gratuita de 10.000 filas
woocommerce-by-country/Country=DE/data_0.csv
woocommerce-by-country/Country=US/data_0.csv
...
¿Cabrá en una hoja de cálculo?Una hoja de Excel admite 1.048.576 filas
Sitios HubSpot 375.063 Cabe en una hoja
Sitios WordPress 23.798.524 Filtrar o dividir
All data, el archivo completo 420.933.308 Demasiado grande para cualquier hoja de cálculo

5 · Cargarlo

Postgres, Parquet o un cruce con su propia lista

PostgreSQL

psql

Cada línea se convierte en una fila jsonb, con un índice GIN sobre 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"
Salida real con la muestra gratuita de 10.000 filas
COPY 10000
 country | sites
---------+-------
 US      |   300
 DE      |   110
 CA      |    29

Parquet

DuckDB

Columnas tipadas, con Technologies como lista de nombres. Se carga en BigQuery, Snowflake, Spark o 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);
Salida real con la muestra gratuita de 10.000 filas
technologies.parquet: 10000 rows
domain · country · pr_value · technologies (list of names)

Enriquezca su propia lista

DuckDB

Su CSV a un lado, la exportación al otro, cruzados por 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;
Salida real con la muestra gratuita de 10.000 filas
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 · Actualizaciones diarias

Vea qué cambió durante la noche

Cada día llega una exportación nueva. Compare dos días por Domain y envíe solo los cambios a los sistemas posteriores. Intercambie los dos archivos para listar los dominios que desaparecieron.

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 · Errores frecuentes

Cosas que suelen dar problemas

Los nombres de campo tienen espacios

Póngalos entre comillas, tanto en SQL como en jq.

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

DNS Status es texto

Contiene el texto "TRUE" o "FALSE", no un booleano, así que compárelo como cadena de texto.

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

Technologies tiene varias formas

Un mapa de nombres a versiones (o a objetos con una versión), una lista de nombres o null. Lea las claves de un mapa y los elementos de una lista, y obtendrá una lista en ambos casos.

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

No descomprima nunca un archivo completo en el disco

El archivo completo de All data ocupa unos 34 GB comprimido y varios cientos de GB descomprimido. Léalo como un flujo, como hace cada receta de esta página.

Revise las primeras filas

En DuckDB, un nombre de columna mal escrito devuelve NULL, no un error.

8 · Solución de problemas

Cuando algo sale mal

SíntomaCausa y solución
zstd: … unsupported format con la muestra gratuitaLa muestra gratuita es JSONL plano, sin comprimir. Pásela a jq directamente o use zstdcat, que lee ambos tipos.
Python devuelve muchas menos filas que zstd -dc FILE | wc -lEl archivo tiene muchos frames de zstd y se leyó con una llamada que se detiene tras el primero. Use stream_reader con read_across_frames=True, como en la receta de Python.
jq: syntax error con .TLD suffixPonga entre comillas los nombres que contienen espacios: ."TLD suffix"
SQL devuelve 0 filas sin ningún error'Country by IP' entre comillas simples es una cadena de texto, no una columna. Use comillas dobles para los nombres de columna.
DuckDB se detiene a mitad con Expected OBJECT, but got ARRAYLa detección automática del esquema solo mira las primeras filas. Declare las columnas, con los campos anidados como JSON.
¿Mi descarga está completa?zstd -tq FILE && echo OK imprime OK cuando el archivo se descomprime por completo.

Cada receta funciona con el archivo diario completo

Acceso mensual o anual, una exportación nueva cada día y una API para cortes. Cada cuenta puede además descargar una muestra gratuita de 10.000 filas de cada dataset.