Overview
Some workloads cannot call an API for every address. If you are enriching billions of rows in a warehouse, running inside an air-gapped network, or working against a latency budget that leaves no room for a network round trip, a per-request lookup does not fit. For those cases you can license Abstract’s IP data as a database and run lookups locally, from a file you host yourself, with no rate limits and no per-request latency. How the file relates to the API is covered in How the database compares to the API below. Talk to our sales team to get access to the database downloads.Available databases
Three databases are available. You can license them individually or together.
Each database is a standalone file with its own schema. Licensing geolocation does not include ASN or security data.
Delivery formats
Every database ships in two formats. Your license covers the database, so you can take either format, or both. MMDB suits fast lookups by IP address in a running application: the format resolves an address to one network in a single indexed read. CSV suits loading into a warehouse, a relational database, or a data pipeline, and inspecting the data directly. The geolocation CSV is disjoint (one IP, one row). ASN and Security CSVs can still nest; see Overlapping networks.
Each archive contains three files: the database itself, a SHA-256 checksum of it, and a
README.md describing that database.
Builds are reproducible. Two builds from identical inputs are byte-identical, so if you re-download an unchanged build you get the same checksum.
Sizes and record counts
Every build changes these, so treat them as orders of magnitude for capacity planning rather than fixed values. Record counts move with the routing table and the security feeds; sizes follow the counts. The figures below are approximate, as of August 2026. Plan disk and load time against the extracted size, not the archive.
The
.sha256 inside your archive identifies the exact build you received.
Downloading the database
Once your organization is entitled to a database, you request a download link from the API and then fetch the archive from that link.String
required
An API key belonging to the organization that licensed the database. This is the same key you use for your IP Intelligence requests.
String
Which database to download:
ip-geolocation, ip-asn, or ip-security. Defaults to ip-geolocation. Your organization must be entitled to the database you ask for.String
Which delivery format to download:
mmdb or csv. Defaults to mmdb. Your license covers every format of a database you are entitled to, so this parameter is free to change.String
Set to
json to receive the download link in a JSON body instead of being redirected to it. Any other value, or omitting the parameter, returns the redirect.Response
A successful request answers 302 Found with an empty body. TheLocation header carries a temporary link to the archive, so a client that follows redirects downloads the file in one step.
Location is time-limited and is a bearer credential: anyone holding it can download your file until it expires. Do not store it or script against it. Point your tooling at the endpoint above and let it redirect each time, so the link you keep is always ours and never the storage one.
Getting the link as JSON
If you need the expiry rather than the file, addresponse=json and the endpoint answers 200 with a body instead of redirecting:
String
The same time-limited link the redirect would have sent you to. Treat it as a secret.
Integer
How long the link stays valid, in seconds. The maximum is 604800, which is 7 days.
A complete download
One command.-L is required, because the endpoint answers with a redirect and curl does not follow redirects by default:
Response and error codes
Note that a rejected key answers 403 here, while Abstract’s other APIs answer 401.
Verifying your download
These files are large, and a download that is truncated or corrupted in transit will still open and still return answers, just wrong ones for part of the address space. The checksum separates a broken download from a genuine data question, before you spend time debugging the wrong thing. Each archive ships a.sha256 file next to the database. It holds a fingerprint of the exact bytes the build produced. Comparing it against the file you received confirms the two match.
Extract into a directory of its own. Every archive carries a README.md at its root, so extracting two of them into the same folder overwrites one with the other:
Reading the MMDB
The.mmdb files use the standard MMDB binary format with a flat, string-valued record per network. Open one with any MMDB reader library for your language and use the reader’s generic lookup by IP address:
get() returns one record per address, the same answer Abstract’s API would return for that IP. You never see two locations.
Reading the CSV
The CSV carries the same data with one header row and one row per network:Overlapping networks
A more-specific CIDR can sit inside a broader one in the source data. How that shows up in the file you download depends on the database. IP to Geolocation. The CSV is disjoint. An IP matches exactly one row, and that row is the location Abstract’s API would return. You do not pick between nested prefixes. The MMDB reader’sget() returns the same record.
IP to ASN. Nested prefixes can both ship (a covering announcement and a more specific one). The MMDB reader’s get() returns one record. On CSV, keep the row with the longest prefix (/24 beats /16).
IP to Security. Nested CIDRs are valid. A more-specific network already carries the union of enclosing flags. The MMDB reader’s get() returns one record. On CSV, if more than one row covers the IP, keep the most specific.
ASN / Security CSV, Python:
Conventions
These hold across every database and both formats:- All values are strings, including
latitude,longitude, andasn. - A field with no value is absent from the MMDB record and empty in the CSV row. There are no null sentinels, so check for absence rather than comparing against a placeholder.
- In the MMDB, the security flags only ever appear as
"True". A false flag is absent from the record rather than set to"False", so testingrecord.get("is_vpn") == "False"never matches. Test for presence instead. The security CSV is different: every row carries all seven flag columns with an explicit"True"or"False", and a non-empty"False"is truthy in most languages, so compare the value rather than testing the column for emptiness. In the geolocation database,country_is_eulikewise carries a literal"False". - Place names are in English. Localized name variants are not available in this version.
- Private, reserved, and multicast ranges are filtered out at build time. A lookup against one returns nothing rather than a partial answer.
- The geolocation CSV is disjoint. An IP matches one row, the same answer as the API and the MMDB. ASN and Security CSVs can still nest: keep the most specific covering row. See Overlapping networks.
Schema: IP to Geolocation
One record per network block, IPv4 and IPv6. The rows below are in the order the columns appear in the CSV, so you can map them positionally. In the MMDB,network is the key you look up rather than a field inside the record, so a lookup returns up to the other 16 fields.
Country-level fields resolve for effectively every network. Everything finer is optional: not every routed network has a publishable region, city, or postal code. Read every field as optional and fall back to the country when the finer ones are missing.
region_iso_code carries the full ISO 3166-2 code, country prefix included (US-CA), on every row that has one.
Schema: IP to ASN
One record per routed network block, IPv4 and IPv6, built by Abstract from public BGP routing data.Schema: IP to Security
One record per network carrying at least one flag. A network absent from this database carries none of them.
These are the same seven signals the
security object returns in an IP Intelligence response. The two formats encode a false flag differently: the MMDB record holds just the flags that apply, so a network flagged only as hosting returns one key, not seven, while the CSV carries all seven columns on every row with an explicit "True" or "False".
A more-specific network inside a larger flagged range carries the union of its own flags and the enclosing range’s. Nested CIDRs are valid on this database; keep the most specific covering row, which already includes the enclosing flags.
Refresh cadence
Security data moves fastest, so it rebuilds daily. VPN and proxy ranges change from one day to the next, and a security snapshot ages badly.
Geolocation and ASN change more slowly. In practice builds often land sooner, but weekly is the schedule to design against.
How the database compares to the API
The database and the API are built to answer the same question, and for the overwhelming majority of addresses they return the same answer. Three differences are worth knowing before you choose, and they matter most if you plan to join the two. Some of what the API returns is not in the file. Fields IP Intelligence computes at request time are absent:currency, flag, and the local time and DST state inside timezone. You get timezone_name and derive the clock yourself. Three more are absent because they are not part of a geolocation record: the whole company object, the whole domains object, and asn.domain and asn.type. ASN number and organization are available, in the separate IP to ASN database.
Field names differ between the two. If you key anything on field names, map them:
region_iso_code also differs in format, not just in name. The database returns the full ISO 3166-2 code (US-CA), while the API returns the bare subdivision (CA). Strip the prefix before joining on it.
A small share of addresses can differ. The API consults live sources on some requests that a static file cannot reproduce. Where that happens, the database answers from its own build instead. The share is small, and if you need it quantified for your evaluation, ask our sales team for the current figure.
If your workload needs the runtime-derived fields, or you need the freshest possible answer on individual addresses, use the API. If you need volume, local latency, or offline operation, use the database. You can also run both: the database for bulk enrichment, the API on the request path.