Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
CHANGELOG
=========

7.1.0 (unreleased)
------------------

* A new `residential` property has been added to the `anonymizer` object in
the `Insights` response model. This is sourced from the GeoIP Residential
Proxy database and is available from the GeoIP2 Insights web service only.
As the residential proxy feed is a superset of what is available in
Anonymous Plus, the `anonymizer` object may now contain only the
`residential` property. The `residential` object includes the following
properties:
* `confidence`: A score (1-99) representing MaxMind's confidence that the
network is part of an actively used residential proxy
* `networkLastSeen`: The last day (YYYY-MM-DD) the network was sighted in
our analysis of the residential proxy feed
* `providerName`: The name of the residential proxy provider associated
with the network

7.0.0 (2026-06-29)
------------------

Expand Down
7 changes: 6 additions & 1 deletion fixtures/geoip2.json
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@
"is_residential_proxy": false,
"is_tor_exit_node": false,
"network_last_seen": "2025-04-14",
"provider_name": "NordVPN"
"provider_name": "NordVPN",
"residential": {
"confidence": 82,
"network_last_seen": "2026-05-11",
"provider_name": "quickshift"
}
}
}
32 changes: 32 additions & 0 deletions src/records.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,32 @@ export interface SubdivisionsRecord {
readonly names: Names;
}

/**
* Contains data shared by the feed records nested within the anonymizer
* record, such as `residential`. Each of these records describes network
* activity attributed to a specific feed of anonymizing providers. This
* record is only available from the GeoIP Insights web service.
*/
export interface AnonymizerFeedRecord {
/**
* A score ranging from 1 to 99 that represents our percent confidence that
* the network is currently part of an actively used service in this feed.
* This value is only available from GeoIP Insights.
*/
readonly confidence?: number;
/**
* The last day that the network was sighted in our analysis of this feed
* of anonymized networks. The date is in ISO 8601 format (YYYY-MM-DD).
* This value is only available from GeoIP Insights.
*/
readonly networkLastSeen?: string;
/**
* The name of the identified provider, such as "NordVPN" or "SurfShark".
* This value is only available from GeoIP Insights.
*/
readonly providerName?: string;
}

/**
* Contains data for the anonymizer record associated with an IP address.
* This record is only available from the GeoIP Insights web service.
Expand Down Expand Up @@ -271,6 +297,12 @@ export interface AnonymizerRecord {
* This value is only available from GeoIP Insights.
*/
readonly providerName?: string;
/**
* Data about the residential proxy feed associated with the IP address,
* sourced from the GeoIP Residential Proxy database. This value is only
* available from GeoIP Insights.
*/
readonly residential?: AnonymizerFeedRecord;
}

/**
Expand Down
8 changes: 7 additions & 1 deletion src/webServiceClient.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ describe('WebServiceClient', () => {

it('returns an insight class', async () => {
const ip = '8.8.8.8';
expect.assertions(107);
expect.assertions(110);

const { client, requests } = clientWith(() =>
jsonResponse(200, testFixture)
Expand Down Expand Up @@ -474,6 +474,12 @@ describe('WebServiceClient', () => {
expect(got.anonymizer!.isTorExitNode).toEqual(false);
expect(got.anonymizer!.networkLastSeen).toEqual('2025-04-14');
expect(got.anonymizer!.providerName).toEqual('NordVPN');

expect(got.anonymizer!.residential!.confidence).toEqual(82);
expect(got.anonymizer!.residential!.networkLastSeen).toEqual(
'2026-05-11'
);
expect(got.anonymizer!.residential!.providerName).toEqual('quickshift');
});
});

Expand Down