vpndetection 5.9.1 → 5.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -6
  3. data/lib/vpndetection/api/account_wire_api.rb +1 -1
  4. data/lib/vpndetection/api/api_keys_wire_api.rb +1 -1
  5. data/lib/vpndetection/api/authorization_wire_api.rb +1 -1
  6. data/lib/vpndetection/api/database_wire_api.rb +1 -1
  7. data/lib/vpndetection/api/entitlement_wire_api.rb +1 -1
  8. data/lib/vpndetection/api/lookup_wire_api.rb +5 -5
  9. data/lib/vpndetection/api/organization_wire_api.rb +1 -1
  10. data/lib/vpndetection/api_client.rb +1 -1
  11. data/lib/vpndetection/api_error.rb +1 -1
  12. data/lib/vpndetection/api_model_base.rb +1 -1
  13. data/lib/vpndetection/bogon.rb +4 -1
  14. data/lib/vpndetection/configuration.rb +1 -1
  15. data/lib/vpndetection/models/account_create_apikey_request.rb +1 -1
  16. data/lib/vpndetection/models/account_created_apikey.rb +1 -1
  17. data/lib/vpndetection/models/account_org.rb +1 -1
  18. data/lib/vpndetection/models/account_org_ref.rb +1 -1
  19. data/lib/vpndetection/models/account_org_wrap.rb +1 -1
  20. data/lib/vpndetection/models/account_rc.rb +1 -1
  21. data/lib/vpndetection/models/account_revealed_apikey.rb +1 -1
  22. data/lib/vpndetection/models/account_user.rb +1 -1
  23. data/lib/vpndetection/models/apikey_detail.rb +1 -1
  24. data/lib/vpndetection/models/apikey_list.rb +1 -1
  25. data/lib/vpndetection/models/asn.rb +274 -0
  26. data/lib/vpndetection/models/batch_lookup_error.rb +1 -1
  27. data/lib/vpndetection/models/batch_lookup_request.rb +1 -1
  28. data/lib/vpndetection/models/batch_lookup_response.rb +1 -1
  29. data/lib/vpndetection/models/class_detail.rb +1 -1
  30. data/lib/vpndetection/models/client_registration.rb +1 -1
  31. data/lib/vpndetection/models/client_registration_request.rb +1 -1
  32. data/lib/vpndetection/models/database.rb +29 -2
  33. data/lib/vpndetection/models/database_checksums_response.rb +1 -1
  34. data/lib/vpndetection/models/database_format.rb +1 -1
  35. data/lib/vpndetection/models/database_format_size.rb +1 -1
  36. data/lib/vpndetection/models/database_list.rb +1 -1
  37. data/lib/vpndetection/models/database_metadata.rb +1 -1
  38. data/lib/vpndetection/models/database_metadata_column.rb +1 -1
  39. data/lib/vpndetection/models/database_version.rb +1 -1
  40. data/lib/vpndetection/models/db_checksums.rb +1 -1
  41. data/lib/vpndetection/models/device_authorization.rb +1 -1
  42. data/lib/vpndetection/models/download.rb +29 -2
  43. data/lib/vpndetection/models/download_list.rb +1 -1
  44. data/lib/vpndetection/models/entitlement.rb +1 -1
  45. data/lib/vpndetection/models/entitlement_apikey.rb +1 -1
  46. data/lib/vpndetection/models/entitlement_error.rb +1 -1
  47. data/lib/vpndetection/models/entitlement_plan.rb +1 -1
  48. data/lib/vpndetection/models/entitlement_usage.rb +1 -1
  49. data/lib/vpndetection/models/error_envelope.rb +1 -1
  50. data/lib/vpndetection/models/identity.rb +1 -1
  51. data/lib/vpndetection/models/location.rb +409 -0
  52. data/lib/vpndetection/models/lookup_error.rb +1 -1
  53. data/lib/vpndetection/models/lookup_response.rb +40 -22
  54. data/lib/vpndetection/models/oauth_error.rb +1 -1
  55. data/lib/vpndetection/models/oauth_metadata.rb +1 -1
  56. data/lib/vpndetection/models/proxy_detail.rb +1 -1
  57. data/lib/vpndetection/models/pubproxy_detail.rb +1 -1
  58. data/lib/vpndetection/models/standing.rb +1 -1
  59. data/lib/vpndetection/models/token_response.rb +1 -1
  60. data/lib/vpndetection/models/vpn_detail.rb +4 -4
  61. data/lib/vpndetection/result.rb +41 -17
  62. data/lib/vpndetection/transport.rb +25 -3
  63. data/lib/vpndetection/version.rb +1 -1
  64. metadata +3 -1
