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.
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"]}'
Rate limit / quota exceeded. See Retry-After header.
500
Internal error
501
Not implemented
502
Bad gateway
503
Service unavailable
504
Upstream 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
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.
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
Field
Type
Description
error*
object
IpResult
Field
Type
Description
ip*
string
version*
string
classification*
Classification
trust*
Trust
network
Network
anonymization
Anonymization
geography
Geography
abuse
Abuse
contacts
Contacts
activity
Activity
history
History
hostname
string
registry*
Registry
risks*
string[]
meta*
Meta
Classification
Field
Type
Description
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
Field
Type
Description
score*
integer
risk_score*
integer
recommendation*
allow | review | block
residential_probability*
number
confidence*
integer
reasons
Reason[]
risk_factors
RiskFactor[]
Reason
Field
Type
Description
code*
string
category*
network | measurement | reputation | location | history
rooftop | city | region | country | unannounced | anycast | unknown
method
string
source
geofeed | irr | whois | registry
Abuse
Field
Type
Description
is_abuser*
boolean
abuse_score*
integer
abuse_velocity*
none | low | medium | high
threat_types*
string[]
benign_scanner*
boolean
Contacts
Field
Type
Description
abuse*
Contact
noc
Contact
sales
Contact
Contact
Field
Type
Description
email
string
phone
string
website
string
Activity
Field
Type
Description
open_proxy*
boolean
tor_exit*
boolean
scanned*
boolean
last_seen
string
open_ports
integer[]
tls_cert
string
History
Field
Type
Description
available*
boolean
first_seen
string
last_seen
string
observation_count*
integer
asn_stability*
number
geo_stability*
number
stability*
string
ever_hosting*
boolean
Registry
Field
Type
Description
status*
allocated | unallocated | reserved | unknown
rir
string
reservation
string
Meta
Field
Type
Description
query_time*
string
data_epoch
string
freshness
fresh | recent | stale
BulkRequest
Field
Type
Description
ips*
string[]
BulkResponse
Field
Type
Description
results*
IpResult[]
AsnProfile
Field
Type
Description
asn*
integer
version*
string
asn_name
string
as_type*
string
residential_prior*
number
usage_tags*
string[]
confidence*
integer
topology
AsnTopology
AsnTopology
Field
Type
Description
customer_cone_size*
integer
originated_prefixes*
integer
upstreams
integer[]
sample_customers
integer[]
truncated
boolean
ChatRequest
Field
Type
Description
messages*
ChatMessage[]
session_id
string
locale
string
challenge_token
string
Token supplied only after a chat abuse rule requests a challenge.
ChatMessage
Field
Type
Description
role*
user | assistant
content*
string
ChatReply
Field
Type
Description
reply*
string
sources
ChatSource[]
mode*
generated | fallback | unavailable
locale*
string
challenge
ChatChallenge
handoff
ChatHandoff
ChatSource
Field
Type
Description
title*
string
url*
string
ChatChallenge
Field
Type
Description
required*
boolean
provider*
turnstile
Challenge provider identity; never the identity of a model or content provider.
action*
string
ChatHandoff
Field
Type
Description
suggested*
boolean
reason*
string
LeadInput
Field
Type
Description
email*
string
name
string
message
string
company
string
use_case
string
transcript
ChatMessage[]
Supplying a transcript requires explicit consent=true at runtime.
consent
boolean
Must be true when transcript is present; enforced by the lead runtime.
captcha_token
string
Turnstile 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
Field
Type
Description
revision*
string
plans*
PlanFact[]
PlanFact
Field
Type
Description
tier*
free | pro | business | enterprise
public_name*
Free | Pro | Business | Enterprise
api_level*
Summary | Standard | Advanced
price_usd_monthly
integer | null
Omitted or null for contact-only plans.
contact_only*
boolean
public*
boolean
capabilities*
string[]
Ok
Field
Type
Description
ok*
boolean
VerdictFeedbackInput
Field
Type
Description
subject*
string
IP address the disputed verdict was about.
predicted*
residential | business | hosting | mobile | datacenter | education | government | satellite | unknown
Classification the caller received. Same closed set as the classification connection type.
corrected*
residential | business | hosting | mobile | datacenter | education | government | satellite | unknown
Classification the caller believes is right. Same closed set as the classification connection type.
note
string
contact
string
Optional reply address; supplying it is consent to be contacted about this report.
challenge_token
string
Optional 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
Field
Type
Description
ok*
boolean
id*
string
Opaque receipt id for this report; carries no verdict facts.