vpndetection-fastapi 2.1.6__tar.gz → 2.1.8__tar.gz

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.
@@ -2,6 +2,18 @@
2
2
 
3
3
  What each release changed for you, newest first. Each line is a commit's summary, linked to its full description and diff. Releases before 2.0.5 are described by their release commits.
4
4
 
5
+ ## 2.1.8 - 2026-10-19
6
+
7
+ ### Fixes
8
+
9
+ - Require vpndetection 5.10.0: num_ports and num_proxies in the pubproxy detail ([`c5fa5cb`](https://github.com/vpndetection-io/sdk-python-fastapi/commit/c5fa5cb80237225ebb3d7aee077094549fbf9451))
10
+
11
+ ## 2.1.7 - 2026-10-18
12
+
13
+ ### Fixes
14
+
15
+ - Require vpndetection 5.9.0: is_pubproxy and the pubproxy detail ([`f307abd`](https://github.com/vpndetection-io/sdk-python-fastapi/commit/f307abded300ba66edf95e82bc692451a661d3c0))
16
+
5
17
  ## 2.1.6 - 2026-10-17
6
18
 
7
19
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vpndetection-fastapi
3
- Version: 2.1.6
3
+ Version: 2.1.8
4
4
  Summary: Official FastAPI and Starlette middleware for the VPNDetection API. Detect VPNs, proxies, Tor, hosting and CDN visitors on every request.
5
5
  Project-URL: Homepage, https://vpndetection.io
6
6
  Project-URL: Source, https://github.com/vpndetection-io/sdk-python-fastapi
@@ -20,7 +20,7 @@ Classifier: Topic :: Security
20
20
  Classifier: Typing :: Typed
21
21
  Requires-Python: >=3.11
22
22
  Requires-Dist: starlette>=0.37
23
- Requires-Dist: vpndetection<6,>=5.8.0
23
+ Requires-Dist: vpndetection<6,>=5.10.0
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: fastapi>=0.115; extra == 'dev'
26
26
  Requires-Dist: mypy>=1.11; extra == 'dev'
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Security",
25
25
  "Typing :: Typed",
26
26
  ]
27
- dependencies = ["vpndetection>=5.8.0,<6", "starlette>=0.37"]
27
+ dependencies = ["vpndetection>=5.10.0,<6", "starlette>=0.37"]
28
28
 
29
29
  [project.urls]
30
30
  Homepage = "https://vpndetection.io"
@@ -45,7 +45,7 @@ __all__ = [
45
45
  "xff_ip_selector",
46
46
  ]
47
47
 
48
- __version__ = "2.1.6"
48
+ __version__ = "2.1.8"
49
49
 
50
50
  # Set on a request ``skip`` claimed, so block_if can tell it from one the middleware
51
51
  # never saw.
@@ -305,7 +305,8 @@
305
305
  "is_cdn",
306
306
  "is_resproxy",
307
307
  "is_dcproxy",
308
- "is_mobproxy"
308
+ "is_mobproxy",
309
+ "is_pubproxy"
309
310
  ],
310
311
  "emptyObjects": [
311
312
  "vpn",
@@ -315,7 +316,8 @@
315
316
  "cdn",
316
317
  "resproxy",
317
318
  "dcproxy",
318
- "mobproxy"
319
+ "mobproxy",
320
+ "pubproxy"
319
321
  ]
320
322
  },
321
323
  "lookup": [
@@ -348,7 +350,9 @@
348
350
  "cdn",
349
351
  "resproxy",
350
352
  "dcproxy",
351
- "mobproxy"
353
+ "mobproxy",
354
+ "is_pubproxy",
355
+ "pubproxy"
352
356
  ]
353
357
  }
354
358
  },
@@ -386,7 +390,9 @@
386
390
  "cdn",
387
391
  "resproxy",
388
392
  "dcproxy",
389
- "mobproxy"
393
+ "mobproxy",
394
+ "is_pubproxy",
395
+ "pubproxy"
390
396
  ],