@@ -0,0 +1,409 @@
1
+ =begin
2
+ #VPNDetection API
3
+
4
+ #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
+
6
+ The version of the OpenAPI document: 2026.10.20
7
+ Contact: support@vpndetection.io
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.25.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module VPNDetection
17
+ # Where the address is, to the country: the fields of our IP Country database. Free and paid plans. Each field is present whenever the object is, so an address in no country, or a private one, answers empty strings.
18
+ class Location < ApiModelBase
19
+ # Continent code: AF, AN (Antarctica), AS, EU, NA, OC or SA.
20
+ attr_accessor :continent
21
+
22
+ # Continent name.
23
+ attr_accessor :continent_name
24
+
25
+ # ISO 3166-1 alpha-2 country code.
26
+ attr_accessor :country
27
+
28
+ # Country name.
29
+ attr_accessor :country_name
30
+
31
+ # IANA timezone of the address.
32
+ attr_accessor :timezone
33
+
34
+ # ISO 4217 code of the country's currency, where there is one.
35
+ attr_accessor :currency_code
36
+
37
+ # Name of the country's currency, where there is one.
38
+ attr_accessor :currency_name
39
+
40
+ # Symbol of the country's currency, where known.
41
+ attr_accessor :currency_symbol
42
+
43
+ # The country's flag, as an emoji.
44
+ attr_accessor :flag_emoji
45
+
46
+ # The Unicode code points of the flag emoji.
47
+ attr_accessor :flag_unicode
48
+
49
+ # Attribute mapping from ruby-style variable name to JSON key.
50
+ def self.attribute_map
51
+ {
52
+ :'continent' => :'continent',
53
+ :'continent_name' => :'continent_name',
54
+ :'country' => :'country',
55
+ :'country_name' => :'country_name',
56
+ :'timezone' => :'timezone',
57
+ :'currency_code' => :'currency_code',
58
+ :'currency_name' => :'currency_name',
59
+ :'currency_symbol' => :'currency_symbol',
60
+ :'flag_emoji' => :'flag_emoji',
61
+ :'flag_unicode' => :'flag_unicode'
62
+ }
63
+ end
64
+
65
+ # Returns attribute mapping this model knows about
66
+ def self.acceptable_attribute_map
67
+ attribute_map
68
+ end
69
+
70
+ # Returns all the JSON keys this model knows about
71
+ def self.acceptable_attributes
72
+ acceptable_attribute_map.values
73
+ end
74
+
75
+ # Attribute type mapping.
76
+ def self.openapi_types
77
+ {
78
+ :'continent' => :'String',
79
+ :'continent_name' => :'String',
80
+ :'country' => :'String',
81
+ :'country_name' => :'String',
82
+ :'timezone' => :'String',
83
+ :'currency_code' => :'String',
84
+ :'currency_name' => :'String',
85
+ :'currency_symbol' => :'String',
86
+ :'flag_emoji' => :'String',
87
+ :'flag_unicode' => :'String'
88
+ }
89
+ end
90
+
91
+ # List of attributes with nullable: true
92
+ def self.openapi_nullable
93
+ Set.new([
94
+ ])
95
+ end
96
+
97
+ # Initializes the object
98
+ # @param [Hash] attributes Model attributes in the form of hash
99
+ def initialize(attributes = {})
100
+ if (!attributes.is_a?(Hash))
101
+ fail ArgumentError, "The input argument (attributes) must be a hash in `VPNDetection::Location` initialize method"
102
+ end
103
+
104
+ # check to see if the attribute exists and convert string to symbol for hash key
105
+ acceptable_attribute_map = self.class.acceptable_attribute_map
106
+ attributes = attributes.each_with_object({}) { |(k, v), h|
107
+ if (!acceptable_attribute_map.key?(k.to_sym))
108
+ fail ArgumentError, "`#{k}` is not a valid attribute in `VPNDetection::Location`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
109
+ end
110
+ h[k.to_sym] = v
111
+ }
112
+
113
+ if attributes.key?(:'continent')
114
+ self.continent = attributes[:'continent']
115
+ else
116
+ self.continent = nil
117
+ end
118
+
119
+ if attributes.key?(:'continent_name')
120
+ self.continent_name = attributes[:'continent_name']
121
+ else
122
+ self.continent_name = nil
123
+ end
124
+
125
+ if attributes.key?(:'country')
126
+ self.country = attributes[:'country']
127
+ else
128
+ self.country = nil
129
+ end
130
+
131
+ if attributes.key?(:'country_name')
132
+ self.country_name = attributes[:'country_name']
133
+ else
134
+ self.country_name = nil
135
+ end
136
+
137
+ if attributes.key?(:'timezone')
138
+ self.timezone = attributes[:'timezone']
139
+ else
140
+ self.timezone = nil
141
+ end
142
+
143
+ if attributes.key?(:'currency_code')
144
+ self.currency_code = attributes[:'currency_code']
145
+ else
146
+ self.currency_code = nil
147
+ end
148
+
149
+ if attributes.key?(:'currency_name')
150
+ self.currency_name = attributes[:'currency_name']
151
+ else
152
+ self.currency_name = nil
153
+ end
154
+
155
+ if attributes.key?(:'currency_symbol')
156
+ self.currency_symbol = attributes[:'currency_symbol']
157
+ else
158
+ self.currency_symbol = nil
159
+ end
160
+
161
+ if attributes.key?(:'flag_emoji')
162
+ self.flag_emoji = attributes[:'flag_emoji']
163
+ else
164
+ self.flag_emoji = nil
165
+ end
166
+
167
+ if attributes.key?(:'flag_unicode')
168
+ self.flag_unicode = attributes[:'flag_unicode']
169
+ else
170
+ self.flag_unicode = nil
171
+ end
172
+ end
173
+
174
+ # Show invalid properties with the reasons. Usually used together with valid?
175
+ # @return Array for valid properties with the reasons
176
+ def list_invalid_properties
177
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
178
+ invalid_properties = Array.new
179
+ if @continent.nil?
180
+ invalid_properties.push('invalid value for "continent", continent cannot be nil.')
181
+ end
182
+
183
+ if @continent_name.nil?
184
+ invalid_properties.push('invalid value for "continent_name", continent_name cannot be nil.')
185
+ end
186
+
187
+ if @country.nil?
188
+ invalid_properties.push('invalid value for "country", country cannot be nil.')
189
+ end
190
+
191
+ if @country_name.nil?
192
+ invalid_properties.push('invalid value for "country_name", country_name cannot be nil.')
193
+ end
194
+
195
+ if @timezone.nil?
196
+ invalid_properties.push('invalid value for "timezone", timezone cannot be nil.')
197
+ end
198
+
199
+ if @currency_code.nil?
200
+ invalid_properties.push('invalid value for "currency_code", currency_code cannot be nil.')
201
+ end
202
+
203
+ if @currency_name.nil?
204
+ invalid_properties.push('invalid value for "currency_name", currency_name cannot be nil.')
205
+ end
206
+
207
+ if @currency_symbol.nil?
208
+ invalid_properties.push('invalid value for "currency_symbol", currency_symbol cannot be nil.')
209
+ end
210
+
211
+ if @flag_emoji.nil?
212
+ invalid_properties.push('invalid value for "flag_emoji", flag_emoji cannot be nil.')
213
+ end
214
+
215
+ if @flag_unicode.nil?
216
+ invalid_properties.push('invalid value for "flag_unicode", flag_unicode cannot be nil.')
217
+ end
218
+
219
+ invalid_properties
220
+ end
221
+
222
+ # Check to see if the all the properties in the model are valid
223
+ # @return true if the model is valid
224
+ def valid?
225
+ warn '[DEPRECATED] the `valid?` method is obsolete'
226
+ return false if @continent.nil?
227
+ return false if @continent_name.nil?
228
+ return false if @country.nil?
229
+ return false if @country_name.nil?
230
+ return false if @timezone.nil?
231
+ return false if @currency_code.nil?
232
+ return false if @currency_name.nil?
233
+ return false if @currency_symbol.nil?
234
+ return false if @flag_emoji.nil?
235
+ return false if @flag_unicode.nil?
236
+ true
237
+ end
238
+
239
+ # Custom attribute writer method with validation
240
+ # @param [Object] continent Value to be assigned
241
+ def continent=(continent)
242
+ if continent.nil?
243
+ fail ArgumentError, 'continent cannot be nil'
244
+ end
245
+
246
+ @continent = continent
247
+ end
248
+
249
+ # Custom attribute writer method with validation
250
+ # @param [Object] continent_name Value to be assigned
251
+ def continent_name=(continent_name)
252
+ if continent_name.nil?
253
+ fail ArgumentError, 'continent_name cannot be nil'
254
+ end
255
+
256
+ @continent_name = continent_name
257
+ end
258
+
259
+ # Custom attribute writer method with validation
260
+ # @param [Object] country Value to be assigned
261
+ def country=(country)
262
+ if country.nil?
263
+ fail ArgumentError, 'country cannot be nil'
264
+ end
265
+
266
+ @country = country
267
+ end
268
+
269
+ # Custom attribute writer method with validation
270
+ # @param [Object] country_name Value to be assigned
271
+ def country_name=(country_name)
272
+ if country_name.nil?
273
+ fail ArgumentError, 'country_name cannot be nil'
274
+ end
275
+
276
+ @country_name = country_name
277
+ end
278
+
279
+ # Custom attribute writer method with validation
280
+ # @param [Object] timezone Value to be assigned
281
+ def timezone=(timezone)
282
+ if timezone.nil?
283
+ fail ArgumentError, 'timezone cannot be nil'
284
+ end
285
+
286
+ @timezone = timezone
287
+ end
288
+
289
+ # Custom attribute writer method with validation
290
+ # @param [Object] currency_code Value to be assigned
291
+ def currency_code=(currency_code)
292
+ if currency_code.nil?
293
+ fail ArgumentError, 'currency_code cannot be nil'
294
+ end
295
+
296
+ @currency_code = currency_code
297
+ end
298
+
299
+ # Custom attribute writer method with validation
300
+ # @param [Object] currency_name Value to be assigned
301
+ def currency_name=(currency_name)
302
+ if currency_name.nil?
303
+ fail ArgumentError, 'currency_name cannot be nil'
304
+ end
305
+
306
+ @currency_name = currency_name
307
+ end
308
+
309
+ # Custom attribute writer method with validation
310
+ # @param [Object] currency_symbol Value to be assigned
311
+ def currency_symbol=(currency_symbol)
312
+ if currency_symbol.nil?
313
+ fail ArgumentError, 'currency_symbol cannot be nil'
314
+ end
315
+
316
+ @currency_symbol = currency_symbol
317
+ end
318
+
319
+ # Custom attribute writer method with validation
320
+ # @param [Object] flag_emoji Value to be assigned
321
+ def flag_emoji=(flag_emoji)
322
+ if flag_emoji.nil?
323
+ fail ArgumentError, 'flag_emoji cannot be nil'
324
+ end
325
+
326
+ @flag_emoji = flag_emoji
327
+ end
328
+
329
+ # Custom attribute writer method with validation
330
+ # @param [Object] flag_unicode Value to be assigned
331
+ def flag_unicode=(flag_unicode)
332
+ if flag_unicode.nil?
333
+ fail ArgumentError, 'flag_unicode cannot be nil'
334
+ end
335
+
336
+ @flag_unicode = flag_unicode
337
+ end
338
+
339
+ # Checks equality by comparing each attribute.
340
+ # @param [Object] Object to be compared
341
+ def ==(o)
342
+ return true if self.equal?(o)
343
+ self.class == o.class &&
344
+ continent == o.continent &&
345
+ continent_name == o.continent_name &&
346
+ country == o.country &&
347
+ country_name == o.country_name &&
348
+ timezone == o.timezone &&
349
+ currency_code == o.currency_code &&
350
+ currency_name == o.currency_name &&
351
+ currency_symbol == o.currency_symbol &&
352
+ flag_emoji == o.flag_emoji &&
353
+ flag_unicode == o.flag_unicode
354
+ end
355
+
356
+ # @see the `==` method
357
+ # @param [Object] Object to be compared
358
+ def eql?(o)
359
+ self == o
360
+ end
361
+
362
+ # Calculates hash code according to all attributes.
363
+ # @return [Integer] Hash code
364
+ def hash
365
+ [continent, continent_name, country, country_name, timezone, currency_code, currency_name, currency_symbol, flag_emoji, flag_unicode].hash
366
+ end
367
+
368
+ # Builds the object from hash
369
+ # @param [Hash] attributes Model attributes in the form of hash
370
+ # @return [Object] Returns the model itself
371
+ def self.build_from_hash(attributes)
372
+ return nil unless attributes.is_a?(Hash)
373
+ attributes = attributes.transform_keys(&:to_sym)
374
+ transformed_hash = {}
375
+ openapi_types.each_pair do |key, type|
376
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
377
+ transformed_hash["#{key}"] = nil
378
+ elsif type =~ /\AArray<(.*)>/i
379
+ # check to ensure the input is an array given that the attribute
380
+ # is documented as an array but the input is not
381
+ if attributes[attribute_map[key]].is_a?(Array)
382
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
383
+ end
384
+ elsif !attributes[attribute_map[key]].nil?
385
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
386
+ end
387
+ end
388
+ new(transformed_hash)
389
+ end
390
+
391
+ # Returns the object in the form of hash
392
+ # @return [Hash] Returns the object in the form of hash
393
+ def to_hash
394
+ hash = {}
395
+ self.class.attribute_map.each_pair do |attr, param|
396
+ value = self.send(attr)
397
+ if value.nil?
398
+ is_nullable = self.class.openapi_nullable.include?(attr)
399
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
400
+ end
401
+
402
+ hash[param] = _to_hash(value)
403
+ end
404
+ hash
405
+ end
406
+
407
+ end
408
+
409
+ end
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -22,57 +22,61 @@ module VPNDetection
22
22
  # Whether the address is VPN infrastructure. Keys off presence in the VPN dataset, so an unattributed range with no provider is still `true`.
