OpenAPI 3.1.0 · IPBGP Public API v2.1.0

API reference

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

For AI agents

Copy one complete prompt into your coding agent. The machine files below are the same public contract this page renders, so an agent can read them instead of scraping HTML.

Download ipbgp-agent.md

Authentication

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

Operations listed as Anonymous take no API key; they run under their own abuse, captcha and quota controls.

header
Authorization: Bearer ipbgp_live_xxx

Create and manage API keys in your dashboard →

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

Quickstart

Every call below is keyed — send your API key as a Bearer token, or the API answers 401. The root self-check classifies only the public IP making the request, so use the single-IP endpoint for any other address.

curl
# 1. Self-check: classify the public IP making this request
curl https://www.ipbgp.org \
  -H "Authorization: Bearer ipbgp_live_xxx"

# 2. Classify any other IPv4 or IPv6 address
curl https://www.ipbgp.org/v1/ip/8.8.8.8 \
  -H "Authorization: Bearer ipbgp_live_xxx"

# 3. Classify the authenticated caller IP
curl https://www.ipbgp.org/v1/me \
  -H "Authorization: Bearer ipbgp_live_xxx"

# 4. Bulk lookup
curl -X POST https://www.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"]}'

Look up a single IP in your language of choice:

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

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"
  }
}
StatusMeaning
400Malformed request (e.g. invalid IP)
401Missing or invalid API key
402Payment required
403Key scope insufficient for this endpoint
404Not found
413Bulk request too large
429Rate limit / quota exceeded. See Retry-After header.
500Internal error
501Not implemented
502Bad gateway
503Service unavailable
504Upstream timed out

Endpoints

GET/

Classify the caller IP

Classifies the address the request arrives from. A deployment may also name a customer-website URL for interactive browsers. When it does, a browser navigation to this path on the customer API host answers 302 to that absolute https URL before API-key authentication and without classifying the caller, so an unauthenticated browser is sent to the website instead of being answered 401. A browser navigation is a request whose Accept lists text/html and does not list application/json, whose User-Agent is a browser or whose Sec-Fetch-Mode is navigate, and whose User-Agent is not a known command-line client. Every other caller (curl, Accept: application/json, API clients) and every deployment that names no URL get the operation exactly as if the redirect did not exist.

Authentication: API key Bearer

Responses
200IpResultCustomer-safe IP result302Interactive browser navigation sent to the deployment's configured customer website. Answered only when the deployment configures the redirect; it needs no API key and performs no classification.400ErrorClosed customer error envelope401ErrorClosed customer error envelope402ErrorClosed customer error envelope403ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/ip/{ip}

Classify one IP address

Authentication: API key Bearer

Parameters
  • in
Responses
200IpResultCustomer-safe IP result400ErrorClosed customer error envelope401ErrorClosed customer error envelope402ErrorClosed customer error envelope403ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/me

Classify the authenticated caller IP

Authentication: API key Bearer

Responses
200IpResultCustomer-safe IP result400ErrorClosed customer error envelope401ErrorClosed customer error envelope402ErrorClosed customer error envelope403ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
POST/v1/ip/bulk

Classify a bounded list of IP addresses

Authentication: API key Bearer

Request body: BulkRequest

Responses
200BulkResponseOrdered bulk result400ErrorClosed customer error envelope401ErrorClosed customer error envelope402ErrorClosed customer error envelope403ErrorClosed customer error envelope404ErrorClosed customer error envelope413ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/asn/{asn}

Resolve a customer-safe ASN profile

Authentication: API key Bearer

Parameters
  • asn in path · required
Responses
200AsnProfileCustomer-safe ASN profile400ErrorClosed customer error envelope401ErrorClosed customer error envelope402ErrorClosed customer error envelope403ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope501ErrorClosed customer error envelope502ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
POST/v1/chat

Anonymous product assistant

Authentication: Anonymous

Request body: ChatRequest

Responses
200ChatReplyAssistant response400ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope503ErrorClosed customer error envelope
POST/v1/leads

Submit an anonymous sales lead

Authentication: Anonymous

Request body: LeadInput

Responses
200OkAccepted400ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope
GET/v1/public/intel/hosts/{ip}

Anonymous host Intel preview

Authentication: Anonymous

Parameters
  • in
Responses
200PublicIntelHostResponseAnonymous host response; locked callers receive the narrow preview and previously unlocked callers receive the full customer-safe projection. This shared contract covers the internal handler's 500 failures and the edge-derived listener's 502/503/504 upstream failures.400ErrorClosed customer error envelope404ErrorClosed customer error envelope500ErrorClosed customer error envelope502ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
POST/v1/public/intel/hosts/{ip}/unlock

Consume an anonymous host-preview unlock

Authentication: Anonymous

Parameters
  • in

Request body: CaptchaInput

