{
  "openapi": "3.0.1",
  "info": {
    "title": "WHOIS Domain Lookup: Operational Domain Intelligence",
    "description": "Look up WHOIS and RDAP registration data for any domain in bulk. Get registrar details, creation and expiry dates, nameservers, domain age, registrant info, DNSSEC status, and EPP status codes -- all without needing any API key.",
    "version": "1.5",
    "x-build-id": "SNthCVqawbbmcC15r"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ryanclinton~whois-domain-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ryanclinton-whois-domain-lookup",
        "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/ryanclinton~whois-domain-lookup/runs": {
      "post": {
        "operationId": "runs-sync-ryanclinton-whois-domain-lookup",
        "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/ryanclinton~whois-domain-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-ryanclinton-whois-domain-lookup",
        "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",
            "maxItems": 1000,
            "type": "array",
            "description": "List of domains to look up (e.g., google.com, stripe.com). Full URLs are auto-cleaned to the bare domain.",
            "items": {
              "type": "string"
            },
            "default": [
              "google.com"
            ]
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "registration-check",
              "investing",
              "security",
              "brand-monitoring",
              "auto"
            ],
            "type": "string",
            "description": "Operational scoring lens. `registration-check` (default) is general-purpose. `investing` prioritises expiry / availability for domain investors. `security` prioritises weak security posture for analysts. `brand-monitoring` prioritises newly-registered + lookalike indicators. `auto` resolves from input shape (profile set → matching mode; watchlist set → brand-monitoring; large batch → investing; otherwise registration-check).",
            "default": "registration-check"
          },
          "profile": {
            "title": "Detection profile",
            "enum": [
              "none",
              "phishing-detection",
              "ransomware-infrastructure",
              "domain-investing",
              "executive-brand-monitoring",
              "mna-due-diligence",
              "vendor-risk",
              "soc-triage",
              "bug-bounty-recon"
            ],
            "type": "string",
            "description": "Use-case bundle layered above mode. `none` (default) — no profile applied. `phishing-detection` / `soc-triage` — security mode + tighter suspicion thresholds. `ransomware-infrastructure` — security mode + new + parking surfacing. `domain-investing` — investing mode. `executive-brand-monitoring` / `vendor-risk` — brand-monitoring mode. `mna-due-diligence` — registration-check with full lifecycle + cluster surfacing. `bug-bounty-recon` — security mode + relationship edges for subdomain pivot.",
            "default": "none"
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "standard",
              "decision"
            ],
            "type": "string",
            "description": "`standard` (default) emits per-domain lookup records + clusters + alerts + a summary record. `decision` emits a single consolidated `recordType: 'decision'` record collapsing the top actions, key risks, opportunities, and what-changed into one object. Use decision mode for AI agents, Slack alerts, and exec dashboards where the consumer wants 'the answer', not the dataset.",
            "default": "standard"
          },
          "outputProfile": {
            "title": "Output profile",
            "enum": [
              "minimal",
              "standard",
              "llm",
              "full"
            ],
            "type": "string",
            "description": "Per-record field projection. `minimal` (Zapier / Make / n8n if-then rules) returns Tier-1 fields only. `standard` (default, SDR / analyst review) returns Tier-1 + Tier-2 interpretation. `llm` (AI agents) keeps decision-relevant fields + whyThisMatters + summary + executionHint. `full` returns everything including raw RDAP fields.",
            "default": "standard"
          },
          "explainabilityLevel": {
            "title": "Explainability level",
            "enum": [
              "none",
              "compact",
              "full"
            ],
            "type": "string",
            "description": "How much explanation to ship per record. `none` strips all explanation fields (smallest payload). `compact` (default) keeps whyThisMatters + improvementSuggestions + shortReason. `full` keeps decisionTrace + pipelineState + executionReadiness + recoveryPlan.",
            "default": "compact"
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "When set, the actor persists a per-domain snapshot in a named KV store `whois-domain-lookup-<name>` and emits per-record `delta` + `changeFlags` + change-driven alerts. Two pipelines on different watchlists never collide. Run 1 carries changeFlags=[NEW]; run 2+ surfaces what changed since the last persisted run."
          },
          "referenceRunId": {
            "title": "Reference run ID",
            "type": "string",
            "description": "Optional. Compare current run against a specific prior run's SNAPSHOT KV (e.g. `1abc2def3ghi4jkl`). Useful for post-incident recovery or diffing against a known-good baseline without persistent watchlist state. Requires APIFY_TOKEN; fetches the prior run's KV directly. Takes precedence over watchlistName."
          },
          "expiryWarnDays": {
            "title": "Expiry warning threshold (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Domains expiring within this window are tagged `expiryStatus: warning`. Default 90 days.",
            "default": 90
          },
          "expiryCriticalDays": {
            "title": "Expiry critical threshold (days)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Domains expiring within this window are tagged `expiryStatus: critical` and `recommendedAction: renew-now`. Default 30 days.",
            "default": 30
          },
          "alertThresholds": {
            "title": "Alert thresholds",
            "type": "object",
            "description": "Per-alert override object. Keys: expiryCriticalDays (default 30), expiryWarningDays (default 7), riskScoreThreshold (default 70), newDomainMaxAgeDays (default 30), clusterMinMembers (default 5), suspicionScoreThreshold (default 60, fires high-suspicion-signals alert). All optional; defaults apply when omitted."
          },
          "emitAlertsOnly": {
            "title": "Emit alerts only",
            "type": "boolean",
            "description": "When true, skips per-domain lookup records and emits only alerts + the summary record. Perfect for monitoring schedules where you only want 'what changed' — dramatically reduces dataset size on healthy runs. Pair with watchlistName for cross-run change detection.",
            "default": false
          },
          "emitRelationships": {
            "title": "Emit relationship edges",
            "type": "boolean",
            "description": "When true (default), every lookup record carries a `relationships[]` array enumerating cross-record edges (shared-nameservers / shared-registrar / shared-parking-provider / shared-cdn-provider) derivable from the WHOIS data alone. Disable to reduce payload size on large cohorts where graph output isn't needed.",
            "default": true
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of domains looked up in parallel. RDAP politeness is per-server; different TLDs hit different RDAP servers so parallel lookups across TLDs are safe. Global rate-limiter still bounds total request rate. Default 5.",
            "default": 5
          },
          "rateLimitMs": {
            "title": "Rate-limit interval (ms)",
            "minimum": 50,
            "maximum": 2000,
            "type": "integer",
            "description": "Minimum milliseconds between any two upstream API calls (RDAP + who-dat combined). Default 120ms = ~8 req/sec, polite to public RDAP infrastructure. Lower values risk throttling; higher values extend run time.",
            "default": 120
          },
          "runtimeBudgetSeconds": {
            "title": "Runtime budget (seconds)",
            "minimum": 60,
            "maximum": 21600,
            "type": "integer",
            "description": "Soft cap on total run time. When exceeded, the actor stops launching new lookups and emits partial results with `truncated: true` on the summary record. Auto-clamped against Apify's hard timeout minus an emit-phase reserve. Default 3000s (50min), leaves 10min reserve under Apify's 1h default timeout.",
            "default": 3000
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of domains to process from the input list. Default 100, max 1000. When the input array exceeds this cap, summary.truncated is set with the reason `maxResults cap binding`.",
            "default": 100
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}