23
23
  attr_accessor :is_vpn
24
24
 
25
- # Whether the address belongs to a hosting or cloud provider. Starter and above.
25
+ # Whether the address belongs to a hosting or cloud provider. Paid plans.
26
26
  attr_accessor :is_hosting
27
27
 
28
- # Whether the address is privacy relay or enterprise web gateway egress, such as iCloud Private Relay or Zscaler. Starter and above.
28
+ # Whether the address is privacy relay or enterprise web gateway egress, such as iCloud Private Relay or Zscaler. Free and paid plans.
29
29
  attr_accessor :is_relay
30
30
 
31
- # Whether the address is a Tor node. Starter and above.
31
+ # Whether the address is a Tor node. Free and paid plans.
32
32
  attr_accessor :is_tor
33
33
 
34
- # Whether the address belongs to a CDN. Starter and above.
34
+ # Whether the address belongs to a CDN. Paid plans.
35
35
  attr_accessor :is_cdn
36
36
 
37
- # Whether the address was seen in a residential proxy pool. Scale and above.
37
+ # Whether the address was seen in a residential proxy pool. Paid plans.
38
38
  attr_accessor :is_resproxy
39
39
 
40
- # Whether the address was seen in a datacenter proxy pool. Scale and above.
40
+ # Whether the address was seen in a datacenter proxy pool. Paid plans.
41
41
  attr_accessor :is_dcproxy
