{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk URL Status Checker: Redirects, SSL Expiry, Metadata",
    "description": "Check thousands of URLs for broken links, status codes, full redirect chains, loops and response time, plus SSL certificate expiry and security headers. Optionally grab title, meta description, canonical and Open Graph tags. Enrich any dataset of links.",
    "version": "0.0",
    "x-build-id": "qqaDst5NSWUmaLUTW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/charlesmarkette~bulk-url-status-checker-redirects-ssl/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-charlesmarkette-bulk-url-status-checker-redirects-ssl",
        "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/charlesmarkette~bulk-url-status-checker-redirects-ssl/runs": {
      "post": {
        "operationId": "runs-sync-charlesmarkette-bulk-url-status-checker-redirects-ssl",
        "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/charlesmarkette~bulk-url-status-checker-redirects-ssl/run-sync": {
      "post": {
        "operationId": "run-sync-charlesmarkette-bulk-url-status-checker-redirects-ssl",
        "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": {
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "One per line. Full URLs (https://example.com/page) or bare domains (example.com, which become https://example.com/).",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset to enrich",
            "type": "string",
            "description": "Optional. A dataset from another run (scraped links, sitemap URLs, company websites…). For each item, the first field below that holds a URL is checked and the result columns are added next to the item's fields. Use {{resource.defaultDatasetId}} in an integration."
          },
          "urlFields": {
            "title": "URL fields",
            "type": "array",
            "description": "Item fields to take the URL from, in order of preference. Dotted paths work (company.website). Default: url, website, link.",
            "items": {
              "type": "string"
            }
          },
          "keepItemFields": {
            "title": "Keep the item's original fields",
            "type": "boolean",
            "description": "On: each output row is the original item plus the check columns (check columns win if a name clashes). Off: only the check columns.",
            "default": true
          },
          "method": {
            "title": "Request method",
            "enum": [
              "auto",
              "head",
              "get"
            ],
            "type": "string",
            "description": "Auto: a HEAD request first, then GET if the server answers HEAD with 403, 405 or 501 or drops the connection. HEAD only or GET only are also available. Page metadata always uses GET.",
            "default": "auto"
          },
          "followRedirects": {
            "title": "Follow redirects",
            "type": "boolean",
            "description": "Follow 301/302/303/307/308 redirects and record every hop in redirectChain. Off: the first response is the result and its Location goes in redirectLocation.",
            "default": true
          },
          "maxRedirects": {
            "title": "Max redirects",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Stop with 'Too many redirects' after this many hops (0–30).",
            "default": 10
          },
          "timeoutSecs": {
            "title": "Timeout per request (seconds)",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for each request (each redirect hop) before reporting 'Timed out'. A whole URL, with all its redirect hops and retries, is given at most 4 times this (at least 60 seconds).",
            "default": 15
          },
          "userAgent": {
            "title": "User-Agent",
            "type": "string",
            "description": "Optional. By default the requests identify this tool: Mozilla/5.0 (compatible; BulkUrlStatusChecker/1.0; +https://apify.com/charlesmarkette)."
          },
          "checkSsl": {
            "title": "Check SSL certificate",
            "type": "boolean",
            "description": "For https URLs: issuer, subject, SANs, valid-from and expiry dates, days until expiry, whether it's trusted and valid for the host. One check per host, reused for every URL on it.",
            "default": true
          },
          "checkSecurityHeaders": {
            "title": "Check security headers",
            "type": "boolean",
            "description": "Value of HSTS, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy and Permissions-Policy on the final response, and a score of how many of the six are present.",
            "default": false
          },
          "extractMetadata": {
            "title": "Extract page metadata",
            "type": "boolean",
            "description": "Download the final HTML page (up to 2 MB) and extract title, meta description, canonical, robots meta, lang, first H1, Open Graph and Twitter card tags, favicon and JSON-LD types. Uses GET for every request.",
            "default": false
          },
          "dedupe": {
            "title": "Check each URL once",
            "type": "boolean",
            "description": "Skip repeats of a URL already checked in this run (compared after normalising, e.g. EXAMPLE.com and https://example.com/ are the same). Skipped repeats are free and not output.",
            "default": true
          },
          "concurrency": {
            "title": "Parallel checks",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many URLs to check at the same time (1–50).",
            "default": 10
          },
          "perHostConcurrency": {
            "title": "Parallel requests per host",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "At most this many requests at a time to any one host name, to stay polite to the sites you check (1–10).",
            "default": 2
          },
          "maxResults": {
            "title": "Max output rows",
            "minimum": 1,
            "type": "integer",
            "description": "Optional cap on output rows (each row is one URL)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}