{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk Redirect Checker: 301 Chains, Loops & Redirect Maps",
    "description": "Bulk redirect checker: every hop of each URL's 301/302 redirect chain, final URL and status code, redirect loops, meta refresh, HTTPS downgrade, and old -> new redirect map validation for site migrations. $0.50 per 1,000 URLs, no start fee; unreachable or blocked URLs are free. API, MCP, n8n.",
    "version": "0.1",
    "x-build-id": "tBsMVpYZ8D3G1NVpM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/quanta1810~bulk-redirect-checker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-quanta1810-bulk-redirect-checker",
        "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/quanta1810~bulk-redirect-checker/runs": {
      "post": {
        "operationId": "runs-sync-quanta1810-bulk-redirect-checker",
        "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/quanta1810~bulk-redirect-checker/run-sync": {
      "post": {
        "operationId": "run-sync-quanta1810-bulk-redirect-checker",
        "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": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "URLs to check (optionally with the expected destination)",
            "type": "array",
            "description": "One URL per line. To validate a redirect map (site migration), put the expected destination on the same line: \"https://old.com/page -> https://new.com/page\". A tab also works (paste two columns from a spreadsheet; a third column is ignored), as does a space or a comma right before \"https://\". The expected URL may be a path (/new-page). Bare domains (example.com) start on http:// so you see the full http → https → www chain. Exact URLs are kept as typed: http/https and www/non-www are checked separately. Lines that can't be read safely are listed as invalid (free).",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "…or URLs from a dataset",
            "type": "string",
            "description": "Optional: ID of an Apify dataset (for example a sitemap or crawler result). Fields url / loc / finalUrl / website / domain are used; an expectedUrl field becomes the expected destination."
          },
          "maxItems": {
            "title": "Max URLs (0 = all)",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many URLs — handy for a quick test on a big list.",
            "default": 0
          },
          "maxRedirects": {
            "title": "Max redirects to follow",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "A chain longer than this is reported as TOO_MANY_REDIRECTS. Browsers give up around 20.",
            "default": 10
          },
          "userAgent": {
            "title": "Check as",
            "enum": [
              "browser",
              "googlebot"
            ],
            "type": "string",
            "description": "Browser = a normal Chrome visitor. Googlebot = the smartphone Googlebot user-agent STRING, to spot sites that redirect search engines differently. Requests still come from Apify's servers, not from Google, so some firewalls that verify Googlebot by IP will block them (those rows are free).",
            "default": "browser"
          },
          "followMetaRefresh": {
            "title": "Follow <meta http-equiv=\"refresh\"> redirects",
            "type": "boolean",
            "description": "Treat an HTML meta refresh (delay up to 10 s) as a redirect hop, like a browser does. It is flagged as META_REFRESH_REDIRECT because search engines handle it worse than a 301.",
            "default": true
          },
          "ignoreTrailingSlash": {
            "title": "Ignore a trailing slash when comparing with the expected URL",
            "type": "boolean",
            "description": "When on, https://new.com/page and https://new.com/page/ count as a match. Scheme, host, path and query must otherwise match exactly (host case and default ports are ignored).",
            "default": true
          },
          "ignoreQueryString": {
            "title": "Ignore the query string when comparing with the expected URL",
            "type": "boolean",
            "description": "When on, https://new.com/page?utm_source=x matches https://new.com/page (tracking or session parameters added by the site). Off by default: the query is part of the URL.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many URLs to check at the same time.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout per hop (seconds)",
            "minimum": 3,
            "maximum": 120,
            "type": "integer",
            "description": "Give up on one request after this many seconds. A URL that never answers on the first request is reported as unreachable and not charged.",
            "default": 15
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}