42
42
 
43
- # Whether the address was seen in a mobile proxy pool. Scale and above.
43
+ # Whether the address was seen in a mobile proxy pool. Paid plans.
44
44
  attr_accessor :is_mobproxy
45
45
 
46
- # Whether a public proxy, one anyone can connect through, listens on the address or sends its traffic out from it. Scale and above.
46
+ # Whether a public proxy, one anyone can connect through, listens on the address or sends its traffic out from it. Paid plans.
47
47
  attr_accessor :is_pubproxy
48
48
 
49
- # Detail for `is_vpn`. Empty when `is_vpn` is false. Starter and above.
49
+ # Detail for `is_vpn`. Empty when `is_vpn` is false. Paid plans.
50
50
  attr_accessor :vpn
51
51
 
52
- # Detail for `is_hosting`. Empty when false. Scale and above.
52
+ # Detail for `is_hosting`. Empty when false. Paid plans.
53
53
  attr_accessor :hosting
54
54
 
55
- # Detail for `is_relay`. Empty when false. Scale and above.
55
+ # Detail for `is_relay`. Empty when false. Free and paid plans.
56
56
  attr_accessor :relay
57
57
 
58
- # Detail for `is_tor`. Empty when false. Scale and above. The tor dataset carries no provider, so `provider` is always an empty string.
58
+ # Detail for `is_tor`. Empty when false. Free and paid plans. The tor dataset carries no provider, so `provider` is always an empty string.
59
59
  attr_accessor :tor