Responses
200PublicIntelHostUnlockedResponseFull customer-safe host projection after a successful unlock400ErrorClosed customer error envelope401ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope502ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/public/intel/pivot

Consume an anonymous pivot preview

Authentication: Anonymous

Parameters
  • seed in query · required
  • depth in query
  • nodes in query
  • fanout in query
  • X-Captcha-Token in header
Responses
200PublicIntelPivotResponseAnonymous pivot preview400ErrorClosed customer error envelope401ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope502ErrorClosed customer error envelope503ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/plans

List customer-safe public plan facts

Authentication: Anonymous

Responses
200PlanCatalogVersioned customer-safe public plan catalog404ErrorClosed customer error envelope503ErrorClosed customer error envelope
POST/v1/feedback

Report a disputed classification verdict

Anonymous, rate-limited intake for "this verdict is wrong about my address". The submission is queued for human review; 202 acknowledges the queue write only and promises no verdict change. The response never restates the current verdict, so the route cannot be used as an unmetered lookup oracle.

Authentication: Anonymous

Request body: VerdictFeedbackInput

Responses
202VerdictFeedbackReceiptFeedback queued for review400ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope504ErrorClosed customer error envelope
GET/v1/public/ip/{ip}

Anonymous IP verdict demo at every public API level

Human demo behind the marketing lookup page and the homepage terminal: the same customer-safe verdict narrowed to each public API level (summary / standard / advanced) so a visitor can see what each self-serve plan includes. Not a keyed integration surface: API keys use GET /v1/ip/{ip}. The route is anonymous; a caller who also sends a valid portal account token as `Authorization: Bearer` is metered on that account instead, and a missing, malformed or rejected account token is treated as anonymous, never as an error. Anonymous caller. Every target draws from the same per-visitor daily host budget as the anonymous Intel preview, the caller's own address included: the landing view is a real preview lookup (ipbgp-web site-design/lookup.md). What keeps it cheap is that the spend is keyed on the target address, so reloading the page, and the homepage terminal asking for that same address, stay inside the one charge; a target already unlocked today is not charged again. Past the daily allowance the answer is 429 captcha_required; the same request with `X-Captcha-Token` verified for action `intel_unlock` spends the visitor's unlock allowance, and past that the answer is 401 login_required. Signed-in caller. The client IP is never consulted and the anonymous visitor budget is never charged, in either branch below. Signed-in account without an active paid plan: each new target spends one unit of the account's own daily preview allowance, the same bucket and the same per-target key as GET /v1/account/intel/hosts/{ip}, so one target costs one unit across both routes. When that allowance is spent the answer is 429 captcha_required; the same request with `X-Captcha-Token` verified for action `intel_unlock` spends one unit of the account's own daily unlock allowance and is served; when that is spent too the answer is 429 quota_exceeded, and the page offers 账户查询 or an upgrade. Signed-in account on an active paid plan: there is no daily allowance and `preview.unlocks_remaining` is omitted. The account's lookups share one per-account volume window with the paid B-plane host and list routes of the intel-submission facet, counted as distinct lookups: a target IP counts once per window, whichever of those routes asks for it. Past the window's limit the answer is 429 captcha_required; the same request with `X-Captcha-Token` verified for action `intel_volume` is served, and the account's count for the current window starts again from that lookup. The window and limit are deployment configuration, not a published number, and a deployment may disable the gate. An `X-Captcha-Token` that fails verification answers 400 invalid_captcha and an unavailable verifier answers 503 captcha_unavailable; a daily allowance that cannot be read answers 503 quota_unavailable.

Authentication: Anonymous

Parameters
  • in
  • X-Captcha-Token in header — Turnstile token, sent on the retry after a 429 captcha_required. Action `intel_unlock` for an anonymous caller and for a signed-in account without an active paid plan; action `intel_volume` for a signed-in account on an active paid plan that is over its volume window.
Responses
200PublicIpDemoResponseThe same customer-safe verdict at each public API level400ErrorClosed customer error envelope401ErrorClosed customer error envelope404ErrorClosed customer error envelope429ErrorClosed customer error envelope500ErrorClosed customer error envelope503ErrorClosed customer error envelope

Schemas

