{
  "openapi": "3.0.1",
  "info": {
    "title": "Subdomain Finder API — Certificate Logs & DNS, No Key",
    "description": "Find a domain's subdomains in public certificate-transparency logs (crt.sh and Cert Spotter), resolve each over DNS-over-HTTPS (A, AAAA, CNAME) and optionally check which answer on the web: status, title, server. Hostnames only. No API key, no login.",
    "version": "0.1",
    "x-build-id": "faR49ruKdDpfTIRs1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~subdomain-finder-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-subdomain-finder-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/insight.solutions~subdomain-finder-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-subdomain-finder-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/insight.solutions~subdomain-finder-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-subdomain-finder-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "domains"
        ],
        "properties": {
          "domains": {
            "title": "Domains",
            "type": "array",
            "description": "One entry per domain to search. A **bare domain** (`apify.com`), a **host** (`www.apify.com`, `docs.apify.com`) or a **full URL** (`https://apify.com/store`) all work: everything reduces to the registrable domain, so `docs.example.co.uk` searches all of `example.co.uk`, and one domain listed three ways is searched — and billed — once. Under a public suffix such as `github.io` the registrable domain is the user's own (`octocat.github.io`); a bare public suffix (`co.uk`, `github.io`) and an IP address are refused with a free diagnostic row.",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Where names come from. **crt.sh** has the deepest certificate history (back to 2017 for apify.com) but is slow — 11 to 16 seconds per domain in our captures — and sometimes down; it is retried twice, and if it still fails you get a free `source-unavailable` row and the other sources' names. **Cert Spotter** is fast and lists only certificates that have not expired yet; its anonymous quota is small, and a 429 becomes a free `source-rate-limited` row. **HackerTarget** (opt-in) adds names seen in DNS rather than on certificates; it allows a few dozen anonymous queries a day.",
            "items": {
              "type": "string",
              "enum": [
                "crtsh",
                "certspotter",
                "hackertarget"
              ],
              "enumTitles": [
                "crt.sh (certificate logs, full history)",
                "Cert Spotter (certificate logs, current certificates)",
                "HackerTarget host search (DNS-seen hosts, small daily quota)"
              ]
            },
            "default": [
              "crtsh",
              "certspotter"
            ]
          },
          "includeWildcards": {
            "title": "Keep wildcard names as rows",
            "type": "boolean",
            "description": "A wildcard certificate name such as `*.staging.apify.com` is not a host — it says `staging.apify.com` has subdomains the logs cannot list. **Off** (default): it is folded into the `staging.apify.com` row, which gets `isWildcard: true`. **On**: it is a row of its own (billed like any row), never resolved or HTTP-checked, because there is nothing to connect to.",
            "default": false
          },
          "resolveDns": {
            "title": "Resolve in DNS",
            "type": "boolean",
            "description": "Look every name up over DNS-over-HTTPS — A and AAAA, with any CNAME read from the answer — Cloudflare first, Google if Cloudflare does not answer. This is what tells a live host from a name that only exists in old certificates (`dnsStatus: nxdomain`). Included in the per-subdomain price.",
            "default": true
          },
          "onlyResolving": {
            "title": "Only names that resolve",
            "type": "boolean",
            "description": "Leave out every name without an A or AAAA address today. Left-out names are free and counted in the summary row's `filteredCount`. Turns DNS resolution on.",
            "default": false
          },
          "checkHttp": {
            "title": "HTTP live check",
            "type": "boolean",
            "description": "For every name with an address, one GET to `https://<host>/` — and to `http://<host>/` only if https gets no answer at all — recording the status (any status counts as live, a 403 included), the final URL after redirects, the `server` header, the page `<title>` (read from the first 64 KB) and the response time. 10 seconds per request. Billed as a separate `http-check` event, once per host actually requested, whether or not it answered.",
            "default": false
          },
          "includeExpired": {
            "title": "Count expired certificates",
            "type": "boolean",
            "description": "**On** (default): a name seen only on certificates that have since expired is still found — that is how retired staging hosts and old regional sites turn up — and `firstSeen`/`lastSeen` carry the dates. **Off**: only names on at least one unexpired certificate are kept.",
            "default": true
          },
          "maxSubdomainsPerDomain": {
            "title": "Max subdomains per domain",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "A cap on rows per domain, applied after sorting (the apex first, then alphabetical). The summary row's `truncated` says when it cut the list. Names past the cap are never resolved or billed.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "DNS and HTTP lookups in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many names are resolved and checked at once. The certificate sources are asked for at most two domains at a time whatever this says — crt.sh is a free public service.",
            "default": 8
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. The certificate sources stop early enough to leave time to resolve what they found. When the budget runs out, every row already written is kept, and names not reached are left out, not billed, and counted in a free `timeout` row.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The certificate sources, the DNS resolvers and ordinary web servers all answer datacenter addresses, so the default is Apify's datacenter proxy.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}