391
397
  "vpn": {
392
398
  "provider": "mullvad",
@@ -429,7 +435,9 @@
429
435
  "is_mobproxy",
430
436
  "resproxy",
431
437
  "dcproxy",
432
- "mobproxy"
438
+ "mobproxy",
439
+ "is_pubproxy",
440
+ "pubproxy"
433
441
  ],
434
442
  "emptyPresent": [
435
443
  "vpn",
@@ -446,7 +454,7 @@
446
454
  },
447
455
  {
448
456
  "name": "max-full-shape",
449
- "why": "Max adds confidence and method on vpn, plus the three proxy families.",
457
+ "why": "Max adds confidence and method on vpn, plus the three proxy families and the public proxy detail.",
450
458
  "status": 200,
451
459
  "body": {
452
460
  "ip": "45.83.91.1",
@@ -458,6 +466,7 @@
458
466
  "is_resproxy": false,
459
467
  "is_dcproxy": true,
460
468
  "is_mobproxy": false,
469
+ "is_pubproxy": true,
461
470
  "vpn": {
462
471
  "provider": "mullvad",
463
472
  "last_seen": "2026-09-02",
@@ -481,7 +490,19 @@
481
490
  "hits_days_pct": 63,
482
491
  "providers_num": 2
483
492
  },
484
- "mobproxy": {}
493
+ "mobproxy": {},
494
+ "pubproxy": {
495
+ "entry": true,
496
+ "exit": true,
497
+ "protocols": [
498
+ "http",
499
+ "https"
500
+ ],
501
+ "num_ports": 3,
502
+ "num_proxies": 2,
503
+ "last_seen": "2026-10-17",
504
+ "last_usable": ""
505
+ }
485
506
  },
486
507
  "expect": {
487
508
  "ip": "45.83.91.1",
@@ -489,7 +510,8 @@
489
510
  "present": {
490
511
  "is_vpn": true,
491
512
  "is_dcproxy": true,
492
- "is_resproxy": false
513
+ "is_resproxy": false,
514
+ "is_pubproxy": true
493
515
  },
494
516
  "absent": [],
495
517
  "vpn": {
@@ -505,6 +527,18 @@
505
527
  "hits": 42,
506
528
  "hits_days_pct": 63,
507
529
  "providers_num": 2
530
+ },
531
+ "pubproxy": {
532
+ "entry": true,
533
+ "exit": true,
534
+ "protocols": [
535
+ "http",
536
+ "https"
537
+ ],
538
+ "num_ports": 3,
539
+ "num_proxies": 2,
540
+ "last_seen": "2026-10-17",
541
+ "last_usable": ""
508
542
  }
509
543
  }
510
544
  },
@@ -546,6 +580,7 @@
546
580
  "is_resproxy": false,
547
581
  "is_dcproxy": false,
548
582
  "is_mobproxy": false,
583
+ "is_pubproxy": false,
549
584
  "vpn": {},
550
585
  "hosting": {},
551
586
  "relay": {},
@@ -553,7 +588,8 @@
553
588
  "cdn": {},
554
589
  "resproxy": {},
555
590
  "dcproxy": {},
556
- "mobproxy": {}
591
+ "mobproxy": {},
592
+ "pubproxy": {}
557
593
  },
558
594
  "expect": {
559
595
  "ip": "8.8.4.4",
@@ -566,7 +602,8 @@
566
602
  "is_cdn": false,
567
603
  "is_resproxy": false,
568
604
  "is_dcproxy": false,
569
- "is_mobproxy": false
605
+ "is_mobproxy": false,
606
+ "is_pubproxy": false
570
607
  },
571
608
  "absent": [],
572
609
  "emptyPresent": [
@@ -577,7 +614,8 @@
577
614
  "cdn",
578
615
  "resproxy",
579
616
  "dcproxy",
580
- "mobproxy"
617
+ "mobproxy",
618
+ "pubproxy"
581
619
  ]
582
620
  }
583
621
  }
@@ -5424,6 +5462,127 @@
5424
5462
  "blocked": false,
5425
5463
  "missing": []
5426
5464
  }
