openapi: 3.1.0
info:
title: TCP Port Scanner
description: Give this API a hostname or IP address and it will try connecting to each port in your requested range. For
every port that answers, it tells you whether it is open or blocked, which service is likely running there (like a web
server or SSH), and what software version was detected. This saves you from installing network tools, parsing messy command-line
output, or writing socket loops yourself. Only scan hosts you own or have permission to scan — this tool does not check
that for you.
version: 1.0.0
contact:
name: _done
url: https://forms.gle/5KzuSFH7p8hHtDmz7
email: info@underscoredone.com
x-openapi-url: https://port-scanner.underscoredone.com/openapi.json
x-logo:
url: https://underscoredone.com/logo.png
altText: _done
x-guidance: POST a JSON body with 'target' (hostname or IP as a string) and optionally 'ports' (a range like '1-1000' or
a comma-separated list like '22,80,443'), 'scan_type' (only 'tcp_connect' is supported), and 'timeout' (whole number of
seconds, 5 to 60). The response includes an 'open_ports' array — each item has 'port', 'protocol', 'state', 'service',
and 'version'. Use 'ports_scanned' and 'closed_or_filtered_count' for summary stats. If the target cannot be reached or
resolved, you will receive a 400 error with a plain-English 'error' field. Never use this on hosts you do not own or have
explicit permission to scan.
x-ai-instructions: POST a JSON body with 'target' (hostname or IP as a string) and optionally 'ports' (a range like '1-1000'
or a comma-separated list like '22,80,443'), 'scan_type' (only 'tcp_connect' is supported), and 'timeout' (whole number
of seconds, 5 to 60). The response includes an 'open_ports' array — each item has 'port', 'protocol', 'state', 'service',
and 'version'. Use 'ports_scanned' and 'closed_or_filtered_count' for summary stats. If the target cannot be reached or
resolved, you will receive a 400 error with a plain-English 'error' field. Never use this on hosts you do not own or have
explicit permission to scan.
x-provider: _done — single-purpose utility APIs for developers and AI agents. Pay per call with USDC on Base Mainnet or
Solana Mainnet.
x-pricing:
model: pay-per-call
currency: USDC
network: Base Mainnet or Solana Mainnet
price: $0.01
x-keywords:
- network
- port
- scanner
- tcp
- open ports
- service detection
- nmap
- infrastructure
- security audit
- firewall check
- utility
- api
- ai-agent
- pay-per-call
- usdc
- x402
x-category: port scanner
x-provider-url: https://underscoredone.com
x-agentcash-auth:
mode: paid
x-402:
price: $0.01
network: eip155:8453
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
facilitator: https://api.cdp.coinbase.com/platform/v2/x402
scheme: exact
description: Give this API a hostname or IP address and it will try connecting to each port in your requested range. For
every port that answers, it tells you whether it is open or blocked, which service is likely running there (like a web
server or SSH), and what software version was detected. This saves you from installing network tools, parsing messy
command-line output, or writing socket loops yourself. Only scan hosts you own or have permission to scan — this tool
does not check that for you.
mime_type: application/json
networks:
- network: eip155:8453
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
- network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
pay_to: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
paths:
/scan:
post:
tags:
- port scanner
- port scan
- open ports
- tcp port scanner
- scan ports
- port
- open port check
- service detection
- network scanner
- port check
- host port scan
- security scan
- banner grab
- ssh port check
- nmap
summary: Check which ports on a host are open and what services are listening on them
description: Check which ports on a host are open and what services are listening on them.
operationId: scan_scan_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ScanRequest'
required: true
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ScanResponse'
examples:
success:
summary: Successful response
value:
api_version: 1.0.0
target: scanme.nmap.org
resolved_ip: 45.33.32.156
scan_type: tcp_connect
duration_ms: 4521
complete: true
ports_requested: 1000
ports_scanned: 1000
open_ports:
- port: 22
protocol: tcp
state: open
service: ssh
version: OpenSSH 8.2p1
- port: 80
protocol: tcp
state: open
service: http
version: Apache httpd 2.4.41
closed_or_filtered_count: 998
warning: null
'422':
description: Unprocessable — a required field is missing or the wrong type. Check the detail field for specifics.
content:
application/json:
schema:
type: object
properties:
detail:
type: array
'402':
description: Payment required. Send a signed USDC payment on Base Mainnet or Solana Mainnet using the x402 protocol.
headers:
X-Payment-Response:
description: x402 payment challenge — base64-encoded JSON with payment details.
schema:
type: string
'400':
description: Bad request — your input failed validation or could not be processed. Check the detail field for specifics.
content:
application/json:
schema:
type: object
properties:
detail:
type: string
x-ai-instructions: POST a JSON body with 'target' (hostname or IP as a string) and optionally 'ports' (a range like
'1-1000' or a comma-separated list like '22,80,443'), 'scan_type' (only 'tcp_connect' is supported), and 'timeout'
(whole number of seconds, 5 to 60). The response includes an 'open_ports' array — each item has 'port', 'protocol',
'state', 'service', and 'version'. Use 'ports_scanned' and 'closed_or_filtered_count' for summary stats. If the target
cannot be reached or resolved, you will receive a 400 error with a plain-English 'error' field. Never use this on
hosts you do not own or have explicit permission to scan.
x-guidance: POST a JSON body with 'target' (hostname or IP as a string) and optionally 'ports' (a range like '1-1000'
or a comma-separated list like '22,80,443'), 'scan_type' (only 'tcp_connect' is supported), and 'timeout' (whole number
of seconds, 5 to 60). The response includes an 'open_ports' array — each item has 'port', 'protocol', 'state', 'service',
and 'version'. Use 'ports_scanned' and 'closed_or_filtered_count' for summary stats. If the target cannot be reached
or resolved, you will receive a 400 error with a plain-English 'error' field. Never use this on hosts you do not own
or have explicit permission to scan.
x-payment-info:
price:
fixed:
mode: fixed
currency: USD
amount: '0.01'
protocols:
- x402: {}
components:
schemas:
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
OpenPort:
properties:
port:
type: integer
title: Port
description: The port number that is open.
protocol:
type: string
title: Protocol
description: The network protocol used (always 'tcp' for this scan type).
state:
type: string
title: State
description: Whether the port is 'open', 'closed', or 'filtered'.
service:
type: string
title: Service
description: The name of the service most likely running on this port, like 'ssh' or 'http'.
version:
anyOf:
- type: string
- type: 'null'
title: Version
description: The software version detected on this port, if any. May be empty if not detectable.
type: object
required:
- port
- protocol
- state
- service
title: OpenPort
ScanRequest:
properties:
target:
type: string
title: 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.
ports:
anyOf:
- type: string
- type: 'null'
title: 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.
scan_type:
anyOf:
- type: string
- type: 'null'
title: Scan Type
description: How to probe each port. The only supported value right now is 'tcp_connect'. Defaults to 'tcp_connect'
if left out.
default: tcp_connect
timeout:
anyOf:
- type: integer
maximum: 60.0
minimum: 5.0
- type: 'null'
title: 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.
default: 30
type: object
required:
- target
title: ScanRequest
example:
ports: 1-1000
scan_type: tcp_connect
target: scanme.nmap.org
timeout: 30
ScanResponse:
properties:
api_version:
type: string
title: Api Version
description: API version
default: 1.0.0
target:
type: string
title: Target
description: The hostname or IP address that was scanned, echoed back from your request.
resolved_ip:
type: string
title: Resolved Ip
description: The numeric IP address the hostname was resolved to before scanning.
scan_type:
type: string
title: Scan Type
description: The scan method used.
duration_ms:
type: integer
title: Duration Ms
description: How long the scan took in milliseconds.
complete:
type: boolean
title: Complete
description: True if every requested port was scanned. False if the time budget ran out and only part of the range
was probed — in that case the open_ports listed are still accurate, but ports NOT listed may be unscanned rather
than closed.
default: true
ports_requested:
type: integer
title: Ports Requested
description: How many ports you asked to scan.
ports_scanned:
anyOf:
- type: integer
- type: 'null'
title: Ports Scanned
description: How many ports were actually checked. Equals ports_requested on a complete scan; lower when the scan
was cut short by the time budget.
open_ports:
items:
$ref: '#/components/schemas/OpenPort'
type: array
title: Open Ports
description: Ports that responded as open, sorted from lowest to highest port number. Always trustworthy, even on
an incomplete scan.
closed_or_filtered_count:
anyOf:
- type: integer
- type: 'null'
title: Closed Or Filtered Count
description: How many scanned ports were closed or blocked. On an incomplete scan this covers only the ports actually
probed.
warning:
anyOf:
- type: string
- type: 'null'
title: Warning
description: Present only when the scan did not fully complete. Explains what to do for full coverage.
type: object
required:
- target
- resolved_ip
- scan_type
- duration_ms
- ports_requested
- open_ports
title: ScanResponse
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
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
securitySchemes:
siwx:
type: apiKey
in: header
name: SIGN-IN-WITH-X
description: CAIP-122 wallet signature for repeat access after payment
servers:
- url: https://port-scanner.underscoredone.com
description: Production
tags:
- name: port scanner
- name: port scan
- name: open ports
- name: tcp port scanner
- name: scan ports
- name: port
- name: open port check
- name: service detection
- name: network scanner
- name: port check
- name: host port scan
- name: security scan
- name: banner grab
- name: ssh port check
- name: nmap
x402Version: 2
x-payment-accepts:
- scheme: exact
network: eip155:8453
payTo: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
- scheme: exact
network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
payTo: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v