IP Detection

Bulk IP checks

Grade a list of addresses in one request, or stream results as they resolve.

Check a list

POST/v1/bulk/check
API key

Parameters

  • ipsstring[]

    Addresses, optionally with a port. Send this or input.

  • inputstring

    Pasted text; the server finds the addresses in it.

Response fields

  • submittedinteger

    Items received.

  • uniqueinteger

    Distinct addresses checked.

  • duplicatesinteger

    Addresses sent more than once.

  • invalidstring[]

    Inputs that were not usable addresses.

  • summaryobject

    Count of results per grade and verdict. Starter and above; empty on Free.

  • planRequiredstring

    Plan that includes the locked fields. Absent on Starter and above.

  • results[].ipstring

    IP address that was checked.

  • results[].portinteger

    Port from the input, when there was one.

  • results[].scoreinteger | null

    Cleanliness score from 0 to 100. Starter and above; null on Free.

  • results[].gradestring | null

    S+, S, A, B or C. Starter and above; null on Free.

  • results[].verdictstring | null

    clean, suspect or dirty. Starter and above; null on Free.

  • results[].classificationstring

    residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.

  • results[].confidencenumber

    Confidence from 0 to 1.

  • results[].anonymizedboolean

    True when the network hides the person behind it. Hosting counts, except known infrastructure.

  • results[].vpnProviderstring | null

    VPN service on a vpn address (NordVPN, Mullvad...), when known. Starter and above; null on Free.

  • results[].isTorExitboolean

    True for Tor exit nodes.

  • results[].inVpnRangeboolean

    True when the IP is in a known VPN range.

  • results[].inDatacenterRangeboolean

    True when the IP is in a known datacenter range.

  • results[].deductionsarray | null

    Points taken off the score, each with a reason. Starter and above; null on Free.

  • results[].lockedstring[]

    Fields of this row sent as null on this plan. Absent on Starter and above.

curl -X POST https://ipscanner.io/v1/bulk/check \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ips":["185.220.101.1","24.48.0.1:8080"]}'
Response
{
  "submitted": 2,
  "unique": 2,
  "duplicates": 0,
  "invalid": [],
  "summary": {
    "clean": 1,
    "dirty": 1
  },
  "results": [
    {
      "input": "185.220.101.1",
      "ip": "185.220.101.1",
      "score": 0,
      "grade": "C",
      "verdict": "dirty",
      "classification": "tor",
      "confidence": 0.95,
      "anonymized": true,
      "vpnProvider": null,
      "isTorExit": true,
      "inVpnRange": false,
      "inDatacenterRange": false,
      "asn": "AS60729",
      "asnName": "Stiftung Erneuerbare Freiheit",
      "country": "DE",
      "deductions": [
        {
          "factor": "network_origin",
          "points": 98,
          "detail": "tor at high confidence"
        }
      ]
    },
    {
      "input": "24.48.0.1:8080",
      "ip": "24.48.0.1",
      "port": 8080,
      "score": 88,
      "grade": "S",
      "verdict": "clean",
      "classification": "residential_clean",
      "confidence": 0.3,
      "anonymized": false,
      "vpnProvider": null,
      "isTorExit": false,
      "inVpnRange": false,
      "inDatacenterRange": false,
      "asn": "AS5769",
      "asnName": "VIDEOTRON",
      "country": "CA",
      "deductions": [
        {
          "factor": "no_corroboration",
          "points": 8,
          "detail": "no observation on record for this IP"
        }
      ]
    }
  ]
}

Stream a list

POST/v1/ip/bulk
API keyNDJSON

Parameters

  • ipsstring[]

    Addresses, optionally with a port. Send this or input.

  • inputstring

    Pasted text; the server finds the addresses in it.

Response fields

  • typestring

    meta, result, error or done.

  • indexinteger

    Position of the address in the deduplicated list, from 0.

  • ipstring

    IP address that was checked.

  • verdictstring | null

    clean, suspect or dirty. Starter and above; null on Free.

  • classificationstring

    residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.

  • scoreinteger | null

    Cleanliness score from 0 to 100. Starter and above; null on Free.

  • gradestring | null

    S+, S, A, B or C. Starter and above; null on Free.

  • vpnProviderstring | null

    VPN service on a vpn address, omitted when unknown. Starter and above; null on Free.

  • lockedstring[]

    Result lines: fields sent as null on this plan. Absent on Starter and above.

  • planRequiredstring

    Meta line: plan that includes the locked fields. Absent on Starter and above.

  • reasonstring

    On error: invalid_ip or reserved. On done: complete or quota_exceeded.

  • processedinteger

    On done: addresses checked.

  • failedinteger

    On done: addresses that could not be checked.

  • totalinteger

    On meta and done: unique addresses in the request.

curl -X POST -N https://ipscanner.io/v1/ip/bulk \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ips":["185.220.101.1","24.48.0.1","10.0.0.1"]}'
Response, one JSON object per line
{"type":"meta","total":3,"metered":3}
{"type":"result","ip":"185.220.101.1","verdict":"dirty","classification":"tor","confidence":0.95,"anonymized":true,"score":0,"grade":"C","isTorExit":true,"asn":"AS60729","country":"DE"}
{"type":"result","index":1,"ip":"24.48.0.1","verdict":"clean","classification":"residential_clean","confidence":0.3,"score":88,"grade":"S","asn":"AS5769","country":"CA"}
{"type":"error","index":2,"input":"10.0.0.1","reason":"reserved","message":"private address"}
{"type":"done","reason":"complete","total":3,"processed":2,"failed":1}