{
  "openapi": "3.0.1",
  "info": {
    "title": "Website to Markdown Crawler for AI, LLM & RAG - $1/1K",
    "description": "Crawl any website and get clean Markdown of every page for LLMs, RAG, vector databases and chatbots. Menus, footers, ads and cookie banners removed; headings, tables, code and links kept. $1 per 1,000 pages.",
    "version": "0.1",
    "x-build-id": "XZMaeqkcpK2C5l7DA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/plotpointtech~website-to-markdown-crawler/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-plotpointtech-website-to-markdown-crawler",
        "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/plotpointtech~website-to-markdown-crawler/runs": {
      "post": {
        "operationId": "runs-sync-plotpointtech-website-to-markdown-crawler",
        "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/plotpointtech~website-to-markdown-crawler/run-sync": {
      "post": {
        "operationId": "run-sync-plotpointtech-website-to-markdown-crawler",
        "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": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Pages to convert and, if crawling is on, where the crawl starts. A bare domain such as example.com also works. You can also enter a sitemap URL (…/sitemap.xml), an llms.txt URL, or a direct link to a PDF or DOCX file.",
            "default": [
              {
                "url": "https://docs.python.org/3/tutorial/index.html"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "crawlLinks": {
            "title": "Follow links on the same website",
            "type": "boolean",
            "description": "Also convert pages linked from the start pages (same website only). Turn off to convert only the URLs you listed (plus sitemap / llms.txt URLs if enabled).",
            "default": true
          },
          "maxPages": {
            "title": "Maximum pages",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after saving this many pages and documents in total. Your start URLs are always included.",
            "default": 20
          },
          "maxDepth": {
            "title": "Maximum link depth",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "How many clicks away from a start URL the crawler may go. 0 = only the start URLs, 1 = pages they link to, and so on. Pages found in sitemaps or llms.txt count as depth 1.",
            "default": 2
          },
          "stayWithinStartPath": {
            "title": "Stay within the start URL's folder",
            "type": "boolean",
            "description": "Only follow links under the start URL's path. For example, starting at example.com/docs/ only crawls pages under /docs/. Also applies to sitemap and llms.txt URLs.",
            "default": true
          },
          "includeUrlPatterns": {
            "title": "Only crawl URLs matching (globs)",
            "type": "array",
            "description": "Optional. Only crawl discovered URLs that match at least one of these glob patterns, e.g. https://example.com/docs/** or */blog/*. * matches any characters including /. A pattern without wildcards matches if the text appears anywhere in the URL. Start URLs are always crawled.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeUrlPatterns": {
            "title": "Skip URLs matching (globs)",
            "type": "array",
            "description": "Optional. Never crawl URLs matching these patterns, e.g. */tag/*, **/login, ?page=. Also applies to linked files.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useSitemaps": {
            "title": "Find pages in sitemap.xml",
            "type": "boolean",
            "description": "Also read the website's sitemaps (from robots.txt, or /sitemap.xml) and queue the pages they list that are within scope. Finds pages that are not linked from the start page.",
            "default": false
          },
          "useLlmsTxt": {
            "title": "Find pages in llms.txt",
            "type": "boolean",
            "description": "Also read the website's /llms.txt file (if it has one) and queue the pages and Markdown files it lists.",
            "default": false
          },
          "renderJavaScript": {
            "title": "Render JavaScript (browser)",
            "enum": [
              "auto",
              "always",
              "never"
            ],
            "type": "string",
            "description": "Auto downloads pages directly (fast, cheapest) and opens a real browser only for pages that come back empty because they are built with JavaScript; if most pages on a site need the browser, it switches to browser-first for that site. Always uses a browser for every page (slower, charged as browser-rendered pages). Never skips the browser entirely.",
            "default": "auto"
          },
          "contentExtraction": {
            "title": "Content extraction",
            "enum": [
              "smart",
              "readable",
              "fullPage"
            ],
            "type": "string",
            "description": "Main content: keeps the page's main area and removes menus, sidebars, footers, banners and other boilerplate (recommended for docs and most sites). Article text: Readability-style extraction with trafilatura, best for blogs and news; falls back to Main content if it finds too little. Full page: keeps everything except scripts, styles and the elements in 'Remove elements'.",
            "default": "smart"
          },
          "removeElementsCssSelector": {
            "title": "Remove elements (CSS selector)",
            "type": "string",
            "description": "Elements removed before extraction. The default removes navigation, footers, sidebars, dialogs and common cookie-consent banners. Clear it to keep them. Elements holding most of the page's text are never removed.",
            "default": "nav, footer, aside, [role=navigation], [role=contentinfo], [role=dialog], [aria-modal=true], #onetrust-consent-sdk, #CybotCookiebotDialog, #usercentrics-root, .cc-window, .cky-consent-container, .qc-cmp2-container, #cookie-banner, #cookie-notice, #cookie-consent, .cookie-banner, .cookie-notice, .cookie-consent"
          },
          "keepElementsCssSelector": {
            "title": "Keep only elements (CSS selector)",
            "type": "string",
            "description": "Optional. If set, only the matching elements are converted (e.g. article, .docs-content, #main). Pages where nothing matches fall back to normal extraction."
          },
          "minWordCount": {
            "title": "Skip pages with fewer words than",
            "minimum": 0,
            "type": "integer",
            "description": "Pages whose content has fewer words than this are not saved (and not charged). 0 keeps everything.",
            "default": 0
          },
          "skipDuplicates": {
            "title": "Skip duplicate pages",
            "type": "boolean",
            "description": "Do not save (or charge for) a page whose text is identical to a page already saved, or whose canonical URL points to a page already saved.",
            "default": true
          },
          "saveMarkdown": {
            "title": "Save Markdown",
            "type": "boolean",
            "description": "Include the content as Markdown (headings, lists, tables, links and code blocks kept).",
            "default": true
          },
          "includePlainText": {
            "title": "Save plain text",
            "type": "boolean",
            "description": "Include the content as plain text (Markdown formatting removed).",
            "default": true
          },
          "saveHtml": {
            "title": "Save cleaned HTML",
            "type": "boolean",
            "description": "Also include the cleaned main-content HTML.",
            "default": false
          },
          "chunkSize": {
            "title": "Chunk size for RAG (characters)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "If above 0, each result also gets a 'chunks' array: the Markdown split into pieces of about this many characters on heading, paragraph and sentence boundaries, each with its heading path. 1,000–2,000 characters suits most embedding models. 0 = off.",
            "default": 0
          },
          "chunkOverlap": {
            "title": "Chunk overlap (characters)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "How many characters from the end of one chunk are repeated at the start of the next (not across headings). At most half the chunk size.",
            "default": 150
          },
          "downloadFiles": {
            "title": "Convert linked PDF and DOCX files",
            "type": "boolean",
            "description": "Also download PDF and Word (.docx) files linked from crawled pages on the same website (or its subdomains) and convert them to Markdown and text. Each converted file counts as one page. PDF and DOCX start URLs are always converted.",
            "default": false
          },
          "maxFileSizeMb": {
            "title": "Maximum file size (MB)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Larger files are skipped.",
            "default": 20
          },
          "maxFilePages": {
            "title": "Maximum pages per PDF",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Only the first this-many pages of each PDF are converted.",
            "default": 300
          },
          "modifiedSince": {
            "title": "Only pages modified since",
            "type": "string",
            "description": "Optional date (2025-01-31 or 2025-01-31T12:00:00Z). Sitemap entries with an older <lastmod> are not fetched, and pages whose Last-Modified header or modified/published date is older are not saved. Pages with no date are kept. Start URLs are always fetched."
          },
          "incrementalStoreName": {
            "title": "Remember pages in key-value store",
            "type": "string",
            "description": "Optional name of a key-value store in your account (created if missing). The crawler stores a hash of every page's text there; on the next run with the same name, pages whose text has not changed are not saved or charged, and saved pages get changeStatus 'new' or 'changed'."
          },
          "maxConcurrency": {
            "title": "Pages at once",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many pages to fetch in parallel. Requests to the same site are also spaced out politely, and any Crawl-delay in robots.txt is honoured.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}