OpenAPI 3.1.0 · ipbgp v1

API reference

IP trust / connection-type intelligence. For any IPv4/IPv6 address we return a classification, a trust score, and human-readable evidence — computed from our own data and our own detection nodes. Differentiators: trust.reasons (signed, neutral, explainable evidence), network (BGP/AS judgement) and activity (our own active measurement).

Rendered directly from the public OpenAPI contract — this page can't drift from the live API.

Authentication

Authenticate every request with a Bearer token — your customer API key. Keys are issued and managed in your dashboard.

header
Authorization: Bearer ipbgp_live_xxx

Responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers.

Quickstart

Look up a single IP in your language of choice:

curl https://ipbgp.org/v1/ip/8.8.8.8 \
  -H "Authorization: Bearer ipbgp_live_xxx"

More endpoints with curl:

curl
# 1. Look up a single IP (full verdict)
curl https://ipbgp.org/v1/ip/8.8.8.8 \
  -H "Authorization: Bearer ipbgp_live_xxx"

# 2. Score your own caller IP
curl https://ipbgp.org/v1/me \
  -H "Authorization: Bearer ipbgp_live_xxx"

# 3. Bulk lookup
curl -X POST https://ipbgp.org/v1/ip/bulk \
  -H "Authorization: Bearer ipbgp_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"ips":["8.8.8.8","1.1.1.1"]}'

Errors & rate limiting

Non-2xx responses use a uniform JSON body. On 429 a Retry-After header tells you when to retry.

error body
{
  "error": {
    "code": "rate_limited",
    "message": "Quota exceeded"
  }
}
400Malformed request (e.g. invalid IP)
401Missing or invalid API key
403Key scope insufficient for this endpoint
413Bulk request too large
429Rate limit / quota exceeded — see Retry-After
500Internal error
504Upstream timed out

Endpoints

GET/v1/ip/{ip}

Full single-IP verdict (classification + trust + evidence + network…)

Parameters
  • ip in path · requiredTarget IPv4 / IPv6 address.
