Geolocation
The Geolocation dataset is Synthient's IP geolocation database, rebuilt every day and published as one snapshot per UTC day. Each snapshot comes as three files with the same contents: an MMDB database for in-process lookups, a Parquet file, and a gzip-compressed CSV.
What a snapshot contains
A snapshot covers every routed IPv4 and IPv6 network with its location, network ownership, carrier, company, abuse contact, registration, privacy flags, and risk signals. All three files of a day come from the same build, so you can pick the format that suits the job.
| Format | File | Use it for |
|---|---|---|
parquet | Parquet | Warehouses and analytical engines. This is the default when you do not pass format. |
csv | CSV, gzip-compressed (.csv.gz) | Bulk loads into a database. The first row is a header with the column names. |
mmdb | MaxMind DB | Looking up single addresses from your own process with any MMDB reader library. |
Geolocation is export-only. There is no real-time stream, there are no hourly snapshots, and there is no lite variant. The dataset is served over HTTP; the gRPC export RPCs cover the stream feeds only.
Publishing schedule
A day's snapshot is published shortly after that day begins at 00:00 UTC, normally within half an hour. Until then a request for that date answers 404, and latest keeps resolving to the previous day.
A day can be published again when a later build of it replaces the first one. The files, sizes, and checksums of that date then change. Compare the checksum from the metadata endpoint, or send the ETag back as If-None-Match, to find out whether the copy you hold is still current.
Authentication
All endpoints require your API key in the x-api-key header and are served from https://api.synthient.com under /api/v4. The dataset is gated by the GEOLOCATION_FEED scope. Requests count against the same rate limits as the other export endpoints, and a download counts as one export.
curl -G https://api.synthient.com/api/v4/feeds/geolocation/export \
-H "x-api-key: $SYNTHIENT_API_KEY"
Columns
The Parquet file and the CSV carry the same columns, in the same order. The schema of the metadata endpoint lists every column of a given day with its type, so read it instead of hard-coding types.
| Group | Columns |
|---|---|
| Network | network |
| Location | city, region, region_code, country, country_code, continent, continent_code, latitude, longitude, timezone, postal_code, geoname_id, radius, city_estimate_registry |
| Autonomous system | asn, as_name, as_domain, as_type |
| Mobile carrier | carrier_name, mcc, mnc |
| Change markers | as_changed, geo_changed |
| Flags | is_anonymous, is_anycast, is_hosting, is_mobile, is_satellite, is_proxy, is_relay, is_tor, is_vpn |
| Privacy and usage | privacy_service, user_type, connection_type |
| Operator | isp, company_name, company_domain, company_inferred_from |
| Abuse contact | abuse_name, abuse_email, abuse_address, abuse_country, abuse_phone, abuse_network |
| Registration | registered_network_name, registered_network_block, registered_network_source, assignment |
| Risk | risk |
Most columns are strings. latitude and longitude are doubles, geoname_id and radius are 32-bit integers, as_changed and geo_changed are dates, and the nine is_* flags are booleans.
A few details to plan for when you parse the files:
networkis a CIDR block such as203.0.113.0/24. Accept a bare address as a single-address network.asncan carry anASprefix (AS64500). Strip it before you parse the number.country_codeandcontinent_codeare two-letter codes.region_codeis the subdivision part of an ISO 3166-2 code, socountry_codeplus-plusregion_codegives the full code.- In the CSV, the
is_*flags are written astrueorfalse. - A value that is not known is an empty field in the CSV. This includes the autonomous system columns on networks with no origin AS.
as_typeanduser_typeare open sets of lowercase labels, such ashosting,cdn, andhome_ispforas_typeorresidential,business,hosting, andcellularforuser_type. Keep values you do not recognize.
The MMDB file
The mmdb file is a MaxMind DB with the database type Synthient-Enterprise. It holds both IPv4 and IPv6 networks and opens with any MMDB reader. Look up an address to get the record of the network that contains it.
Look up an address
mmdblookup --file geolocation.mmdb --ip 203.0.113.7
List snapshots
Returns one page of available daily snapshots, newest-first. Pages are capped at 500 rows; pass next_cursor from the response back as cursor to fetch the next page.
Query parameters
- Name
limit- Type
- integer
- Description
Page size. Defaults to
100. Values above500are clamped.
- Name
cursor- Type
- string
- Description
Opaque pagination token returned in
next_cursorof the previous response. Omit on the first page.
- Name
day- Type
- string
- Description
Only list the snapshot for this UTC date, as
YYYY-MM-DD.
Response
- Name
stream- Type
- string
- Description
Always
geolocation.
- Name
feeds- Type
- array<object>
- Description
Page of snapshots, newest-first.
- Name
feeds[].kind- Type
- string
- Description
Always
daily.
- Name
feeds[].date- Type
- string
- Description
UTC
YYYY-MM-DDthe snapshot is for.
- Name
feeds[].size_bytes- Type
- integer
- Description
Size of the Parquet file in bytes. The sizes of the other files are in
formats.
- Name
feeds[].row_count- Type
- integer
- Description
Number of networks in the snapshot.
- Name
feeds[].checksum- Type
- string
- Description
Hex-encoded SHA-256 of the Parquet file bytes.
- Name
feeds[].id- Type
- string
- Description
Identifier to pass back to
/export/{id}: the snapshot'sYYYY-MM-DDdate.
- Name
feeds[].created_at- Type
- integer
- Description
Unix timestamp in seconds when the snapshot was indexed server-side.
- Name
feeds[].download_path- Type
- string
- Description
Relative API path to follow for the 307 download redirect. Add
?format=to it for a file other than Parquet.
- Name
feeds[].formats- Type
- array<object>
- Description
Every file of the snapshot, Parquet first.
- Name
feeds[].formats[].format- Type
- string
- Description
parquet,csv, ormmdb. Pass it back asformaton the download and metadata endpoints.
- Name
feeds[].formats[].size_bytes- Type
- integer
- Description
Size of that file in bytes. For
csv, the size of the compressed.csv.gz.
- Name
feeds[].formats[].checksum- Type
- string
- Description
Hex-encoded SHA-256 of that file as downloaded. For
csv, of the compressed.csv.gz.
- Name
next_cursor- Type
- string
- Description
Pagination token. Absent on the final page.
Request
curl -G https://api.synthient.com/api/v4/feeds/geolocation/export \
-H "x-api-key: $SYNTHIENT_API_KEY" \
--url-query "limit=1"
Response
{
"stream": "geolocation",
"feeds": [
{
"kind": "daily",
"date": "2026-11-14",
"size_bytes": 1128440217,
"row_count": 25304112,
"checksum": "8c1f0a4e6b2d49735e8a9c0b1d2f3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b",
"id": "2026-11-14",
"created_at": 1794701112,
"download_path": "/api/v4/feeds/geolocation/export/2026-11-14",
"formats": [
{
"format": "parquet",
"size_bytes": 1128440217,
"checksum": "8c1f0a4e6b2d49735e8a9c0b1d2f3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b"
},
{
"format": "csv",
"size_bytes": 913205774,
"checksum": "2e7d5c4b3a291807f6e5d4c3b2a1908f7e6d5c4b3a2918070f1e2d3c4b5a6978"
},
{
"format": "mmdb",
"size_bytes": 1604118392,
"checksum": "b4a3928170f6e5d4c3b2a1900f1e2d3c4b5a69788796a5b4c3d2e1f00112233a"
}
]
}
],
"next_cursor": "eyJkIjoiMjAyNi0xMS0xNCIsImgiOjk5fQ.Q2xhM0VtUGxlU2lnbmF0dXJl"
}
Download a snapshot
Returns a 307 redirect to a presigned R2 URL that is valid for 24 hours. The URL is minted per request and expires, so intermediaries must not cache it. Follow the redirect to download the file, and choose the file with format.
Path parameters
- Name
date- Type
- string
- Description
A
YYYY-MM-DDUTC date, or the literal stringlatestfor the newest published day.
Query parameters
- Name
format- Type
- string
- Description
parquet(the default),csv, ormmdb. Thecsvfile is gzip-compressed.
Conditional requests
The response carries an ETag (the SHA-256 of the file you asked for, in quotes) and a Last-Modified header. Send the ETag back as If-None-Match to get an empty 304 while that file is unchanged. A 304 is not counted as an export.
Responses
| Code | Meaning |
|---|---|
307 | Redirect to a 24-hour presigned download URL. |
304 | The file matches your If-None-Match or If-Modified-Since header. No redirect is issued. |
400 | Bad date format, or a format that is not parquet, csv, mmdb, or tar.gz. |
401 | Missing or invalid API key. |
403 | API key lacks the GEOLOCATION_FEED scope. |
404 | No snapshot is published for that date yet, or it has no file in the requested format. |
Request
# Follow the 307 with -L and write to a file
curl -L -o geolocation.mmdb \
"https://api.synthient.com/api/v4/feeds/geolocation/export/latest?format=mmdb" \
-H "x-api-key: $SYNTHIENT_API_KEY"
Response
{
"type": "https://docs.synthient.com/errors/bad-request",
"title": "Bad request",
"status": 400,
"detail": "unknown format; expected parquet, csv, mmdb or tar.gz",
"instance": "4f1c2a9e7b3d4e5f8a6b9c0d1e2f3a4b"
}
Snapshot metadata
Returns JSON metadata for one day: the SHA-256 checksum and byte size of the file you ask for, the row count, the column schema, and every file of the day. It returns no file body.
Path parameters
- Name
date- Type
- string
- Description
A
YYYY-MM-DDUTC date, orlatestfor the newest published day.
Query parameters
- Name
format- Type
- string
- Description
parquet(the default),csv, ormmdb. Selects the file thatformat,size, andchecksumdescribe.
Response
- Name
stream- Type
- string
- Description
Always
geolocation.
- Name
kind- Type
- string
- Description
Always
"daily".
- Name
id- Type
- string
- Description
The snapshot's
YYYY-MM-DDdate, orlatestwhen you asked forlatest.
- Name
format- Type
- string
- Description
The file described by
sizeandchecksum: theformatyou requested, or"parquet".
- Name
date- Type
- integer
- Description
Unix timestamp in seconds for midnight UTC of the snapshot's day.
- Name
created_at- Type
- integer
- Description
Unix timestamp in seconds when the snapshot was indexed server-side.
- Name
size- Type
- integer
- Description
Size in bytes of the file named by
format.
- Name
rows- Type
- integer
- Description
Number of networks in the snapshot. The same for every format.
- Name
checksum- Type
- string
- Description
Hex-encoded SHA-256 of the file named by
format, as downloaded.
- Name
schema.fields- Type
- array<object>
- Description
One entry per column of the Parquet file, in file order. The CSV header lists the same names.
- Name
schema.fields[].name- Type
- string
- Description
Column name.
- Name
schema.fields[].type- Type
- string
- Description
Column type:
string,int32,int64,float,double,bool,date,timestamp,bytes, orlist<...>of one of these.
- Name
formats- Type
- array<object>
- Description
Every file of the day as
format,size_bytes, andchecksum, Parquet first.
Request
curl -G https://api.synthient.com/api/v4/feeds/geolocation/export/2026-11-14/meta \
-H "x-api-key: $SYNTHIENT_API_KEY" \
--url-query "format=mmdb"
Response
{
"checksum": "b4a3928170f6e5d4c3b2a1900f1e2d3c4b5a69788796a5b4c3d2e1f00112233a",
"date": 1794614400,
"format": "mmdb",
"size": 1604118392,
"rows": 25304112,
"schema": {
"fields": [
{ "name": "network", "type": "string" },
{ "name": "city", "type": "string" },
{ "name": "region", "type": "string" },
{ "name": "region_code", "type": "string" },
{ "name": "country", "type": "string" },
{ "name": "country_code", "type": "string" }
]
},
"stream": "geolocation",
"kind": "daily",
"id": "2026-11-14",
"created_at": 1794701112,
"formats": [
{
"format": "parquet",
"size_bytes": 1128440217,
"checksum": "8c1f0a4e6b2d49735e8a9c0b1d2f3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b"
},
{
"format": "csv",
"size_bytes": 913205774,
"checksum": "2e7d5c4b3a291807f6e5d4c3b2a1908f7e6d5c4b3a2918070f1e2d3c4b5a6978"
},
{
"format": "mmdb",
"size_bytes": 1604118392,
"checksum": "b4a3928170f6e5d4c3b2a1900f1e2d3c4b5a69788796a5b4c3d2e1f00112233a"
}
]
}
Keeping a local MMDB current
Fetch the metadata once a day, download only when the checksum changes, and verify the file before you swap it in. Use a fixed date for both requests so the metadata and the download describe the same snapshot.
Daily refresh
BASE=https://api.synthient.com/api/v4/feeds/geolocation/export
# 1. Resolve the newest day and its MMDB checksum
META=$(curl -sG "$BASE/latest/meta" \
-H "x-api-key: $SYNTHIENT_API_KEY" --url-query "format=mmdb")
DAY=$(echo "$META" | jq -r '.date | strftime("%Y-%m-%d")')
SUM=$(echo "$META" | jq -r '.checksum')
# 2. Download that day and verify it
curl -sL -o geolocation.mmdb.new "$BASE/$DAY?format=mmdb" \
-H "x-api-key: $SYNTHIENT_API_KEY"
echo "$SUM geolocation.mmdb.new" | sha256sum --check
# 3. Replace the live file in one step
mv geolocation.mmdb.new geolocation.mmdb
Response codes
Downloads answer with a 307 redirect: follow the Location header to a 24-hour presigned URL. Every other status follows the shared contract. See Errors for the full reference and retry guidance.