{
  "openapi": "3.0.1",
  "info": {
    "title": "Domain Expiry, WHOIS & Email Security Monitor",
    "description": "Bulk WHOIS/RDAP lookup, domain expiry monitor and email security check for 1,200+ TLDs. Get registrar, owner organisation, expiry date, days left, EPP status, nameservers, DNS provider and DNSSEC from official registries, plus MX, mail provider, SPF, DMARC and DKIM with a 0-100 mail score.",
    "version": "0.3",
    "x-build-id": "bLieNygbanuCAfrPG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/codeclouds~whois-rdap-domain-expiry-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-codeclouds-whois-rdap-domain-expiry-monitor",
        "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/codeclouds~whois-rdap-domain-expiry-monitor/runs": {
      "post": {
        "operationId": "runs-sync-codeclouds-whois-rdap-domain-expiry-monitor",
        "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/codeclouds~whois-rdap-domain-expiry-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-codeclouds-whois-rdap-domain-expiry-monitor",
        "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",
        "properties": {
          "domains": {
            "title": "Domains",
            "type": "array",
            "description": "One domain per line (comma- or space-separated lists also work). Accepts bare domains (example.com), subdomains and URLs (https://www.bbc.co.uk/news is checked as bbc.co.uk), e-mail addresses (info@acme.io) and internationalized domains (bücher.de). Duplicates are checked once. When you use the brand-name sweep below, clear this list (the example domains are ignored automatically then).",
            "default": [
              "google.com",
              "wikipedia.org",
              "bbc.co.uk",
              "claude.ai",
              "sidn.nl"
            ],
            "items": {
              "type": "string"
            }
          },
          "names": {
            "title": "Brand names to check across TLDs (optional)",
            "type": "array",
            "description": "Domain availability sweep: each name is combined with every TLD in \"TLDs to check\" (acme → acme.com, acme.io, acme.ai, ...). Combine with Output = Available domains only to get just the free ones.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tlds": {
            "title": "TLDs to check for brand names",
            "type": "array",
            "description": "TLDs used for the brand-name sweep, without the dot. Only used when \"Brand names\" is filled.",
            "default": [
              "com",
              "net",
              "org",
              "io",
              "ai",
              "co",
              "app",
              "dev"
            ],
            "items": {
              "type": "string"
            }
          },
          "expiryWarningDays": {
            "title": "Expiry warning window (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "A registered domain that expires within this many days gets expiryStatus = expiring_soon and counts as an alert.",
            "default": 30
          },
          "emailSecurity": {
            "title": "Email security checks",
            "enum": [
              "off",
              "basic",
              "full"
            ],
            "type": "string",
            "description": "Reads the domain's own mail configuration from DNS (no subdomain scanning): MX records and mail provider, SPF, DMARC, DKIM, and a 0-100 authentication score with findings. off: no DNS lookups at all (fastest). basic: MX + SPF + DMARC + 7 common DKIM selectors, about 10 lookups per domain; MTA-STS, TLS-RPT and BIMI are then reported as 'unknown' because they are not checked. full: 22 DKIM selectors plus MTA-STS, TLS-RPT and BIMI, about 20 lookups per domain. Only registered domains are checked, so an availability sweep costs no DNS queries. Budget roughly 20-25 ms per lookup: a full run over 1,000 domains takes about ten minutes. Changes in MX, SPF, DMARC or DKIM between runs become alerts (dmarc_weakened, mx_changed, spf_removed, dkim_removed); a failed DNS lookup never does.",
            "default": "basic"
          },
          "outputFilter": {
            "title": "Output",
            "enum": [
              "all",
              "alerts_only",
              "available_only"
            ],
            "type": "string",
            "description": "all: one result per domain. alerts_only: only domains that are expired, expiring soon, in auto-renew grace, pending delete or transfer, on hold, or whose registrar, owner, nameservers, status or registration changed since the previous run (cheapest for scheduled monitoring; you pay only for delivered results). available_only: only unregistered domains (for availability sweeps). Errors, unsupported TLDs and invalid entries are always included, free. The full overview is always in the SUMMARY record.",
            "default": "all"
          },
          "trackChanges": {
            "title": "Track changes between runs",
            "type": "boolean",
            "description": "Stores a snapshot per domain so the next run can report changes (renewed, registrar_changed, owner_changed, nameservers_changed, status_changed, transfer_lock_removed, dropped, newly_taken). The first run creates the baseline (changes = null). Most useful on a schedule; a single ad-hoc run only creates the baseline.",
            "default": true
          },
          "registrarLookup": {
            "title": "Look up the owner at the registrar",
            "type": "boolean",
            "description": "For registries that keep owner data at the registrar (.com, .net and others), also query the registrar's RDAP server to get the registrant organisation and country (e.g. google.com → Google LLC, US) and detect privacy/proxy services. Adds one request per domain; failures never fail the domain.",
            "default": true
          },
          "whoisFallback": {
            "title": "Use WHOIS when RDAP is missing or down",
            "type": "boolean",
            "description": "Many ccTLDs (.de, .eu, .io, .be, .co, .it, .se, .dk, .jp and more) have no RDAP service. When enabled, the registry's official port-43 WHOIS is queried instead, also when an RDAP server is unreachable. Data depth then depends on the registry (e.g. .de and .eu publish no expiry date). .ch, .li and .es refuse automated WHOIS and are reported as unsupported_tld.",
            "default": true
          },
          "maxDomains": {
            "title": "Max domains per run",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Safety cap on the number of domains checked in one run (after combining domains and brand-name sweep).",
            "default": 1000
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}