{
  "name": "pptx-to-text",
  "summary": "Extracts the slide text of a PowerPoint .pptx, slide by slide, in order (body text only, up to 1,000 slides).",
  "rationale": "Reading .pptx slide text needs to unpack an OOXML zip through a hardened fetch: an agent fetching the URL itself walks past every SSRF control, and the parsing is fiddly enough to be worth a paid endpoint.",
  "family": "documents",
  "price_usd": "0.005",
  "free": false,
  "timeout_ms": 40000,
  "max_timeout_seconds": 61,
  "input_schema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "maxLength": 2048,
        "format": "uri",
        "description": "Absolute http(s) URL of the .pptx, up to 2048 characters; redirects are followed and the body must be a zip holding ppt/slides/slideN.xml parts, at most 1,000 of them."
      }
    },
    "required": [
      "url"
    ],
    "additionalProperties": false
  },
  "input_example": {
    "url": "https://grist.tools/samples/documents/garden-plan.pptx"
  },
  "output_example": {
    "source_url": "https://grist.tools/samples/documents/garden-plan.pptx",
    "slide_count": 3,
    "chars": 244,
    "slides": [
      {
        "number": 1,
        "text": "Spring Planting Plan\nCommunity garden season overview"
      },
      {
        "number": 2,
        "text": "Beds and Crops\nNorth beds: beans and peas\nSouth beds: tomatoes & peppers\nHerb spiral: basil, thyme, mint"
      },
      {
        "number": 3,
        "text": "Next Steps\nOrder compost by March\nRepair the east fence\nSchedule the first work day"
      }
    ],
    "text": "Spring Planting Plan\nCommunity garden season overview\n\nBeds and Crops\nNorth beds: beans and peas\nSouth beds: tomatoes & peppers\nHerb spiral: basil, thyme, mint\n\nNext Steps\nOrder compost by March\nRepair the east fence\nSchedule the first work day"
  },
  "errors": [
    "invalid_input",
    "blocked_target",
    "unreachable_target",
    "upstream_timeout",
    "unsupported_content_type",
    "too_large",
    "unprocessable",
    "internal"
  ]
}