Give this API a hostname or IP address and it tries connecting to each port in your reques
Give this API a hostname or IP address and it tries connecting to each port in your requested range. For every port that answers it reports whether it is open or blocked, which service is likely running there (a web server, SSH), and what software version was detected. Saves you installing network tools, parsing command-line output, or writing socket loops. Only scan hosts you own or have permission to scan - this tool does not check that for you.
10000 (raw units)
price
5
calls / 30d
3
unique payers
2026-09-14
updated
Provider
port-scanner.underscoredone.com · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "10000",
"maxTimeoutSeconds": 300
},
{
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"payTo": "8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b",
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"amount": "10000",
"maxTimeoutSeconds": 300
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"body": {
"ports": "1-1000",
"scan_type": "tcp_connect",
"target": "scanme.nmap.org",
"timeout": 30
},
"bodyType": "json",
"method": "POST",
"type": "http"
},
"output": {
"example": {
"api_version": "1.0.0",
"closed_or_filtered_count": 998,
"complete": true,
"duration_ms": 4521,
"open_ports": [
{
"port": 22,
"protocol": "tcp",
"service": "ssh",
"state": "open",
"version": "OpenSSH 8.2p1"
},
{
"port": 80,
"protocol": "tcp",
"service": "http",
"state": "open",
"version": "Apache httpd 2.4.41"
}
],
"ports_requested": 1000,
"ports_scanned": 1000,
"resolved_ip": "45.33.32.156",
"scan_type": "tcp_connect",
"target": "scanme.nmap.org",
"warning": ""
},
"type": "json"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"ports": {
"description": "Which ports to check. Use a range like '1-1000', a comma-separated list like '22,80,443', or leave this out to automatically check the 1000 most commonly used ports.",
"type": "string"
},
"scan_type": {
"description": "How to probe each port. The only supported value right now is 'tcp_connect', which tries to open a full connection - the same way a browser or app would. Defaults to 'tcp_connect' if left out.",
"type": "string"
},
"target": {
"description": "The hostname (like 'example.com') or numeric IP address (like '93.184.216.34') you want to scan. Must be a real, reachable address.",
"type": "string"
},
"timeout": {
"description": "How many seconds the scan is allowed to run before giving up. Must be between 5 and 60. Defaults to 30 if left out.",
"type": "integer"
}
},
"required": [
"target"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST",
"PUT",
"PATCH"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"properties": {
"api_version": {
"type": "string"
},
"closed_or_filtered_count": {
"type": "integer"
},
"complete": {
"type": "boolean"
},
"duration_ms": {
"type": "integer"
},
"open_ports": {
"items": {
"type": "object"
},
"type": "array"
},
"ports_requested": {
"type": "integer"
},
"ports_scanned": {
"type": "integer"
},
"resolved_ip": {
"type": "string"
},
"scan_type": {
"type": "string"
},
"target": {
"type": "string"
},
"warning": {
"type": "string"
}
},
"required": [
"api_version",
"target",
"resolved_ip",
"scan_type",
"duration_ms",
"complete",
"ports_requested",
"ports_scanned",
"open_ports",
"closed_or_filtered_count",
"warning"
],
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
}
}Use it
curl
curl "https://port-scanner.underscoredone.com/scan" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://port-scanner.underscoredone.com/scan");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://port-scanner.underscoredone.com/scan")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/3393.json, and this resource appears in /discovery/resources and /discovery/search.