60
60
 
61
- # Detail for `is_cdn`. Empty when false. Scale and above.
61
+ # Detail for `is_cdn`. Empty when false. Paid plans.
62
62
  attr_accessor :cdn
63
63
 
64
- # Detail for `is_resproxy`. Empty when false. Max only.
64
+ # Detail for `is_resproxy`. Empty when false. Paid plans.
65
65
  attr_accessor :resproxy
66
66
 
67
- # Detail for `is_dcproxy`. Empty when false. Max only.
67
+ # Detail for `is_dcproxy`. Empty when false. Paid plans.
68
68
  attr_accessor :dcproxy
69
69
 
70
- # Detail for `is_mobproxy`. Empty when false. Max only.
70
+ # Detail for `is_mobproxy`. Empty when false. Paid plans.
71
71
  attr_accessor :mobproxy
72
72
 
73
- # Detail for `is_pubproxy`. Empty when false. Max only.
73
+ # Detail for `is_pubproxy`. Empty when false. Paid plans.
74
74
  attr_accessor :pubproxy
75
75
 
76
+ attr_accessor :location
77
+
78
+ attr_accessor :asn
79
+
76
80
  # Attribute mapping from ruby-style variable name to JSON key.
77
81
  def self.attribute_map
78
82
  {
@@ -94,7 +98,9 @@ module VPNDetection
94
98
  :'resproxy' => :'resproxy',
95
99
  :'dcproxy' => :'dcproxy',
96
100
  :'mobproxy' => :'mobproxy',
97
- :'pubproxy' => :'pubproxy'
101
+ :'pubproxy' => :'pubproxy',
102
+ :'location' => :'location',
103
+ :'asn' => :'asn'
98
104
  }
