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.

FormatFileUse it for
parquetParquetWarehouses and analytical engines. This is the default when you do not pass format.
csvCSV, gzip-compressed (.csv.gz)Bulk loads into a database. The first row is a header with the column names.
mmdbMaxMind DBLooking 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.

GroupColumns
Networknetwork
Locationcity, region, region_code, country, country_code, continent, continent_code, latitude, longitude, timezone, postal_code, geoname_id, radius, city_estimate_registry
Autonomous systemasn, as_name, as_domain, as_type
Mobile carriercarrier_name, mcc, mnc
Change markersas_changed, geo_changed
Flagsis_anonymous, is_anycast, is_hosting, is_mobile, is_satellite, is_proxy, is_relay, is_tor, is_vpn
Privacy and usageprivacy_service, user_type, connection_type
Operatorisp, company_name, company_domain, company_inferred_from
Abuse contactabuse_name, abuse_email, abuse_address, abuse_country, abuse_phone, abuse_network
Registrationregistered_network_name, registered_network_block, registered_network_source, assignment
Riskrisk

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:

  • network is a CIDR block such as 203.0.113.0/24. Accept a bare address as a single-address network.
  • asn can carry an AS prefix (AS64500). Strip it before you parse the number.
  • country_code and continent_code are two-letter codes. region_code is the subdivision part of an ISO 3166-2 code, so country_code plus - plus region_code gives the full code.
  • In the CSV, the is_* flags are written as true or false.
  • 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_type and user_type are open sets of lowercase labels, such as hosting, cdn, and home_isp for as_type or residential, business, hosting, and cellular for user_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

GET/api/v4/feeds/geolocation/export
Open in playground (opens in a new tab)

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 above 500 are clamped.

  • Name
    cursor
    Type
    string
    Description

    Opaque pagination token returned in next_cursor of 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-DD the 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's YYYY-MM-DD date.

  • 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, or mmdb. Pass it back as format on 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

GET/api/v4/feeds/geolocation/export
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"
}

GET/api/v4/feeds/geolocation/export/{date}
Open in playground (opens in a new tab)

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-DD UTC date, or the literal string latest for the newest published day.

Query parameters

  • Name
    format
    Type
    string
    Description

    parquet (the default), csv, or mmdb. The csv file 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

CodeMeaning
307Redirect to a 24-hour presigned download URL.
304The file matches your If-None-Match or If-Modified-Since header. No redirect is issued.
400Bad date format, or a format that is not parquet, csv, mmdb, or tar.gz.
401Missing or invalid API key.
403API key lacks the GEOLOCATION_FEED scope.
404No snapshot is published for that date yet, or it has no file in the requested format.

Request

GET/api/v4/feeds/geolocation/export/{date}
# 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"
}

GET/api/v4/feeds/geolocation/export/{date}/meta
Open in playground (opens in a new tab)

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-DD UTC date, or latest for the newest published day.

Query parameters

  • Name
    format
    Type
    string
    Description

    parquet (the default), csv, or mmdb. Selects the file that format, size, and checksum describe.

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-DD date, or latest when you asked for latest.

  • Name
    format
    Type
    string
    Description

    The file described by size and checksum: the format you 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, or list<...> of one of these.

  • Name
    formats
    Type
    array<object>
    Description

    Every file of the day as format, size_bytes, and checksum, Parquet first.

Request

GET/api/v4/feeds/geolocation/export/{date}/meta
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.