{"openapi":"3.1.0","info":{"title":"IP Intel","version":"1.0.0","description":"Pay-per-call IP intelligence backed by locally refreshed datasets. Unknown or unavailable source data is returned as null and explained in unavailable_fields. The risk score is a heuristic signal, not proof.","x-guidance":"POST /ip inspects a single IP address, POST /ip/batch inspects up to 200 addresses in one call. Both routes are paid per call over x402 on Base Mainnet in USDC. Call without a payment header first, read the 402 challenge from the JSON body or the PAYMENT-REQUIRED header, sign one entry of accepts with an x402 client and repeat the request with the PAYMENT-SIGNATURE header. /ip costs a fixed 0.001 USD. /ip/batch costs 0.0005 USD per submitted address with a 0.001 USD minimum charge, so the price is dynamic between 0.001 and 0.100 USD. The response returns ASN and operator, country and region, network type, Tor exit status, known VPN and proxy ranges, reverse DNS, open DNS blocklist hits and a heuristic risk score from 0 to 100. Unknown or unavailable source data is returned as null and explained in unavailable_fields. The risk score is a heuristic signal, not proof.","contact":{"name":"Die Netzhandwerker","url":"https://netzhandwerker.de","email":"info@netzhandwerker.de"}},"servers":[{"url":"https://ip.netzhandwerker.de"}],"tags":[{"name":"IP intelligence"}],"paths":{"/ip":{"post":{"operationId":"ip_lookup","summary":"Inspect one IP address for network ownership, location and abuse signals.","description":"Inspect one IP address for network ownership, location and abuse signals. Paid over x402 in USDC on Base Mainnet. Unknown or unavailable source data is returned as null and explained in unavailable_fields. The risk score is a heuristic signal, not proof.","tags":["IP intelligence"],"security":[{"x402":[]}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"x-x402-price":"0.001","x-x402-price-model":"per_request","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip"],"additionalProperties":false,"description":"Request body for a single lookup.","properties":{"ip":{"type":"string","description":"IPv4 or IPv6 address."}}}}}},"responses":{"200":{"description":"IP intelligence result with payment receipt.","content":{"application/json":{"schema":{"type":"object","description":"Intelligence record for the submitted address plus the payment receipt.","properties":{"ip":{"type":"string","description":"The inspected address as submitted."},"valid":{"type":"boolean","description":"False when the input was not a usable IP address."},"version":{"type":["integer","null"],"description":"IP version, 4 or 6."},"reserved":{"type":["boolean","null"],"description":"True for private, loopback or otherwise reserved ranges."},"reserved_type":{"type":["string","null"],"description":"Kind of reserved range when reserved is true."},"asn":{"type":["integer","null"],"description":"Autonomous system number."},"as_operator":{"type":["string","null"],"description":"Autonomous system operator."},"country":{"type":["string","null"],"description":"ISO 3166-1 alpha-2 country code."},"region":{"type":["string","null"],"description":"Region or state."},"network_type":{"type":["string","null"],"description":"datacenter, access or unknown."},"network_provider":{"type":["string","null"],"description":"Hosting or access provider when identified."},"network_evidence":{"type":"array","items":{"type":"string"},"description":"Why the network type was assigned."},"tor_exit":{"type":["boolean","null"],"description":"Listed in the cached Tor exit list. Null when the source is unavailable."},"known_vpn_or_proxy_range":{"type":["boolean","null"],"description":"Listed in the cached anonymous proxy range set."},"vpn_or_proxy_sources":{"type":"array","items":{"type":"string"},"description":"Sources that carry the address."},"reverse_dns":{"type":["string","null"],"description":"First PTR record."},"reverse_dns_status":{"type":["string","null"],"description":"found, not_found or unavailable."},"blocklists":{"type":"object","description":"Open DNS blocklist results.","properties":{"listed":{"type":["boolean","null"],"description":"Null when every list was unavailable."},"listed_on":{"type":"array","items":{"type":"string"}},"available_count":{"type":["integer","null"]},"checks":{"type":"array","items":{"type":"object"}}}},"risk_score":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Heuristic abuse and access risk signal."},"risk_label":{"type":["string","null"],"description":"low, moderate, elevated or high."},"score_meaning":{"type":["string","null"]},"risk_factors":{"type":"array","items":{"type":"object"},"description":"Codes and points that produced the score."},"source_status":{"type":"object","description":"Freshness and availability per dataset."},"unavailable_fields":{"type":"array","items":{"type":"object"},"description":"Fields left empty and why."},"cache":{"type":["string","null"],"description":"hit or miss."},"checked_at":{"type":["string","null"],"format":"date-time"},"cached_at":{"type":["string","null"],"format":"date-time"},"error":{"type":["string","null"],"description":"Set to ip_invalid when the address could not be parsed."},"payment":{"type":"object","description":"Settlement receipt for the paid call.","properties":{"endpoint":{"type":"string"},"payer_address":{"type":["string","null"]},"amount_usdc":{"type":"number"},"tx_hash":{"type":["string","null"]},"facilitator":{"type":["string","null"]},"verified":{"type":"boolean"},"channel":{"type":"string"}}}}}}}},"400":{"description":"Invalid request after a payment proof was supplied; payment is not settled.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"402":{"description":"Payment required. 0.001 USDC per request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentChallenge"}}}},"503":{"description":"A required service component is unavailable; payment is not settled.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ip/batch":{"post":{"operationId":"ip_lookup_batch","summary":"Inspect up to 200 IP addresses at 0.0005 USDC per address.","description":"Inspect up to 200 IP addresses at 0.0005 USDC per address. Paid over x402 in USDC on Base Mainnet. Unknown or unavailable source data is returned as null and explained in unavailable_fields. The risk score is a heuristic signal, not proof.","tags":["IP intelligence"],"security":[{"x402":[]}],"x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.001000","max":"0.100000"},"protocols":[{"x402":{}}]},"x-x402-price":"0.0005","x-x402-price-model":"per_address","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ips"],"additionalProperties":false,"description":"Request body for a batch lookup.","properties":{"ips":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"string","description":"IPv4 or IPv6 address."},"description":"Up to 200 IPv4 or IPv6 addresses."}}}}}},"responses":{"200":{"description":"IP intelligence result with payment receipt.","content":{"application/json":{"schema":{"type":"object","description":"Batch result with one record per submitted address and the payment receipt.","properties":{"requested":{"type":"integer","description":"Number of submitted addresses."},"valid":{"type":"integer","description":"Number of parseable addresses."},"invalid":{"type":"integer","description":"Number of unparseable addresses."},"results":{"type":"array","items":{"type":"object","description":"Intelligence record for one IP address. Unknown or unavailable source data is returned as null and explained in unavailable_fields. The risk score is a heuristic signal, not proof.","properties":{"ip":{"type":"string","description":"The inspected address as submitted."},"valid":{"type":"boolean","description":"False when the input was not a usable IP address."},"version":{"type":["integer","null"],"description":"IP version, 4 or 6."},"reserved":{"type":["boolean","null"],"description":"True for private, loopback or otherwise reserved ranges."},"reserved_type":{"type":["string","null"],"description":"Kind of reserved range when reserved is true."},"asn":{"type":["integer","null"],"description":"Autonomous system number."},"as_operator":{"type":["string","null"],"description":"Autonomous system operator."},"country":{"type":["string","null"],"description":"ISO 3166-1 alpha-2 country code."},"region":{"type":["string","null"],"description":"Region or state."},"network_type":{"type":["string","null"],"description":"datacenter, access or unknown."},"network_provider":{"type":["string","null"],"description":"Hosting or access provider when identified."},"network_evidence":{"type":"array","items":{"type":"string"},"description":"Why the network type was assigned."},"tor_exit":{"type":["boolean","null"],"description":"Listed in the cached Tor exit list. Null when the source is unavailable."},"known_vpn_or_proxy_range":{"type":["boolean","null"],"description":"Listed in the cached anonymous proxy range set."},"vpn_or_proxy_sources":{"type":"array","items":{"type":"string"},"description":"Sources that carry the address."},"reverse_dns":{"type":["string","null"],"description":"First PTR record."},"reverse_dns_status":{"type":["string","null"],"description":"found, not_found or unavailable."},"blocklists":{"type":"object","description":"Open DNS blocklist results.","properties":{"listed":{"type":["boolean","null"],"description":"Null when every list was unavailable."},"listed_on":{"type":"array","items":{"type":"string"}},"available_count":{"type":["integer","null"]},"checks":{"type":"array","items":{"type":"object"}}}},"risk_score":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Heuristic abuse and access risk signal."},"risk_label":{"type":["string","null"],"description":"low, moderate, elevated or high."},"score_meaning":{"type":["string","null"]},"risk_factors":{"type":"array","items":{"type":"object"},"description":"Codes and points that produced the score."},"source_status":{"type":"object","description":"Freshness and availability per dataset."},"unavailable_fields":{"type":"array","items":{"type":"object"},"description":"Fields left empty and why."},"cache":{"type":["string","null"],"description":"hit or miss."},"checked_at":{"type":["string","null"],"format":"date-time"},"cached_at":{"type":["string","null"],"format":"date-time"},"error":{"type":["string","null"],"description":"Set to ip_invalid when the address could not be parsed."}}}},"cache":{"type":"string","description":"hit or mixed_or_miss."},"payment":{"type":"object","description":"Settlement receipt for the paid call.","properties":{"endpoint":{"type":"string"},"payer_address":{"type":["string","null"]},"amount_usdc":{"type":"number"},"tx_hash":{"type":["string","null"]},"facilitator":{"type":["string","null"]},"verified":{"type":"boolean"},"channel":{"type":"string"}}}}}}}},"400":{"description":"Invalid request after a payment proof was supplied; payment is not settled.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"402":{"description":"Payment required. 0.0005 USDC per address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentChallenge"}}}},"503":{"description":"A required service component is unavailable; payment is not settled.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"components":{"schemas":{"PaymentChallenge":{"type":"object","description":"x402 version 2 payment challenge.","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"},"description":"Payment requirements. amount is in token atomic units."},"price":{"type":"object"},"payment_header":{"type":"string"},"instructions":{"type":"string"}}}},"securitySchemes":{"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"x402 V2 payment proof."}}}}