99
105
  end
100
106
 
@@ -129,7 +135,9 @@ module VPNDetection
129
135
  :'resproxy' => :'ProxyDetail',
130
136
  :'dcproxy' => :'ProxyDetail',
131
137
  :'mobproxy' => :'ProxyDetail',
132
- :'pubproxy' => :'PubproxyDetail'
138
+ :'pubproxy' => :'PubproxyDetail',
139
+ :'location' => :'Location',
140
+ :'asn' => :'Asn'
133
141
  }
134
142
  end
135
143
 
@@ -234,6 +242,14 @@ module VPNDetection
234
242
  if attributes.key?(:'pubproxy')
235
243
  self.pubproxy = attributes[:'pubproxy']
236
244
  end
245
+
246
+ if attributes.key?(:'location')
247
+ self.location = attributes[:'location']
248
+ end
249
+
250
+ if attributes.key?(:'asn')
251
+ self.asn = attributes[:'asn']
252
+ end
237
253
  end
238
254
 
239
255
  # Show invalid properties with the reasons. Usually used together with valid?
@@ -304,7 +320,9 @@ module VPNDetection
304
320
  resproxy == o.resproxy &&
305
321
  dcproxy == o.dcproxy &&
306
322
  mobproxy == o.mobproxy &&
307
- pubproxy == o.pubproxy
323
+ pubproxy == o.pubproxy &&
324
+ location == o.location &&
325
+ asn == o.asn
308
326
  end
