Bytefusedocs

Organise

Split PDF

Break one PDF into multiple parts — by page range, by fixed page count, or by top-level bookmark. Every part is delivered together as a single ZIP.

Free to try — no key required 10 credits / callSynchronous

Overview

Upload one PDF, choose a split_mode, and get back a public R2 URL to a ZIP containing every output part. Text, links, annotations and forms are preserved in each part.

POSThttps://api.bytefuse.in/api/v1/pdf/split/split

The path segment is doubled

As with merge, the real path is /api/v1/pdf/split/split — the router prefix and route both contribute a split segment.

Request

Content type multipart/form-data:

filefilerequired
The single PDF to split.
split_modestringrequired
The split strategy — see the modes table below.
split_configstring (JSON)required
JSON config for the chosen mode. Its shape depends on split_mode. Malformed JSON returns 400.
optionsstring (JSON)optional
Accepted but not used by the current implementation.Default: null
async_processingbooleanoptional
Accepted but ignored — always synchronous.Default: false

Split modes

split_modesplit_config & behaviour
page_range{"ranges": [[1,3],[4,10]]} — list of [start, end] pairs, 1-based and inclusive. One output PDF per range.
page_count{"pages_per_file": 5} — one output PDF every N pages.
bookmarks{} — one output PDF per top-level bookmark, named NN_<title>.pdf. Errors with 400 if the PDF has no top-level bookmarks.
(other)Any other value falls back to one PDF per page.

Caps and quirks

A split is capped at 200 output parts (beyond that returns 400). Tier/mode gating is not enforced on this path, and “AI/content” modes silently fall back to one-file-per-page.

Response

200 OK, application/json — always a single ZIP:

200 OK
{
  "job_id": "...",
  "status": "completed",
  "output_url": "https://<r2-host>/split/20260704/<uuid>.zip",
  "pages": 42,
  "size": 987654,
  "message": "Split into 9 file(s)"
}
job_idstringoptional
Fresh UUID, not queryable.
statusstringoptional
Always "completed".
output_urlstringoptional
Public R2 URL to a single ZIP (<name>_split.zip) of all parts. No expires_at.
pagesintoptional
Page count of the input document.
sizeintoptional
Byte size of the ZIP.
messagestringoptional
e.g. "Split into 9 file(s)".

The response header X-Credits-Charged is 1 per call regardless of how many parts are produced (0 anonymous).

Examples

# split every 5 pages
curl -X POST https://api.bytefuse.in/api/v1/pdf/split/split \
  -H "X-API-Key: dt_live_your_key" \
  -F "file=@report.pdf" \
  -F "split_mode=page_count" \
  -F 'split_config={"pages_per_file": 5}'

# extract specific ranges
curl -X POST https://api.bytefuse.in/api/v1/pdf/split/split \
  -F "file=@report.pdf" \
  -F "split_mode=page_range" \
  -F 'split_config={"ranges": [[1,3],[10,12]]}'

Errors

400Malformed split_config, no bookmarks (bookmarks mode), more than 200 parts, or a config that yields no output.
402 / 429 / 503Insufficient credits, rate limited, or capacity/config error.
500The split operation failed unexpectedly.