Export DOCX via REST API

Available in Start planBetav2.12.0

The DOCX export API converts Tiptap JSON documents into .docx (Microsoft Word) files. It uses the same conversion library as the editor extension and produces equivalent DOCX output for standard content.

The REST API supports style overrides, page size and margins, headers/footers, and element-level overrides (tableOverrides, paragraphOverrides, textRunOverrides, tableCellOverrides, imageOverrides). It does not support custom node rendering or any option that requires JavaScript functions. If you need those capabilities, use the editor extension, which also works server-side.

Review the postman collection

You can also experiment with the Document Conversion API by heading over to our Postman Collection.

Export DOCX

POST /v2/convert/export/docx

The /v2/convert/export/docx endpoint converts Tiptap documents into DOCX format. Users can POST documents to this endpoint and use various parameters to customize how different document elements are handled during the conversion process.

Export customization support

The /v2/convert/export/docx endpoint accepts style overrides, page size/margins, headers/footers, and the five element-level overrides (tableOverrides, paragraphOverrides, textRunOverrides, tableCellOverrides, imageOverrides). It does not support custom node conversions, since those require JavaScript functions that cannot be serialized. For custom node conversions, use the editor extension or the server side export guide.

Example (cURL)

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Welcome to this demonstration of our editor ability to export a wide array of formatting options to DOCX, ensuring that your content retains its intended appearance in Word.\"}]}]}",
      "exportType": "blob"
    }'

Subscription required

This endpoint requires a valid Tiptap subscription. For more details review our pricing page.

Required headers

NameDescription
AuthorizationThe JWT token to authenticate the request. Example: Bearer your-jwt-token
X-App-IdThe Convert App-ID from the Convert settings page: https://cloud.tiptap.dev/v2/cloud/convert
Content-TypeMust be application/json

Body

NameTypeDescriptionDefault
docStringTiptap's JSONN/A
exportTypestringThe expected export typeblob
styleOverridesObjectStyle overrides{}
pageSizeObjectPage size configurationundefined
pageMarginsObjectPage margins configurationundefined
headersObjectPage header configurationundefined
footersObjectPage footer configurationundefined
tableOverridesObjectTable-level rendering overridesundefined
paragraphOverridesObjectParagraph-level rendering overridesundefined
textRunOverridesObjectText run rendering overridesundefined
tableCellOverridesObjectTable cell rendering overridesundefined
imageOverridesObjectImage rendering overridesundefined

Page Size Configuration

The pageSize object allows you to customize the dimensions of your exported DOCX document:

PropertyTypeDescriptionDefault
widthstringThe width of the page. Must be a positive number followed by a valid unit (cm, in, pt, pc, mm, px)."21.0cm"
heightstringThe height of the page. Must be a positive number followed by a valid unit (cm, in, pt, pc, mm, px)."29.7cm"

Example cURL with custom page size:

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Document with custom page size\"}]}]}",
      "exportType": "blob",
      "pageSize": {"width": "21.0cm", "height": "29.7cm"}
    }'

Page Margins Configuration

The pageMargins object allows you to customize the margins of your exported DOCX document:

PropertyTypeDescriptionDefault
topstringThe top margin of the page. Can be negative. Must be a number followed by a valid unit (cm, in, pt, pc, mm, px)."1.0cm"
bottomstringThe bottom margin of the page. Can be negative. Must be a number followed by a valid unit (cm, in, pt, pc, mm, px)."1.0cm"
leftstringThe left margin of the page. Must be a positive number followed by a valid unit (cm, in, pt, pc, mm, px)."1.0cm"
rightstringThe right margin of the page. Must be a positive number followed by a valid unit (cm, in, pt, pc, mm, px)."1.0cm"

Example cURL with custom page margins:

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Document with custom margins\"}]}]}",
      "exportType": "blob",
      "pageMargins": {"top": "2.0cm", "bottom": "2.0cm", "left": "1.5cm", "right": "1.5cm"}
    }'

Headers and footers

The headers and footers objects allows you to configure a set of headers and footers options for your exported DOCX.

Headers Configuration

The headers object allows you to customize the headers of your exported DOCX document:

PropertyTypeDescription
evenAndOddHeadersbooleanWhether to use different headers for odd and even pages
differentFirstPagebooleanWhether to use a different header on the first page. When true, the first value is used on page one instead of default.
defaultstringThe standard default header on every page, or header on odd pages when the evenAndOddHeaders option is activated. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.
firststringThe header on the first page. Only used when differentFirstPage is set to true. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.
evenstringThe header on even pages when the evenAndOddHeaders option is activated. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.

Plain text vs. Tiptap JSONContent

Each header value can be either a plain text string (produces a simple unstyled header) or a stringified Tiptap JSONContent object (enables rich formatting such as bold, italic, links, etc.). When passing JSONContent, stringify the object with JSON.stringify() before sending it in the request body.

Example cURL with custom headers:

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Document with custom headers\"}]}]}",
      "exportType": "blob",
      "headers": {"evenAndOddHeaders": true, "default": "Default Header", "first": "First Page Header", "even": "Even Page Header"}
    }'

Footers Configuration

The footers object allows you to customize the footers of your exported DOCX document:

PropertyTypeDescription
evenAndOddFootersbooleanWhether to use different footers for odd and even pages
differentFirstPagebooleanWhether to use a different footer on the first page. When true, the first value is used on page one instead of default.
defaultstringThe standard default footer on every page, or footer on odd pages when the evenAndOddFooters option is activated. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.
firststringThe footer on the first page. Only used when differentFirstPage is set to true. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.
evenstringThe footer on even pages when the evenAndOddFooters option is activated. Accepts a plain text string or stringified Tiptap JSONContent for rich formatting.

Plain text vs. Tiptap JSONContent

Each footer value can be either a plain text string (produces a simple unstyled footer) or a stringified Tiptap JSONContent object (enables rich formatting such as bold, italic, links, etc.). When passing JSONContent, stringify the object with JSON.stringify() before sending it in the request body.

Example cURL with custom footers:

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Document with custom footers\"}]}]}",
      "exportType": "blob",
      "footers": {"evenAndOddFooters": true, "default": "Default Footer", "first": "First Page Footer", "even": "Even Page Footer"}
    }'

Element Overrides

The five element override objects let you tune how individual DOCX elements (tables, paragraphs, text runs, table cells, images) are rendered. Each override is forwarded to the underlying DOCX conversion library as a base default; per-node values from the document still win where they are computed.

No deep merging

Nested objects inside an override (for example borders, margins, transformation) are replaced entirely, not deep-merged. When customizing one side of a border, provide every side you need so undefined values do not slip through.

tableOverrides

Defaults applied to every table. Most useful properties:

PropertyTypeDescription
bordersObjectPer-side definitions for top, bottom, left, right, insideHorizontal, insideVertical. Each accepts { style, size, color }.
marginsObjectDefault cell margins { top, bottom, left, right } (twentieths of a point).
widthObjectTable width { size, type } where type is "pct", "dxa", or "auto".
layoutstring"fixed" or "autofit".
alignmentstring"left" | "center" | "right" | "start" | "end".
cantSplitbooleanPrevent the table from splitting across pages.
visuallyRightToLeftbooleanRender the table right-to-left.

paragraphOverrides

Defaults applied to every paragraph. Most useful properties:

PropertyTypeDescription
spacingObject{ before, after, line, lineRule } in twentieths of a point. line is overwritten by computed line height.
alignmentstring"left" | "center" | "right" | "justified" | "start" | "end".
indentObject{ left, right, firstLine, hanging, start, end } in twentieths of a point.
keepNextbooleanKeep this paragraph with the next one.
keepLinesbooleanKeep all lines in the paragraph together.
pageBreakBeforebooleanInsert a page break before the paragraph.
bidirectionalbooleanRender paragraph right-to-left.
stylestringReference to a paragraph style id defined in styleOverrides.

textRunOverrides

Defaults applied to every text run. Per-mark formatting (bold, italic, color, …) still overrides these values. Most useful properties:

PropertyTypeDescription
fontstringFont family name.
sizenumberFont size in half-points (24 = 12pt).
boldbooleanRender bold by default.
italicsbooleanRender italic by default.
underlineObject{ type, color } — e.g. { type: "single", color: "auto" }.
strikebooleanStrikethrough.
colorstringHex color without the leading # ("FF0000").
highlightstringPredefined highlight color name ("yellow", "green", …).
superScriptbooleanRender as superscript.
subScriptbooleanRender as subscript.

tableCellOverrides

Defaults applied to every table cell. Most useful properties:

PropertyTypeDescription
shadingObject{ fill, type, color } — e.g. { fill: "F0F0F0", type: "clear" }.
verticalAlignstring"top" | "center" | "bottom".
bordersObjectPer-side cell border definitions, same shape as tableOverrides.borders.
marginsObjectCell padding { top, bottom, left, right } in twentieths of a point.
widthObjectCell width { size, type }.

imageOverrides

Defaults applied to every image. Image dimensions computed from the document (intrinsic size or user-resized values) still win where present. Most useful properties:

PropertyTypeDescription
transformationObject{ width, height, rotation?, flip? } — pixels at 96 dpi.
altTextObject{ title, description, name }.
floatingObjectFloating positioning options (anchor, alignment, offset, wrap).

Example cURL combining multiple element overrides

curl --output example.docx -X POST "https://api.tiptap.dev/v2/convert/export/docx" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Doc with element-level overrides\"}]}]}",
      "tableOverrides": {
        "borders": {
          "top": { "style": "none" },
          "bottom": { "style": "none" },
          "left": { "style": "none" },
          "right": { "style": "none" },
          "insideHorizontal": { "style": "none" },
          "insideVertical": { "style": "none" }
        }
      },
      "paragraphOverrides": {
        "spacing": { "before": 200, "after": 200 }
      },
      "textRunOverrides": {
        "font": "Arial",
        "size": 24
      },
      "tableCellOverrides": {
        "shading": { "fill": "F0F0F0", "type": "clear" },
        "verticalAlign": "center"
      },
      "imageOverrides": {
        "transformation": { "width": 400, "height": 300 }
      }
    }'

Response

On success the API returns the DOCX file as a binary download:

  • Status: 200 OK
  • Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
  • Content-Disposition: attachment; filename=export-{timestamp}.docx

Error responses

StatusCodeDescription
400NO_DOCUMENT_PROVIDEDNo document was provided in the body
422FAILED_TO_PARSE_DOCX_FILEFailed to parse JSON inputs
422FAILED_TO_EXPORT_DOCX_FILEFailed to export DOCX
422FAILED_TO_CONVERT_DOCX_TO_BLOBFailed to convert result type