309
327
 
310
328
  # @see the `==` method
@@ -316,7 +334,7 @@ module VPNDetection
316
334
  # Calculates hash code according to all attributes.
317
335
  # @return [Integer] Hash code
318
336
  def hash
319
- [ip, is_vpn, is_hosting, is_relay, is_tor, is_cdn, is_resproxy, is_dcproxy, is_mobproxy, is_pubproxy, vpn, hosting, relay, tor, cdn, resproxy, dcproxy, mobproxy, pubproxy].hash
337
+ [ip, is_vpn, is_hosting, is_relay, is_tor, is_cdn, is_resproxy, is_dcproxy, is_mobproxy, is_pubproxy, vpn, hosting, relay, tor, cdn, resproxy, dcproxy, mobproxy, pubproxy, location, asn].hash
320
338
  end
321
339
 
322
340
  # Builds the object from hash
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -3,7 +3,7 @@
3
3
 
4
4
  #The VPNDetection API: classify any IP address, and download the databases behind the answers. See https://docs.vpndetection.io for guides and https://github.com/vpndetection-io for the official client libraries.
5
5
 
6
- The version of the OpenAPI document: 2026.10.19
6
+ The version of the OpenAPI document: 2026.10.20
7
7
  Contact: support@vpndetection.io
8
8
  Generated by: https://openapi-generator.tech
9
9
  Generator version: 7.25.0
@@ -14,7 +14,7 @@ require 'date'
14
14
  require 'time'
15
15
 
16
16
  module VPNDetection
17
- # What is known about the VPN attribution. Every key is present when the object is populated, empty values included; the object is `{}` when `is_vpn` is false. `confidence` and `method` are max only, so on a lower plan they are absent from a populated object rather than empty.
17
+ # What is known about the VPN attribution. Every key is present when the object is populated, empty values included; the object is `{}` when `is_vpn` is false.
18
18
  class VpnDetail < ApiModelBase
19
19
  # The VPN provider, or an empty string for an unattributed range.
20
20
  attr_accessor :provider
@@ -22,10 +22,10 @@ module VPNDetection
22
22
  # The most recent date this address was observed as VPN infrastructure.
23
23
  attr_accessor :last_seen
24
24
 
25
- # How strongly the attribution is supported. Max only.
25
+ # How strongly the attribution is supported.
26
26
  attr_accessor :confidence
27
27
 
28
- # The class of evidence the attribution rests on, one of four values. Max only. `scan` - we spoke the VPN protocol to the address ourselves and got a valid server response. `scrape` - the operator published the address through its own API, client or configuration. `registry` - public registration or naming records attribute it to the operator. `infer` - the address was extrapolated from confirmed neighbors in the same block.
28
+ # Never returned since 2026-10-20: no plan is answered with the class of evidence an attribution rests on. Declared so that a client typed against it keeps compiling; read `confidence` instead.
29
29
  attr_accessor :method
30
30
 
31
31
  # Attribute mapping from ruby-style variable name to JSON key.