{
  "openapi": "3.0.1",
  "info": {
    "title": "Link & Citation Verifier: Dead Links, Soft 404s, Quote Check",
    "description": "Check cited links really work and say what you claim: soft 404s, parked domains, blocked vs paywalled vs dead, fuzzy quote match with snippet, and a Wayback Machine copy for dead links. Built for AI agents and MCP. Not affiliated with the Internet Archive.",
    "version": "0.1",
    "x-build-id": "pJSfTfhE1z4RLyVyf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tallowlanelabs~link-citation-verifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tallowlanelabs-link-citation-verifier",
        "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/tallowlanelabs~link-citation-verifier/runs": {
      "post": {
        "operationId": "runs-sync-tallowlanelabs-link-citation-verifier",
        "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/tallowlanelabs~link-citation-verifier/run-sync": {
      "post": {
        "operationId": "run-sync-tallowlanelabs-link-citation-verifier",
        "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": {
          "links": {
            "title": "Links to verify (with optional quote / title)",
            "type": "array",
            "description": "One object per link: {\"url\": \"https://...\", \"quote\": \"text the page should contain\", \"title\": \"title the page should have\", \"citedDate\": \"2024-05-01\", \"id\": \"ref-12\"}. Only url is required. quote is fuzzy-matched (case, accents, punctuation and whitespace ignored; use ... between separate passages). citedDate (YYYY-MM-DD) picks the Wayback capture nearest that date. id is echoed back. A plain URL string also works.",
            "default": []
          },
          "urls": {
            "title": "Plain URLs (no quote)",
            "type": "array",
            "description": "Optional shortcut: URLs to check for liveness only. Added after the links above. Each costs one URL check.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minQuoteMatchScore": {
            "title": "Quote match threshold (0.5-1)",
            "minimum": 0.5,
            "maximum": 1,
            "type": "number",
            "description": "quoteFound is true when the best match scores at least this. 1 = verbatim (after ignoring case, accents, punctuation and spacing); 0.9 (default) allows small typos or a changed word; paraphrases usually score 0.6-0.88 and come back as matchType \"partial\".",
            "default": 0.9
          },
          "minTitleMatchScore": {
            "title": "Title match threshold (0.3-1)",
            "minimum": 0.3,
            "maximum": 1,
            "type": "number",
            "description": "titleMatch is true when the expected title matches the page's <title>, og:title, citation_title or first heading at least this well. \"Link rot\" matches \"Link rot - Wikipedia\".",
            "default": 0.8
          },
          "archiveFallback": {
            "title": "Look up a Wayback Machine copy",
            "type": "boolean",
            "description": "For links whose status is in \"Look up the archive when\", ask the Wayback Machine (archive.org availability API, then CDX) for the nearest capture and return its URL. $0.001 per lookup.",
            "default": true
          },
          "archiveOn": {
            "title": "Look up the archive when",
            "type": "array",
            "description": "Statuses that trigger a Wayback lookup. Add \"quote_not_found\" to also check old captures when a live page no longer contains the quote (the page may have changed since it was cited).",
            "items": {
              "type": "string",
              "enum": [
                "dead",
                "soft_404",
                "parked",
                "unreachable",
                "timeout",
                "server_error",
                "blocked",
                "paywalled",
                "rate_limited",
                "quote_not_found"
              ],
              "enumTitles": [
                "Dead (404/410/DNS)",
                "Soft 404",
                "Parked / for-sale domain",
                "Unreachable (connection/TLS/redirect loop)",
                "Timeout",
                "Server error (5xx)",
                "Blocked (bot check / 403)",
                "Paywalled",
                "Rate-limited (429)",
                "Live page lacks the quote"
              ]
            },
            "default": [
              "dead",
              "soft_404",
              "parked",
              "unreachable"
            ]
          },
          "verifyArchivedCopy": {
            "title": "Check the quote/title on the archived copy",
            "type": "boolean",
            "description": "When a capture is found and the link has a quote or title, fetch the archived copy once and check it too (archiveQuoteFound, archiveTitleMatch). Counts as the link's single quote check; no extra charge beyond the $0.003 quote check.",
            "default": true
          },
          "browserFallback": {
            "title": "Headless-browser fallback for JavaScript pages",
            "type": "boolean",
            "description": "Off by default. When on, a live page whose static HTML looks JavaScript-rendered (little text, empty app shell) or does not contain the quote is rendered once in headless Chrome and checked again. $0.002 per successful render. Never used to get past blocks, logins, CAPTCHAs, rate limits or paywalls. Renders load the page's own scripts and styles (not images, media or fonts).",
            "default": false
          },
          "browserFallbackMode": {
            "title": "When to render",
            "enum": [
              "auto",
              "always"
            ],
            "type": "string",
            "description": "\"auto\" (default): only pages that look JavaScript-rendered or lack the quote. \"always\": every live HTML page (one render each).",
            "default": "auto"
          },
          "perDomainDelayMs": {
            "title": "Delay between requests to the same domain (ms)",
            "minimum": 250,
            "maximum": 60000,
            "type": "integer",
            "description": "Requests to one site (registrable domain, e.g. all of *.example.co.uk) run one at a time with at least this gap. Default 1000 ms; minimum 250. archive.org always gets at least 1500 ms.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Parallel domains",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many different domains are checked at the same time (each domain is still one request at a time).",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Timeout per request (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "A page that does not answer in time is reported as status \"timeout\" (not retried).",
            "default": 20
          },
          "maxUrls": {
            "title": "Max links per run",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Safety cap: links beyond this are ignored (noted in RUN_SUMMARY.warnings). Default 500 keeps a default run under about $3.50 even if every event fires on every link.",
            "default": 500
          },
          "includeRedirectChain": {
            "title": "Include the redirect chain",
            "type": "boolean",
            "description": "List each redirect hop as \"<status> <url>\" in redirectChain.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}