DOCX, PPTX, XLSX & EPUB to Text API — Office Docs to Markdown avatar

DOCX, PPTX, XLSX & EPUB to Text API — Office Docs to Markdown

Pricing

$0.50 / 1,000 documents

Go to Apify Store
DOCX, PPTX, XLSX & EPUB to Text API — Office Docs to Markdown

DOCX, PPTX, XLSX & EPUB to Text API — Office Docs to Markdown

Convert Word, PowerPoint, Excel, OpenDocument and EPUB files at public links to Markdown and text, with metadata, sheets as JSON rows and slides with notes. Office Document to Text API.

Pricing

$0.50 / 1,000 documents

Rating

0.0

(0)

Developer

yestrue

yestrue

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Turn Word, PowerPoint, Excel, OpenDocument and EPUB files at public links into clean Markdown, plain text and structured JSON — one record per file, with the document's title, subject, keywords, language and dates. Spreadsheets come back as JSON rows keyed by their header row plus a Markdown table per sheet; presentations as slides with titles and speaker notes; EPUBs as chapters. The file type is read from the bytes, so a link without an extension, a redirecting download link or a misnamed file still converts. No login, no uploads: give it links, get text.

Try it in 1 minute:

  1. Press Start — the prefilled input converts three public files: a Word demo document, Microsoft's Financial Sample spreadsheet and the Project Gutenberg EPUB of Frankenstein.
  2. A few seconds later the Output tab shows one record per file: Markdown and text for the DOCX, 700 rows as JSON objects (plus a Markdown table) for the XLSX, and 30 chapters for the EPUB. The whole prefilled run took 2.5 seconds in a test on 19 October 2026.
  3. Download JSON, CSV or Excel, or call the Actor from the API, Make, Zapier, n8n or an AI agent through the Apify MCP server.

Price: $0.50 per 1,000 documents. Links that give no document (404, a web page, a PDF, an unsupported or empty file) are free.

Use it to:

  • Feed Office documents to an LLM or a RAG pipeline as Markdown instead of binary attachments — headings, bold, lists and tables survive.
  • Turn Excel and CSV exports into JSON rows an API or a spreadsheet can use, with the header row as keys and dates as ISO 8601.
  • Pull the text and speaker notes out of a PowerPoint deck for summaries, search indexes or slide-by-slide analysis.
  • Convert EPUB books into chapters for text analysis, translation or audio production.
  • Read the metadata of hundreds of public documents (title, subject, keywords, language, created and modified dates) in one run.

How it works

  1. Each link is downloaded directly (the proxy is used only to retry a download that failed on the network). Files up to 50 MB are accepted.
  2. The type is decided from the bytes: a ZIP is opened and its entries say whether it is DOCX, PPTX, XLSX, ODT, ODS, ODP or EPUB; legacy .xls is recognised by its OLE2 header; CSV by its content type or extension. A %PDF file, a legacy .doc/.ppt, or a web page answering instead of a file comes back as a free record with a clear status.
  3. DOCX is converted with mammoth (DOCX → HTML) and Turndown (HTML → Markdown); spreadsheets with SheetJS; PPTX, ODT, ODP and EPUB are read straight from their XML. Text, Markdown, word count and the document's properties go into one record.

Supported: .docx, .pptx, .xlsx, .xls, .csv/.tsv, .ods, .odt, .odp, .epub. Not supported: PDF (use the PDF Text Extractor Actor), .doc/.ppt (Office 97-2003 binary formats — save them as .docx/.pptx), images inside documents (text only).

Input

FieldWhat it does
urlsPublic links to the files, one per line. Required.
outputFormatboth (default), markdown or text.
maxRowsSpreadsheets: data rows per sheet in rows[] and the Markdown table (default 1000, 0 = all). The full rowCount is always reported.
includeRowsSpreadsheets: deliver rows[] (default on).
sheetNamesSpreadsheets: only these sheets (case-insensitive). Empty = all.
maxTextLengthCut text and markdown to this many characters and set textTruncated (default 0 = no limit).
maxConcurrencyParallel downloads (default 5).
proxyConfigurationUsed only for network retries.

Output

One record per link:

FieldWhat it is
url, type, bytesFinal download address, detected type (docx, pptx, xlsx, xls, csv, ods, odt, odp, epub), file size
title, subject, keywords, description, language, publisher, createdAt, modifiedAtThe document's own properties, when set
authorEPUB only: the book's author from the OPF. For Office and OpenDocument files the creator property is usually a person's user name and is not delivered (null).
text, markdown, wordCount, textTruncatedThe content; text uses blank lines between paragraphs and tabs between table cells
pageCount, slideCount, sheetCount, sheetNames, chapterCountWhere the format has them
sheets[]Spreadsheets: { name, rowCount, columnCount, hasHeader, headers[], rows[], rowsTruncated, markdownTable } — rows are objects keyed by the header row when the first row is a header (all cells non-empty, distinct, non-numeric text), arrays otherwise
slides[]PPTX/ODP: { index, title, text, notes }
chapters[]EPUB: { index, title, text } in reading order
warnings[]DOCX: styles or elements the converter could not map
input, status, error, scrapedAtWhat you gave, and why a link gave no document

Statuses: OK (charged), NOT_FOUND, NOT_A_DOCUMENT, NOT_SUPPORTED, TOO_BIG, NO_TEXT, INVALID_INPUT, FAILED (all free).

Example

A Word document:

{
"input": "https://files.example.org/reports/q1.docx",
"url": "https://files.example.org/reports/q1.docx",
"type": "docx",
"bytes": 48211,
"title": "Quarterly report",
"author": null,
"subject": "Finance",
"keywords": "revenue, q1",
"description": null,
"language": "en-GB",
"publisher": null,
"createdAt": "2024-03-01T10:00:00.000Z",
"modifiedAt": "2024-03-05T08:30:00.000Z",
"pageCount": 3,
"wordCount": 23,
"text": "Quarterly report\n\nRevenue grew 12 % year on year & costs fell.\n\nBy region\n\nRegion\tSales\nNorth\t120\nSouth\t80\n\nOutlook remains positive.",
"markdown": "# Quarterly report\n\nRevenue grew **12 %** year on year & costs fell.\n\n## By region\n\n| Region | Sales |\n| --- | --- |\n| North | 120 |\n| South | 80 |\n\nOutlook remains positive.",
"warnings": [],
"textTruncated": false,
"status": "OK",
"scrapedAt": "2026-10-19T12:56:23.689Z"
}

A spreadsheet (text and markdown shortened):

{
"input": "https://files.example.org/orders.xlsx",
"url": "https://files.example.org/orders.xlsx",
"type": "xlsx",
"bytes": 17436,
"title": "Order book",
"sheetCount": 2,
"sheetNames": ["Orders", "Numbers"],
"sheets": [
{
"name": "Orders",
"rowCount": 3,
"columnCount": 3,
"hasHeader": true,
"headers": ["Product", "Qty", "Shipped"],
"rows": [
{ "Product": "Widget", "Qty": 3, "Shipped": "2024-01-15T00:00:00.000Z" },
{ "Product": "Gadget", "Qty": 5.5, "Shipped": "n/a" }
],
"rowsTruncated": true,
"markdownTable": "| Product | Qty | Shipped |\n| --- | --- | --- |\n| Widget | 3 | 2024-01-15T00:00:00.000Z |\n| Gadget | 5.5 | n/a |"
}
],
"wordCount": 17,
"markdown": "## Orders\n\n| Product | Qty | Shipped |\n| --- | --- | --- |\n| Widget | 3 | …",
"status": "OK",
"scrapedAt": "2026-10-19T12:56:23.967Z"
}

FAQ

Is this an official API? No, it's an unofficial API built on public files — it converts documents at public links with open-source parsers (mammoth, SheetJS, Turndown); there is no Microsoft or OpenDocument service behind it.

Can it read PDFs or scanned documents? No. A PDF link comes back as a free NOT_SUPPORTED record pointing to the PDF Text Extractor Actor; scanned pages need OCR. Images inside Word or PowerPoint files are not delivered either — this Actor is about text.

How are spreadsheet rows shaped? When the first row of a sheet is a header (every cell a distinct, non-empty, non-numeric text), rows are objects keyed by those headers; otherwise rows are arrays and the Markdown table uses column letters. Dates become ISO 8601 strings, numbers stay numbers. maxRows limits what is delivered per sheet; rowCount always says how many rows the sheet has.

What about personal data? The document's "last modified by" and, for Office and OpenDocument files, the creator property (usually a person's user name) are not delivered. author is filled only for EPUBs, where it names the book's author. The text of the document itself is delivered as is.

Why did the prefilled links change? The example files are hosted by calibre, Project Gutenberg and Microsoft and may move; if one gives NOT_FOUND, replace it with any public document link.

Like it? A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.