TCP Port Scanner

Send a host and port range, get back a clean list of which ports are open and what services are running on them. 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. Pay-per-call at $0.01 USDC over x402 on Base or Solana — no account, no API key. OpenAPI 3.1.0; 1 operation(s): POST /scan.

OpenAPI Specification

done-port-scanner-openapi.yml Raw ↑
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