Generate Multi-Page PDF for Printing
Asynchronously generate a single multi-page print-ready PDF from a printer_multipage design. Each set of element values you provide becomes one page in the output document — useful for catalogues, brochures, and personalised booklets where every page shares the same template but has different content.
The result is one PDF file, delivered as a direct link. When generation completes, a NEW_BANNER_BATCH event is sent to your callback_url carrying a banners array with a single entry, whose file.url is the PDF. It is not a ZIP — a ZIP is only ever produced for HTML5 banners.
A printer_multipage design has pages, not formats, so it always produces exactly one document; there is no per-page or per-format variant of this call. Generate Multi-Format PDFs is the equivalent for a printer design, where each of the design's formats produces its own PDF.
Plan requirement
This feature is available from the Suite plan.
Colors accept hex or CMYK
Colors you override at generation time — root.background_color and element *_color fields — accept both hex (#RRGGBB / #RRGGBBAA) and CMYK (cmyk(C,M,Y,K) / cmyka(C,M,Y,K,A)) tokens on print designs. The backend converts them to the design's color profile at render time. (Print imports store CMYK too, converting a solid hex for you — see Print Imports → Colors.)
Endpoint
Generation characteristics

- Supported Design Type:
printer_multipage - Response: Asynchronous
- Output: Multi-page printable PDF
- Retrieval methods: Webhooks, Polling
Request body
There is no top-level elements field on this endpoint — a multi-page design's overrides are per page, inside pages. image_file_type and file_compression_level are not accepted either: the output is always one PDF.
| Field | Type | Required | Description |
|---|---|---|---|
pages | object | Yes | Dictionary of page overrides keyed by page name (e.g. page_1, page_2). Each value is a dictionary of element overrides for that page. |
callback_url | string (uri) | No | URL that will receive a POST request when generation completes. |
original_visual_id | string (uuid) | No | Do not use — visual versioning is not wired on this endpoint yet. The field is accepted and forwarded without the resolution step the other generation endpoints apply, so none of the checks under Visual Versioning run and the outcome is undefined. Use POST /async/banner-builder/{designId}/generate for versioned regeneration. |
print | object | No | Print output options. Fields: color_profile (UUID), display_crop_marks (boolean — default: value configured in the builder). |
Output customization
Use the print property to customize the PDF output.
Color profiles
| UUID | Description |
|---|---|
be2ab219-8fe4-4d85-91ba-65bdc9ddaf01 | CMYK — ISO Coated v2 (ECI) |
03738f37-5b6f-4be9-9100-706b1711f9dd | CMYK — ISO Coated v2 (ECI) 300% |
e0c86a8a-050c-41f1-885a-0f74b9baac50 | CMYK — ISO Uncoated |
0e0355e6-2931-4c83-92f2-64db9f5ddffc | CMYK — US Web Coated (SWOP 2006 5v2) |
db3c123e-1127-11ef-b77e-f93002785645 | RGB — No color profile |
fac91df8-1155-11ef-b77e-f93002785645 | CMYK — ISO Newspaper26 v4 |
The color_profile value must be a UUID — the built-ins above, or a custom profile from your workspace.
{
"print": {
"display_crop_marks": true,
"color_profile": "e0c86a8a-050c-41f1-885a-0f74b9baac50"
}
}Sample request
For multi-page designs, provide elements per page using the pages object.
Replace {YOUR-API-KEY} and {designId} before running.
curl -X POST \
-H "x-api-key: {YOUR-API-KEY}" \
-H "Content-Type: application/json" \
-d '{
"pages": {
"page_1": {
"root": { "background_color": "cmyka(0,0,0,0,100)" },
"tb-image_0": { "image_url": "https://mycompany.com/image.jpeg" },
"tb-text_0": { "payload": "Lorem Ipsum" }
},
"page_2": {
"root": { "background_color": "cmyka(0,0,0,0,100)" },
"tb-image_0": { "image_url": "https://mycompany.com/image.jpeg" },
"tb-text_0": { "payload": "Lorem Ipsum" },
"tb-text_1": { "payload": "Lorem Ipsum" }
}
}
}' \
https://api.abyssale.com/async/banner-builder/{designId}/generate-multipage-pdfimport abyssale from '@abyssale/sdk';
// Set ABYSSALE_API_KEY env var before running
const { data, error } = await abyssale.generateMultiPagePdf('{designId}', {
pages: {
page_1: {
root: { background_color: "cmyka(0,0,0,0,100)" },
"tb-image_0": { image_url: "https://mycompany.com/image.jpeg" },
"tb-text_0": { payload: "Lorem Ipsum" }
},
page_2: {
root: { background_color: "cmyka(0,0,0,0,100)" },
"tb-image_0": { image_url: "https://mycompany.com/image.jpeg" },
"tb-text_0": { payload: "Lorem Ipsum" },
"tb-text_1": { payload: "Lorem Ipsum" }
}
}
});
if (error) console.error(error);
else console.log(data.generation_request_id);from abyssale import Abyssale
# Set ABYSSALE_API_KEY env var before running
with Abyssale() as client:
accepted = client.generate_multi_page_pdf("{designId}", {
"pages": {
"page_1": {
"root": {"background_color": "cmyka(0,0,0,0,100)"},
"tb-image_0": {"image_url": "https://mycompany.com/image.jpeg"},
"tb-text_0": {"payload": "Lorem Ipsum"},
},
"page_2": {
"root": {"background_color": "cmyka(0,0,0,0,100)"},
"tb-image_0": {"image_url": "https://mycompany.com/image.jpeg"},
"tb-text_0": {"payload": "Lorem Ipsum"},
"tb-text_1": {"payload": "Lorem Ipsum"},
},
},
})
print(accepted.generation_request_id)Sample response
{ "generation_request_id": "166e1852-dc97-43e3-a5f2-142076452c74" }Related
- Asynchronous Generation Overview
- Generate Multi-Format PDFs — single-page PDF generation
- Banner Events — webhook payload on completion
- Errors — error codes for failed requests
- Node.js SDK · Python SDK — every method, config, retries and the polling helpers
