Full geolocation and network lookup for an IPv4 address, IPv6 address, or resolvable hostname. Returns country, continent, ASN, organisation name, and — as of v0.1 — the most-specific announced BGP prefix covering the IP. Cached for 7 days.
| Field | Type | Description |
|---|---|---|
| ip | string | Resolved IP address. May differ from input when a hostname is provided. |
| country_code | string | ISO 3166-1 alpha-2 code, e.g. "AU". |
| country | string | Full country name, e.g. "Australia". |
| country_flag | string | Unicode flag emoji, e.g. "🇦🇺". |
| continent | string | Full continent name, e.g. "Oceania". |
| as_number | number | ASN as an integer, e.g. 13335. |
| as_description | string | Organisation name from the routing registry, e.g. "CLOUDFLARENET". |
| cidrnew | string|null | Most-specific announced BGP prefix containing this IP, e.g. "1.1.1.0/24". null when the ASN has no prefix entries in the database. |
| error | null|string | Null on success. Error message on failure. |
Returns all CIDR prefixes announced by an ASN, annotated with country and continent data.
Now also includes pre-computed announcement size stats so consumers don't need
to iterate the full prefix list. :as_number accepts a bare integer or an
AS-prefixed string (e.g. 13335 or AS13335).
Cached for 24 hours.
| Field | Type | Description |
|---|---|---|
| as_number | number | The ASN as an integer. |
| as_description | string | Organisation name from the registry. |
| ipv4_countnew | number | Total IPv4 host addresses across all announced prefixes (sum of 2^(32−prefixLen)). |
| ipv6_prefix_countnew | number | Number of IPv6 prefix entries. IPv6 address space is too large to represent as a single sum. |
| cidrs | object[] | Array of prefix objects. |
| cidrs[].cidr | string | CIDR notation, e.g. "1.1.1.0/24". |
| cidrs[].country_code | string | ISO 3166-1 alpha-2 code for this prefix's allocation. |
| cidrs[].country | string | Full country name for this prefix. |
| cidrs[].continent | string | Full continent name for this prefix. |
| error | null|string | Null on success. |
Search ASNs by multiple input types — automatically detected from the query string.
Returns up to 25 matching { as_number, as_description } results.
| Input | Strategy |
|---|---|
| CIDR prefixnew | e.g. 1.1.1.0/24 — exact match against the prefix table. Returns the owning ASN. |
| IP address | e.g. 1.1.1.1 — resolves to the owning ASN via the IP range table. |
| AS number / "AS1234" | e.g. 13335 or AS13335 — direct lookup by number, single result. |
| Org name | e.g. cloudflare — case-insensitive partial match against organisation names, up to 25 results. |
Traceroute hop annotation — returns the reverse-DNS record, the ASN details, the internet exchange the address sits on if any, and a best-effort "PoP" (point of presence) match. An address inside a peering LAN is at that exchange by definition, so it places the hop outright; otherwise the PoP is derived from parsing the PTR against known carrier naming conventions (Hurricane Electric, Cogent, GTT, Zayo, Lumen/Level3, NTT). When no carrier pattern fits, a tier-2 "scatter" pass looks for 3-letter IATA hub codes and known city names anywhere in the hostname. Supports IPv4 and IPv6. Auto-generated IPv6 PTRs (e.g. residential Comcast nibble-hex labels) are detected and stripped before matching. Cached for 24 hours; rate-limited to 300 requests/minute per client IP.
| Field | Type | Description |
|---|---|---|
| ip | string | The IP as supplied in the URL. |
| ip_version | 4 | 6 | null | Address family. null only on 400 errors. |
| ptr | string|null | Reverse-DNS hostname. null when no PTR is published or lookup timed out (2s). |
| asn | object|null | ASN metadata (same shape as /api/v2/ip). null when the IP is not in the routing table. |
| asn.number | number | AS number as integer. |
| asn.name | string | Organisation name from the registry. |
| asn.country_code | string | ISO 3166-1 alpha-2 country code. |
| ix | object|null | The internet exchange whose peering LAN contains this address, or null — which is the answer for almost every address. The full record, including every LAN and member, is at /api/v2/ix/ip/:ip. |
| ix.name / ix.city / ix.country | string|null | Exchange name and location. country is PCH's country name ("Germany"), not a code — unlike every other country field here. |
| ix.prefix | string | The peering LAN that matched. |
| ix.member | object|null | The network whose port holds this exact address, when PCH has it on file. null means not recorded, never "probably". |
| ix.source / ix.license | string|null | Attribution for the exchange data (Packet Clearing House, CC BY-NC-SA 3.0). Render these wherever you render ix. |
| pop | object|null | Matched PoP annotation, or null when nothing matched. |
| pop.iata | string | Canonical 3-letter IATA code for the PoP city. null on an exchange match when the exchange has no IATA code. |
| pop.city | string | City name. |
| pop.country | string | ISO alpha-2 country code. |
| pop.lat / pop.lon | number | Airport coordinates (proxy for PoP location). |
| pop.matched | string | Origin of the match: ix:<id>, carrier:<suffix> or scatter:<token>. |
| pop.confidence | "high"|"medium"|"low" | high = peering-LAN match or carrier pattern; medium = scatter hit whose country agrees with the ASN country; low = scatter hit only. |
| ptr_style | "normal"|"auto"|"auto-prefix"|null | auto = PTR was auto-generated (no hint); auto-prefix = we stripped the auto label and still matched the suffix. |
| error | null|string | Null on success. Error message on 400 (invalid IP) or 429 (rate-limited). |
Provenance for the topology dataset this instance is serving. Every other routing response embeds the same block, so a caller can always state what it is showing and when it was observed. Fetch this once to decide whether the routing endpoints are worth calling at all: 404 means no topology is loaded here, which is a normal state — a database image built before the routing tables existed, or a web image newer than its database image mid-rollout — and not an error. Cached for 24 hours.
| Field | Type | Description |
|---|---|---|
| rib_ts | string | ISO 8601 timestamp of the RIB dump the data was parsed from — when the internet looked like this, not when it was loaded. |
| collectors | string | Comma-separated collectors that contributed, e.g. "route-views2,rrc00". |
| peer_count | number | Distinct collector peers whose AS_PATHs went into the snapshot. This is the denominator for every observations and peers_seen figure elsewhere. |
| route_entries | number | Route entries parsed across all collectors. |
Observed BGP topology for an autonomous system: the networks that carry
its traffic, the networks it carries traffic for, and every AS seen
adjacent to it in a routing path. Derived from bulk MRT routing tables
(RouteViews route-views2 and RIPE RIS rrc00), which is the only way to
answer "who provides transit to this network". Related networks
come back named, joined in-database, so rendering a
peering table costs one request rather than one lookup per row.
Accepts 15169 or AS15169. Cached for 24 hours.
Everything here is an observation. These are AS_PATHs
seen by a specific set of collector peers at a specific time, so every
response embeds a snapshot block and callers are expected to
show it. Two claims the data does not support:
adjacency is not peering (two ASes next to each other in
a path may be in a transit, settlement-free peering or customer
relationship, and routing data cannot tell them apart, which is why the
field is neighbours), and upstreams are
inferred from the AS immediately preceding the origin, so for a
tier-1 that buys transit from nobody it surfaces that network's peers
instead. The response carries inferred: true so this cannot
be missed.
| Parameter | Default | Description |
|---|---|---|
| limit | 100 | Caps each of upstreams, downstreams and neighbours independently. Clamped to 500. The *_count fields are unaffected, so a truncated list is always detectable. |
| Field | Type | Description |
|---|---|---|
| as_number | number | The AS as supplied in the URL, normalised to an integer. |
| name | string|null | Operator name. null when the AS is observed in paths but absent from the name dataset. |
| prefixes_v4 / prefixes_v6 | number | Distinct prefixes observed originating from this AS, per address family. |
| addresses_v4 | number | Addresses covered by those v4 prefixes. Summed from the observed prefix list, not from the registry or this service's own per-ASN size fields, which disagree with observed BGP in both directions. There is deliberately no addresses_v6: the figure exceeds any integer type worth carrying and nobody reasons about it, so IPv6 is counted in prefixes. |
| degree_v4 / degree_v6 | number | Distinct adjacent ASes per address family. |
| upstream_count | number | Total upstreams, before limit is applied. |
| downstream_count | number | Total downstreams, before limit is applied. |
| upstreams | array | Networks seen immediately before this AS where it is the origin, most-observed first. Inferred — see above. |
| downstreams | array | The inverse: networks for which this AS appears as the upstream. |
| neighbours | array | Every adjacent AS in either direction, most-observed first. |
| upstreams[].as_number | number | The related AS. |
| upstreams[].name | string|null | Operator name for the related AS, already resolved. |
| upstreams[].af | 4 | 6 | Address family the adjacency was observed in. An AS pair adjacent over both appears twice. |
| upstreams[].observations | number | How many collector peers saw this adjacency. Weight it against snapshot.peer_count; a 1-of-74 adjacency is not the same claim as 68-of-74. |
| inferred | true | Always present and always true. Do not render these relationships as fact. |
| snapshot | object | Provenance block, same shape as /api/v2/routing/snapshot. |
How the internet actually reaches one address: every announcement
covering it, most specific first, each with the AS originating it and how
many collector peers saw that origin. This is strict BGP origin, which is
a different and stricter question than "which ASN is this IP
registered to" that /api/v2/ip/:ip answers. IPv4 and
IPv6. Cached for 24 hours.
routed: false is a real answer, not a 404 — the address is
allocated but not reachable, or announced only where our collectors
cannot see. moas: true means the most specific
prefix is announced by more than one AS: legitimate multi-homing or
anycast, or a hijack. It is reported, never adjudicated. Note that two
different prefixes covering one address is ordinary
deaggregation and does not set moas.
| Field | Type | Description |
|---|---|---|
| ip | string | The address as supplied in the URL. |
| routed | boolean | false when no observed prefix covers the address. |
| covering | array | Covering announcements, longest prefix first, then most-observed. Capped at 8. |
| covering[].prefix | string | The announced CIDR block. |
| covering[].origin_asn | number | AS at the end of the AS_PATH for that prefix. |
| covering[].name | string|null | Operator name for the origin, already resolved. |
| covering[].peers_seen | number | Collector peers that saw this prefix from this origin. Weigh against snapshot.peer_count. |
| moas | boolean | More than one origin on the most specific covering prefix. |
| origin_count | number | Distinct origins on that most specific prefix. 0 when unrouted. |
| snapshot | object | Provenance block, same shape as /api/v2/routing/snapshot. |
FBI IC3 malicious-IP reputation. Answers "is this IP listed in an FBI IC3
Cybersecurity Advisory (a 'flash')?" from the rolling last year of advisories at
ic3.gov/CSA, alongside the geo/ASN summary — one call for where/whose an IP is and
whether the FBI has named it. A clean IP returns 200 with
ic3.listed = false (not 404). This is provenance, not a verdict:
advisory IPs age and get reassigned, and advisories occasionally list victim/sinkhole
IPs — weigh it as one signal, never a standalone block. Cached 24h.
| Field | Type | Description |
|---|---|---|
| ip | string | The IP as supplied. |
| country / country_code / country_flag / continent | string|null | Geo summary (same source as /api/v2/ip); null when the IP isn't in the DB. |
| as_number / as_description | number|string|null | Owning ASN. |
| ic3.listed | boolean | True if the IP matches one or more advisories. |
| ic3.count | number | Number of matching advisory rows. |
| ic3.advisories[] | array | Each: advisory_id, title, pub_date, source_url (the advisory PDF), cidr (the listed entry). |
| error | null|string | Null on success; message on 400 (invalid IP). |
| Route | Returns |
|---|---|
| /api/v2/threat/list | Plain text — every listed IP, one per line (hosts bare, ranges as CIDR). Firewall URL-table / external-connector feed. |
| /api/v2/threat/asn/:as | JSON { as_number, ic3_count, iocs[] } — listed IOCs attributed to an ASN, each ioc carrying the advisory that named it (advisory_id, title, pub_date, source_url). |
A curated, plain-language "what is this network" TLDR for well-known ASNs —
what it's used for, its location, and notable / interesting facts. Accepts
13335 or AS13335. AI-generated, best-effort context
(see the disclaimer field): not authoritative and carries no guarantee of
accuracy. body_markdown is a small markdown subset meant for client-side
rendering. Only a curated set of ASNs has an entry — any other returns 404
(a normal answer, not an error). The source files are public and editable via
source_url (the co-op repo). Cached 24h.
| Field | Type | Description |
|---|---|---|
| as_number | number | The ASN, as an integer. |
| name | string|null | Operator name. |
| location | string|null | Primary geography, or Global. |
| tags[] | array | Short lowercase labels (e.g. cdn, transit). |
| generated | string | Provenance of the text — currently always ai. |
| body_markdown | string | The description body, a small markdown subset (headings, lists, bold/italic, links). |
| disclaimer | string | Fixed AI-generated / no-accuracy-guarantee notice. |
| source_url | string | Link to the source markdown in the public co-op repo. |
| error | null|string | Null on success; message on 400 (invalid AS) / 404 (no entry). |
Provenance and licence for the internet-exchange dataset this instance is
serving. Every other /api/v2/ix/* response embeds the same
block. Fetch this once to decide whether the exchange endpoints are worth
calling at all: 404 means no exchange data is loaded here,
which is a normal state on a database image built before these tables
existed, and not an error. Cached for 24 hours.
Attribution is required, not optional. The data is
Packet Clearing House's, under
CC BY-NC-SA
3.0: free to redistribute non-commercially, with attribution, under the
same terms. That is why source and license are
fields in the response rather than a footnote here — if you render this
data, render those too.
| Field | Type | Description |
|---|---|---|
| collected_at | string | ISO 8601 timestamp of the collection run, not of the image build. |
| source | string | Upstream dataset. Display it. |
| license | string | Licence the data is redistributed under. Display it. |
| exchanges | number | Exchanges in the directory, including planned, deprecated and defunct ones. |
| prefixes | number | Peering LANs across all exchanges, both address families. |
| members | number | Individual member addresses recorded on those LANs. |
Find exchanges by name, city or country. Substring match across all three,
with exact and prefix matches ordered first and dead exchanges last, so
?q=amsterdam and ?q=AMS-IX both put the obvious
answer at the top. Returns the exchange summary only — call
/api/v2/ix/:id for LANs and members. Cached for 24 hours.
| Parameter | Default | Description |
|---|---|---|
| q | — | Required, at least 2 characters. Shorter terms 400 rather than returning a slice of the whole directory. |
| limit | 25 | Maximum results. Clamped to 100. |
| Field | Type | Description |
|---|---|---|
| query | string | The term as supplied. |
| count | number | Results returned, after limit. |
| results | array | Exchange summaries, same shape as the top level of /api/v2/ix/:id minus prefixes and members. |
| snapshot | object | Provenance block, same shape as /api/v2/ix/snapshot. |
Is this address sitting on a peering LAN, and whose port is it? This is the endpoint worth building on: a traceroute hop inside a peering LAN is at that exchange, which locates it far more reliably than an rDNS guess — the exchange's coordinates apply to the interface, not to the network that owns it. IPv4 and IPv6. Cached for 24 hours.
on_ix: false is the ordinary answer, not a 404 — most addresses
are not on an exchange. ix.member names the network holding the
port when Packet Clearing House has that exact address on file, and is
null otherwise; it is an exact-address match, so there is no
half-answer to misread. Deprecated LANs are matched deliberately — a hop on
a retired peering LAN still crossed that exchange — and
ix.prefix_status says so.
ix is singular, and sometimes that is one of two
true answers. Packet Clearing House records a handful of fabrics
under more than one exchange id — 206.72.210.0/23 is listed by
both 373 and 2450, which are the same Los Angeles
exchange — so also_recorded_as sits beside ix and
names every other exchange whose active LAN also covers the
address. It is [] for an unambiguous address, which is nearly
all of them. ix itself is unchanged; nothing that worked before
moves.
Anything covering the address counts here, not only an identical LAN: a
carve-out registered by a different exchange is a competing claim on where
the address lives, and that is precisely what the field exists to expose.
Compare related on /api/v2/ix/:id, which
asks the narrower question of whether two entries are the same fabric.
| Field | Type | Description |
|---|---|---|
| ip | string | The address as supplied in the URL. |
| on_ix | boolean | false when no peering LAN covers the address. |
| ix | object|null | The matched exchange, or null. Most specific LAN wins where blocks overlap. |
| ix.prefix | string | The peering LAN that matched. |
| ix.prefix_status | string | Active, Deprecated, Unknown or Defunct — the LAN's status, not the exchange's. |
| ix.participants | number | Ports on that LAN as recorded upstream. |
| ix.lat / ix.lon | number|null | Exchange coordinates. This is what makes the match useful for geolocating a hop. |
| ix.iata | string|null | Nearest airport code, for ~25% of exchanges. Joins onto the same PoP vocabulary /api/v2/hop/:ip uses. |
| ix.member | object|null | The network occupying the address, when recorded. |
| ix.member.as_number | number | AS holding the port. |
| ix.member.name | string|null | Operator name, resolved in-database from the routing dataset, falling back to the upstream string. |
| ix.member.rdns | string|null | PTR recorded upstream. Compare against the live PTR from /api/v2/hop/:ip. |
| ix.member.peering_policy | string|null | Open, Selective, Restrictive — as declared by the member. |
| also_recorded_as | array | Other exchanges whose active LAN also covers this address. [] when the address is unambiguous. Always present. |
| also_recorded_as[].pch_id | number | The other exchange's id. Named pch_id, not id, because it identifies a different record from ix. |
| also_recorded_as[].name / city / country / status / ports | — | The other exchange's own directory entry. |
| also_recorded_as[].member_count | number | Member addresses on that record. The size gap is usually how you tell the fuller entry from the thinner one. |
| also_recorded_as[].prefix / prefix_status / participants | — | The covering LAN that made it a match, as recorded against that exchange. |
| also_recorded_as[].pch_url | string | Deep link to the other exchange upstream. |
| snapshot | object | Provenance block, same shape as /api/v2/ix/snapshot. |
Every internet exchange a network is present on, with the address it holds
there. One entry per exchange even for a dual-stack member on several
ports. Pairs naturally with /api/v2/routing/asn/:as: that says
who a network exchanges traffic with, this says where it
does so. Accepts 15169 or AS15169. Cached for 24
hours.
An empty list is a real answer. Membership here is what Packet Clearing House has recorded, not what is live: roughly half the exchanges in the directory have no membership on file at all, and a network may also peer entirely privately. Absence is not evidence of absence.
| Parameter | Default | Description |
|---|---|---|
| limit | 200 | Maximum exchanges returned. Clamped to 500. |
| Field | Type | Description |
|---|---|---|
| as_number | number | The AS as supplied in the URL, normalised to an integer. |
| count | number | Exchanges returned, after limit. |
| exchanges | array | Exchange summaries, each with the member's own ip, rdns and peering_policy at that exchange. |
| snapshot | object | Provenance block, same shape as /api/v2/ix/snapshot. |
One exchange in full: where it is, its peering LANs across both address
families, and the networks on them. Members come back named
and ordered by their own connectivity, joined in-database against the
routing dataset — so rendering a members table costs one request rather
than one lookup per row, and the default page is the networks worth naming.
The :id is Packet Clearing House's own exchange id, which
pch_url links back to. Cached for 24 hours.
Deprecated and defunct LANs are included with their own
status, because a hop on a retired peering LAN still
identifies the exchange it crossed. Filter on that field if you only want
live ones.
One fabric is sometimes two directory entries. Packet
Clearing House occasionally carries the same physical exchange under two
ids, with nothing upstream linking them: 373 “Any2
California” and 2450 “Coresite - Any2 West”
are both in Los Angeles, both advertise the identical active LANs
206.72.210.0/23 and 2001:504:13::/64, and 2450's
586 member addresses are a strict subset of 373's 718. related
names the other entries. It is [] for 1,296 of the 1,327
exchanges in the directory, so treat a non-empty one as a signal, not noise:
counting both ids as separate exchanges inflates any total you derive.
Matched on the peering LAN, never on the name. A peering LAN is one L2 broadcast domain, so two entries advertising the same active prefix are the same fabric — a fact about the network, not a guess. Names are the opposite of a signal here: “Any2 California” and “Coresite - Any2 West” share no words, while the genuinely separate Any2 metros (Denver, Chicago, New York, each on its own LAN) share plenty. Deprecated prefixes are excluded because a retired block can be reassigned, and the prefixes must be identical rather than overlapping, because a carve-out of a larger block is a different claim.
We cross-link, we do not merge. Merging would mean electing
an authoritative record, which throws away the retired-LAN history only 373
carries, and every member port is recorded against a specific id, so
rewriting it would lose provenance. Both records stay exactly as published
and point at each other; deciding which one to show is yours. Relations are
direct neighbours, not transitive clusters — exchange 712 shares
an IPv4 LAN with 2402 and an IPv6 LAN with 2382,
so it lists both while 2382 lists only 712.
| Parameter | Default | Description |
|---|---|---|
| limit | 100 | Maximum member addresses. Clamped to 1000 — the largest exchange has over 6,000. member_count is unaffected, so truncation is always detectable. |
| members | — | Set to 0 to skip the member query and return the exchange and its LANs only. members comes back as [] rather than being dropped, so the response shape never changes. |
| Field | Type | Description |
|---|---|---|
| id | number | Packet Clearing House exchange id. |
| name | string | Exchange name, e.g. "AMS-IX Amsterdam". |
| city / country / region | string|null | Location. country is a name, not a code — the upstream publishes no code. |
| iata | string|null | Nearest airport code, present for ~25% of exchanges. |
| lat / lon | number|null | Exchange coordinates. |
| website | string|null | The exchange's own site. |
| status | string | Active, Planned, Unknown, Deprecated, Defunct or Not an exchange. Every directory entry is served so an id always resolves to something explicable. |
| ports | number | Connected ports as recorded upstream. |
| traffic_bps | number | Reported peak traffic in bits per second. 0 where unreported, which is common. |
| updated | string|null | When the upstream record was last touched, YYYY-MM-DD. |
| pch_url | string | Deep link to the upstream page for this exchange. |
| member_count | number | Total member addresses, before limit. |
| prefixes | array | Peering LANs, IPv4 first. Each has prefix, af (4 or 6), status and participants. |
| members | array | Networks on those LANs, most-connected first. Each has as_number, name, ip, rdns and peering_policy. |
| related | array | Other directory entries advertising an identical active LAN — the same fabric under another id. [] for all but 31 of the 1,327 exchanges. Always present, and unaffected by ?members=0. |
| related[].pch_id | number | The other exchange's id. Named pch_id, not id, because it identifies a different record from the one you asked for. |
| related[].name / city / country / status / ports | — | The other exchange's own directory entry, as published. |
| related[].member_count | number | Member addresses on that record. Uncapped, so the size gap against this exchange's member_count tells you which entry is the fuller one. |
| related[].shared_prefixes | array | The peering LANs both entries advertise as active. Sorted, so the array is stable between requests. |
| related[].pch_url | string | Deep link to the other exchange upstream. |
| snapshot | object | Provenance block, same shape as /api/v2/ix/snapshot. |
Provenance for the registry-allocation dataset this instance is serving.
Every other /api/v2/rdap/* response embeds the same block.
Fetch this once to decide whether the registry endpoints are worth calling
at all: 404 means no registry data is loaded here, which is
a normal state on a database image built before these tables existed, and
not an error. Cached for 24 hours.
Nothing here speaks RDAP. These endpoints answer the subset of questions an RDAP lookup is normally used for, out of a local table built from the five RIRs' daily delegated-extended statistics files. The point is that a consumer can stop making five third-party requests per page view.
| Field | Type | Description |
|---|---|---|
| collected_at | string | ISO 8601 timestamp of the collection run, not of the image build. |
| source | string | Upstream dataset description. |
| source_urls | object | The five files, keyed by registry. There is no single licence covering all of them, so the per-registry URL is the provenance — check each registry's own conditions of use before redistributing. |
| registries | object | Per-registry serial, generation date and row counts. This is how you tell a fresh answer from one built on a registry that quietly stopped republishing. |
| alloc_rows | number | Address allocations loaded, both families. |
| asn_rows | number | AS-number allocation ranges loaded. |
Which registry holds this address, in which country, since when, and under what status. IPv4 or IPv6. Cached for 24 hours.
Read the fields_absent array before rendering.
The delegated files carry no network name, organisation name or abuse
contact, so those fields are not merely null here — they are not in the
dataset. Rendering their absence as a fact about the network ("this
network has no abuse contact") would be false. The array names them
explicitly on every response so there is no need to guess.
status: "available" or "reserved" is a
real answer, meaning the registries positively record that nobody
holds this space. That is different from found: false, which
means the address falls outside what the RIRs publish at all — IANA
special-purpose space, roughly 14% of IPv4 (multicast 224/4, reserved
240/4, 0/8, 127/8 and friends). Both are 200s; a 404 is reserved for
"no dataset loaded".
| Field | Type | Description |
|---|---|---|
| query | string | The address as parsed. |
| found | boolean | Whether any delegated-statistics record covers it. |
| allocation.prefix | string | The covering CIDR as the registry publishes it. |
| allocation.rir | string | arin | ripencc | apnic | lacnic | afrinic. |
| allocation.cc | string | ISO alpha-2, or null when not recorded. |
| allocation.status | string | allocated | assigned | available | reserved. |
| allocation.allocated | string | Delegation date (YYYY-MM-DD), or null. |
| allocation.opaque_id | string | Holder id. Unique within its own registry only — always pair it with rir. |
| allocation.delegated | boolean | True for allocated/assigned; false for space nobody holds. |
| fields_absent | array | RDAP fields this dataset does not carry. See above. |
| source | object | The snapshot block. |
The registry record covering an entire CIDR block. Same response shape as
/api/v2/rdap/ip/:ip. Cached for 24 hours.
This is not the same question as asking about the block's first
address, and the difference bites. A block can span several
allocations and be covered by none of them: 8.8.0.0/16 contains 12 separate
registry records, so looking up 8.8.0.0 answers 8.8.8.0/22 with
every appearance of confidence. This endpoint requires containment of the
whole block and returns found: false when no single record
covers it, which is the truthful answer.
Host bits are tolerated: 8.8.8.8/24 is read as the /24
containing that address.
The registry record covering an AS number. Accepts 15169 or
AS15169. Cached for 24 hours.
Allocations are stored as closed ranges, so the response carries
as_start and as_end rather than a single number —
registries hand out 32-bit AS numbers in blocks, and the range is the record
that actually exists. A single assignment simply has both ends equal.
Every other prefix and AS number the same holder has, taken from the
opaque_id on any allocation response. This is the one field the
delegated files give that RDAP cannot cheaply be asked for in bulk: it
groups a registrant's resources without a name ever being involved.
?limit= caps each list (default 100, max 1000); the counts stay
uncapped. Cached for 24 hours.
The registry is part of the key, not decoration. An opaque id is unique within one registry only — LACNIC publishes small integers, ARIN hex digests, RIPE UUIDs — and nothing coordinates them, so two registries can emit the same string for unrelated organisations. An endpoint keyed on the id alone would silently merge them, which is why this one will not accept it.
| Field | Type | Description |
|---|---|---|
| prefixes | array | Address allocations held, up to limit. |
| asns | array | AS-number ranges held, up to limit. |
| prefix_count | number | Total held, uncapped. |
| asn_count | number | Total held, uncapped. |
Returns the full country name as a plain text string. Ideal for shell pipelines. Accepts IPv4, IPv6, or any resolvable hostname. Cached for 7 days.
Returns the bare ASN number as plain text — no "AS" prefix.
Returns the full continent name as plain text.
Atlas is free and unmetered. If you're using it in something cool, consider supporting continued development.
♥ Donate