5465
+ },
5466
+ {
5467
+ "name": "pubproxy-detail-term-matches",
5468
+ "why": "The public proxy detail is a member like the other families: a nested boolean term reaches it.",
5469
+ "body": {
5470
+ "ip": "45.83.91.1",
5471
+ "is_vpn": true,
5472
+ "is_hosting": true,
5473
+ "is_relay": false,
5474
+ "is_tor": false,
5475
+ "is_cdn": false,
5476
+ "is_resproxy": true,
5477
+ "is_dcproxy": false,
5478
+ "is_mobproxy": false,
5479
+ "vpn": {
5480
+ "provider": "nordvpn",
5481
+ "confidence": "high",
5482
+ "method": "rdns",
5483
+ "last_seen": "2026-09-01"
5484
+ },
5485
+ "hosting": {
5486
+ "provider": "ovh",
5487
+ "confidence": "medium",
5488
+ "last_seen": "2026-09-01"
5489
+ },
5490
+ "relay": {},
5491
+ "tor": {},
5492
+ "cdn": {},
5493
+ "resproxy": {
5494
+ "provider": "brightdata",
5495
+ "first_seen": "2026-06-01",
5496
+ "last_seen": "2026-09-01",
5497
+ "hits": 7,
5498
+ "hits_days_pct": 42,
5499
+ "providers_num": 2
5500
+ },
5501
+ "dcproxy": {},
5502
+ "mobproxy": {},
5503
+ "is_pubproxy": true,
5504
+ "pubproxy": {
5505
+ "entry": true,
5506
+ "exit": false,
5507
+ "protocols": [
5508
+ "socks5"
5509
+ ],
5510
+ "num_ports": 1,
5511
+ "num_proxies": 0,
5512
+ "last_seen": "2026-10-17",
5513
+ "last_usable": "2026-10-16"
5514
+ }
5515
+ },
5516
+ "condition": {
5517
+ "is_pubproxy": true,
5518
+ "pubproxy": {
5519
+ "entry": true
5520
+ }
5521
+ },
5522
+ "expect": {
5523
+ "blocked": true,
5524
+ "missing": []
5525
+ }
5526
+ },
5527
+ {
5528
+ "name": "pubproxy-detail-term-misses",
5529
+ "why": "A nested term that disagrees with the served detail does not block.",
5530
+ "body": {
5531
+ "ip": "45.83.91.1",
5532
+ "is_vpn": true,
5533
+ "is_hosting": true,
5534
+ "is_relay": false,
5535
+ "is_tor": false,
5536
+ "is_cdn": false,
5537
+ "is_resproxy": true,
5538
+ "is_dcproxy": false,
5539
+ "is_mobproxy": false,
5540
+ "vpn": {
5541
+ "provider": "nordvpn",
5542
+ "confidence": "high",
5543
+ "method": "rdns",
5544
+ "last_seen": "2026-09-01"
5545
+ },
5546
+ "hosting": {
5547
+ "provider": "ovh",
5548
+ "confidence": "medium",
5549
+ "last_seen": "2026-09-01"
5550
+ },
5551
+ "relay": {},
5552
+ "tor": {},
5553
+ "cdn": {},
5554
+ "resproxy": {
5555
+ "provider": "brightdata",
5556
+ "first_seen": "2026-06-01",
5557
+ "last_seen": "2026-09-01",
5558
+ "hits": 7,
5559
+ "hits_days_pct": 42,
5560
+ "providers_num": 2
5561
+ },
5562
+ "dcproxy": {},
5563
+ "mobproxy": {},
5564
+ "is_pubproxy": true,
5565
+ "pubproxy": {
5566
+ "entry": true,
5567
+ "exit": false,
5568
+ "protocols": [
5569
+ "socks5"
5570
+ ],
5571
+ "num_ports": 1,
5572
+ "num_proxies": 0,
5573
+ "last_seen": "2026-10-17",
5574
+ "last_usable": "2026-10-16"
5575
+ }
5576
+ },
5577
+ "condition": {
5578
+ "pubproxy": {
5579
+ "exit": true
5580
+ }
5581
+ },
5582
+ "expect": {
5583
+ "blocked": false,
5584
+ "missing": []
5585
+ }
5427
5586
  }
5428
5587
  ],
5429
5588
  "invalidConditions": [