Responses
200IpResultVerdict (fields projected to your plan's field depth).400401403429
GET/v1/me

Verdict for the caller's own source IP

Responses
200IpResultVerdict for the caller IP.401429
POST/v1/ip/bulk

Batch IP verdicts (ordered to match the request)

Request body: BulkRequest

Responses
200BulkResponseVerdict array, in the same order as the requested ips.400401413429
GET/v1/asn/{asn}

ASN profile (operator identity + residential prior)

Parameters
  • asn in path · requiredASN, accepts "AS15169" or "15169".
Responses
200AsnProfileASN profile.400401

Schemas

IpResult
FieldTypeDescription
ip*string
version*string
classification*Classification
trust*Trust
networkNetwork
anonymizationAnonymization
geographyGeography
abuseAbuse
activityActivity
contactsContacts
risks*string[]residential_proxy|hosting_ip|malware_c2|serves_tls|geoip_mismatch|…
meta*Meta
Classification
FieldTypeDescription
connection_type*residential | business | hosting | mobile | datacenter | satellite | unknown
is_residential*boolean
is_hosting*boolean
is_mobile*boolean
is_datacenter*boolean
type_confidence*integer
Trust
FieldTypeDescription
score*integer0–100 overall trust / real-user likelihood
residential_probability*number
confidence*integer
reasonsReason[]Explainable, neutral evidence. Standard tier and above.
Reason
FieldTypeDescription
code*stringNeutral reason code, e.g. residential_access_network
category*prior | network | measurement | reputation | geo | consistency | temporal
impact*positive | negative | neutral
detail*stringHuman-readable, English, no source names
Network
FieldTypeDescription
asn*integer
asn_namestring
as_type*eyeball_isp | hosting | content | transit | enterprise | unknown
customer_cone_sizeinteger
upstream_asnsinteger[]ASN-level upstream provider ASNs (inferred AS relationships)
prefix_upstream_asnsinteger[]this prefix's observed upstreams worldwide (anycast/multihomed → many)
prefix_upstream_regionsobject[]upstreams grouped by observing-vantage (BGP collector) location — anycast differs by region
prefixstring
prefix_sizeinteger
prefix_stabilitystable | churny | recently_allocated
rpki_validboolean | stringtrue|false|"unknown"
usage_tagsstring[]Neutral usage tags (e.g. residential, mobile).
recently_allocatedboolean
is_anycastboolean
origin_rov_enforcedbooleanOrigin AS deploys RPKI Route Origin Validation route filtering (route-hygiene trust signal).
leasingLeasing
carrierobjectmobile carrier identity (cellular IPs only) — public ITU/operator facts, no source names
ipv6_iideui64 | privacy_random | static_low_byte | embedded_ipv4 | unknownStructural class of the queried IPv6 address's interface identifier (low 64 bits) — pure address structure (residential vs infrastructure hint). Absent for IPv4.
Leasing
FieldTypeDescription
leased*boolean
leased_fromstring | null
holder_orgstring | null
confidenceinteger
Anonymization
FieldTypeDescription
is_proxy*boolean
is_vpn*boolean
is_tor*boolean
is_relay*boolean
is_residential_proxy*booleanResidential proxy exit node — core differentiator
providerstring | null
Geography
FieldTypeDescription
country_codestring
countrystring
regionstring
citystring
postal_codestringPostal code from the geofeed/IRR declared address, surfaced whenever the declaration is country-accurate (independent registry/BGP country not contradicting). Read address_precision for how precise it is.
streetstringStreet + house number from the geofeed/IRR declared address, surfaced whenever the declaration is country-accurate. Read address_precision for how precise it is.
address_precisionaddress | city | region | countryHonest precision level of the surfaced street/postal — the value is given at its finest, the precision is stated plainly.
timezonestringIANA timezone name (e.g. America/Los_Angeles), derived from country + coordinates.
latitudenumber
longitudenumber
confidence*integer
confidence_radius_kmintegerLarger radius = less certain
methodstringregistry_geoloc|geofeed|measurement|measurement_corrected|rdns|database
registered_addressRegisteredAddress
RegisteredAddress
FieldTypeDescription
streetstringStreet + house number (highest precision text)
citystring
regionstring
postal_codestring
country_codestring
countrystring
precision*address | city | region | countryGranularity of this declared address text.
verified*booleanWhether cross-source checks corroborate the declared locality.
approximate*booleantrue = an org/registry-level address (the organisation's HQ, shared across the whole block — NOT this IP's precise location). Returned only as a lowest-priority fallback when no more-precise source (per-prefix geofeed / IP database / IRR) located the IP. Treat as an imprecise result, never as the endpoint location.
sourcegeofeed | whois | irr | rdap | registryPublic registry channel (never a data-vendor name).
block_shared*booleanThe address is derived per-prefix and shared across the whole block_prefix (not per-host).
block_prefixstringThe covering prefix that shares this declared address.
Abuse
FieldTypeDescription
is_abuser*boolean
abuse_score*integer
abuse_velocity*none | low | medium | high
benign_scannerbooleanknown legitimate scanner/research probe (security/academic
categoriesstring[]Our own categories when flagged, e.g. malware_c2, dynamic_pool. No source names.
Activity
FieldTypeDescription
open_proxy*booleanConfirmed open HTTP CONNECT / SOCKS proxy
tor_exit*boolean
scanned*boolean
last_seenstring | nullDate granularity (not a precise timestamp)
Contacts
FieldTypeDescription
abuseContactChannel
nocContactChannel
salesContactChannel
ContactChannel
FieldTypeDescription
emailstring | null
phonestring | null
websitestring | null
Meta
FieldTypeDescription
query_time*string
data_epochstringOur snapshot epoch (a single date, not per-source timestamps)
freshnessfresh | recent | stale
AsnProfile
FieldTypeDescription
asn*integer
version*string
asn_namestring
as_type*eyeball_isp | hosting | content | transit | enterprise | unknown
residential_prior*number
tags*string[]
confidence*integer
meta*object
BulkRequest
FieldTypeDescription
ips*string[]
BulkResponse
FieldTypeDescription
results*IpResult[]
ErrorBody
FieldTypeDescription
error*object