Error
FieldTypeDescription
error*object
IpResult
FieldTypeDescription
ip*string
version*string
classification*Classification
trust*Trust
networkNetwork
anonymizationAnonymization
geographyGeography
abuseAbuse
contactsContacts
activityActivity
historyHistory
hostnamestring
registry*Registry
risks*string[]
meta*Meta
Classification
FieldTypeDescription
connection_type*residential | business | hosting | mobile | datacenter | education | government | satellite | unknown
is_residential*boolean
is_hosting*boolean
is_mobile*boolean
is_datacenter*boolean
is_cgnat*boolean
type_confidence*integer
Trust
FieldTypeDescription
score*integer
risk_score*integer
recommendation*allow | review | block
residential_probability*number
confidence*integer
reasonsReason[]
risk_factorsRiskFactor[]
Reason
FieldTypeDescription
code*string
category*network | measurement | reputation | location | history
impact*positive | negative | neutral
detail*string
RiskFactor
FieldTypeDescription
code*string
category*anonymization | reputation | infrastructure | structural
severity*low | medium | high
detail*string
Network
FieldTypeDescription
asn*integer
asn_namestring
as_type*string
customer_cone_size*integer
upstream_asnsinteger[]
prefix_upstream_asnsinteger[]
prefix_upstream_regionsRegionUpstream[]
prefixstring
prefix_sizeinteger
prefix_stabilitystring
rpki_valid*boolean | string
aspa_status*valid | invalid | unknown
label_scoresobject
irrstring
origin_consistencystring
alternate_originsinteger[]
usage_tagsstring[]
recently_allocated*boolean
is_anycast*boolean
anycastAnycast
leasingLeasing
carrierCarrier
ipv6_iidstring
RegionUpstream
FieldTypeDescription
vantage*string
continentstring
upstreams*integer[]
Anycast
FieldTypeDescription
is_anycast*boolean
suspectedboolean
confidence*integer
instance_countinteger
methodslatency | path_divergence | routing | known[]
Leasing
FieldTypeDescription
leased*boolean
leased_fromstring
holder_orgstring
confidencenumber
Carrier
FieldTypeDescription
namestring
country_codestring
mccstring
mncstring
Anonymization
FieldTypeDescription
is_proxy*boolean
is_vpn*boolean
is_tor*boolean
is_relay*boolean
is_residential_proxy*boolean
providerstring | null
Geography
FieldTypeDescription
country_codestring
countrystring
regionstring
citystring
postal_codestring
streetstring
address_precisionaddress | city | region | country | approximate
timezonestring
latitudenumber
longitudenumber
confidence*integer
confidence_radius_kmnumber
accuracy*rooftop | city | region | country | unannounced | anycast | unknown
methodstring
sourcegeofeed | irr | whois | registry
Abuse
FieldTypeDescription
is_abuser*boolean
abuse_score*integer
abuse_velocity*none | low | medium | high
threat_types*string[]
benign_scanner*boolean
Contacts
FieldTypeDescription
abuse*Contact
nocContact
salesContact
Contact
FieldTypeDescription
emailstring
phonestring
websitestring
Activity
FieldTypeDescription
open_proxy*boolean
tor_exit*boolean
scanned*boolean
last_seenstring
open_portsinteger[]
tls_certstring
History
FieldTypeDescription
available*boolean
first_seenstring
last_seenstring
observation_count*integer
asn_stability*number
geo_stability*number
stability*string
ever_hosting*boolean
Registry
FieldTypeDescription
status*allocated | unallocated | reserved | unknown
rirstring
reservationstring
Meta
FieldTypeDescription
query_time*string
data_epochstring
freshnessfresh | recent | stale
BulkRequest
FieldTypeDescription
ips*string[]
BulkResponse
FieldTypeDescription
results*IpResult[]
AsnProfile
FieldTypeDescription
asn*integer
version*string
asn_namestring
as_type*string
residential_prior*number
usage_tags*string[]
confidence*integer
topologyAsnTopology
AsnTopology
FieldTypeDescription
customer_cone_size*integer
originated_prefixes*integer
upstreamsinteger[]
sample_customersinteger[]
truncatedboolean
ChatRequest
FieldTypeDescription
messages*ChatMessage[]
session_idstring
localestring
challenge_tokenstringToken supplied only after a chat abuse rule requests a challenge.
ChatMessage
FieldTypeDescription
role*user | assistant
content*string
ChatReply
FieldTypeDescription
reply*string
sourcesChatSource[]
mode*generated | fallback | unavailable
locale*string
challengeChatChallenge
handoffChatHandoff
ChatSource
FieldTypeDescription
title*string
url*string
ChatChallenge
FieldTypeDescription
required*boolean
provider*turnstileChallenge provider identity; never the identity of a model or content provider.
action*string
ChatHandoff
FieldTypeDescription
suggested*boolean
reason*string
LeadInput
FieldTypeDescription
email*string
namestring
messagestring
companystring
use_casestring
transcriptChatMessage[]Supplying a transcript requires explicit consent=true at runtime.
consentbooleanMust be true when transcript is present; enforced by the lead runtime.
captcha_tokenstringTurnstile token for action sales_lead (Web site-design/pricing.md: captcha on every questionnaire submit). Deployments with a captcha verifier require and verify it; it grants nothing else.
PlanCatalog
FieldTypeDescription
revision*string
plans*PlanFact[]
PlanFact
FieldTypeDescription
tier*free | pro | business | enterprise
public_name*Free | Pro | Business | Enterprise
api_level*Summary | Standard | Advanced
price_usd_monthlyinteger | nullOmitted or null for contact-only plans.
contact_only*boolean
public*boolean
capabilities*string[]
Ok
FieldTypeDescription
ok*boolean
VerdictFeedbackInput
FieldTypeDescription
subject*stringIP address the disputed verdict was about.
predicted*residential | business | hosting | mobile | datacenter | education | government | satellite | unknownClassification the caller received. Same closed set as the classification connection type.
corrected*residential | business | hosting | mobile | datacenter | education | government | satellite | unknownClassification the caller believes is right. Same closed set as the classification connection type.
notestring
contactstringOptional reply address; supplying it is consent to be contacted about this report.
challenge_tokenstringOptional captcha challenge token. Spending a valid one buys a single extra submission past the per-IP rate limit after a 429; it grants no other authority and is never required.
VerdictFeedbackReceipt
FieldTypeDescription
ok*boolean
id*stringOpaque receipt id for this report; carries no verdict facts.
CaptchaInput
FieldTypeDescription
captcha_tokenstring
PublicIntelPreview
FieldTypeDescription
mode*string
lockedboolean
captcha_requiredboolean
login_requiredboolean
unlocks_remaininginteger
pivot_remaininginteger
active_checks_remaininginteger
messagestring
PublicIpDemoResponse
FieldTypeDescription
ip*string
levels*PublicIpDemoLevels
preview*UnlockedPublicIntelPreview
PublicIpDemoLevels
FieldTypeDescription
summary*IpResult
standard*IpResult
advanced*IpResult
PublicIntelHostResponse
FieldTypeDescription
PublicIntelHostLockedResponse
FieldTypeDescription
available*boolean
hostPublicHostPreview
preview*LockedPublicIntelPreview
PublicIntelHostUnlockedResponse
FieldTypeDescription
available*boolean
hostPublicHostExposure
preview*UnlockedPublicIntelPreview
PublicHostPreview
FieldTypeDescription
ip*string
open_portsinteger[]
score*number
labelsstring[]
observed_atstring
PublicHostExposure
FieldTypeDescription
ip*string
os_contextOSContext
softwareSoftware[]
open_portsinteger[]
servicesService[]
web_propertiesWebProperty[]
vulnsVulnerability[]
threatsThreat[]
certCertificateHealth
networkNetwork
geographyGeography
trust_contextTrustContext
ai_summaryAISummary
score*number
labelsstring[]
observed_atstring
OSContext
FieldTypeDescription
family*Linux-like | Windows-like | BSD-like | network-device-like | embedded-device-like | unknown
confidence*number
middlebox_affected*boolean
Software
FieldTypeDescription
product*string
versionstring
portinteger
Service
FieldTypeDescription
port*integer
transport_protostring
service_namestring
softwarestring[]
labelsstring[]
observed_atstring
WebProperty
FieldTypeDescription
fqdn*string
served*boolean
resolves_to*boolean
fcrdns*boolean
portinteger
titlestring
labelsstring[]
Vulnerability
FieldTypeDescription
cve*string
cpestring
severitystring
cvss_versionstring
cvssnumber
epssnumber
epss_percentilenumber
kev*boolean
kev_date_addedstring
exploit_maturitystring
ssvcstring
portinteger
confirmationstring
confidenceinteger
observed_atstring
Threat
FieldTypeDescription
familystring
actorstring
tacticstring
threat_typestring
confidenceinteger
observed_atstring
CertificateHealth
FieldTypeDescription
browser_trusted*boolean
ever_valid*boolean
revoked*boolean
zlint_clean*boolean
ever_seen_in_scanstring
reuse_countinteger
TrustContext
FieldTypeDescription
classificationstring
residential_prob*number
anonymizationstring[]
AISummary
FieldTypeDescription
textstring
rolestring
generated_atstring
LockedPublicIntelPreview
FieldTypeDescription
mode*string
locked*boolean
captcha_requiredboolean
login_requiredboolean
unlocks_remaininginteger
pivot_remaininginteger
active_checks_remaininginteger
messagestring
UnlockedPublicIntelPreview
FieldTypeDescription
mode*string
captcha_requiredboolean
login_requiredboolean
unlocks_remaininginteger
pivot_remaininginteger
active_checks_remaininginteger
messagestring
PublicIntelPivotResponse
FieldTypeDescription
graph*ExposureGraph
preview*PublicIntelPreview
ExposureGraph
FieldTypeDescription
nodesPivotNode[]
edgesPivotEdge[]
truncatedboolean
PivotNode
FieldTypeDescription
kind*string
value*string
raritynumber
PivotEdge
FieldTypeDescription
from*string
to*string
relation*string