Polotno

PRINT ON DEMAND

Lulu Print API: add book design to your app with Polotno

Embed the Polotno design editor in your app so users can lay out print-ready books page-by-page, then send them to Lulu for printing and global distribution.

Polotno + Lulu pairs Polotno's embedded design editor SDK with Lulu's Print API . Your users lay out cover and interior pages inside your app, your backend hands the book files to Lulu, and Lulu prints, binds, and ships globally.

The problem Lulu doesn't solve

Lulu's Print API is the best in the category for indie authors and publishers — but it assumes you arrive with two finished PDFs: one interior and one cover. For indie authors, producing those PDFs is the hard part. Most of them do it in InDesign offline, turning "publish" into a weeks-long project.

Teams building on Lulu without a design layer usually:

  • Push authors to InDesign, Affinity Publisher, or Word before upload
  • Provide only cover-image placeholders and hand-assembled interiors
  • Build custom editors that take months to match Lulu's binding and spine specs

Polotno goes in front of Lulu so authors lay out book pages directly in your app, with the spine auto-calculated and the cover bound to Lulu's dimensions. Peleman used the same pattern to automate their print workflow.

How the integration works

  • Design — Author picks a book size (e.g. 6×9 paperback) matching Lulu's pod_package_id . Polotno loads the interior at trim, plus a cover template with spine width calculated from page count.
  • Edit — Author flows text, drops images, adjusts layout. Spine width recalculates live as pages are added or removed.
  • Export — Your app exports two PDF/X-1a files (interior and cover) using the @polotno/pdf-export package — the exact spec Lulu requires.
  • Order — Your backend creates a print job via Lulu's print-jobs/ endpoint with the PDF URLs, pod_package_id , and shipping address.
  • Fulfill — Lulu prints, binds, and ships. Your backend receives status updates via Lulu webhooks.

What a request looks like

// 1. Export interior + cover as PDF/X-1a (server-side).
import { jsonToPDF } from "@polotno/pdf-export"
await jsonToPDF(interiorStore.toJSON(), "./interior.pdf", { pdfx1a: true })
await jsonToPDF(coverStore.toJSON(),    "./cover.pdf",    { pdfx1a: true })

// 2. Upload the PDFs to storage, then POST a print-job to Lulu.
await fetch("https://api.lulu.com/print-jobs/", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${LULU_ACCESS_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    line_items: [{
      printable_normalization: {
        cover:    { source_url: coverPdfUrl },
        interior: { source_url: interiorPdfUrl },
        pod_package_id: "0600X0900BWSTDPB060UW444MXX", // 6×9 paperback B&W
      },
      quantity: 1,
      title: "My Book",
    }],
    shipping_address: shippingAddress,
    shipping_level: "MAIL",
  }),
})
// See https://api.lulu.com/docs/ for the full print-jobs schema.

What Polotno handles vs. what Lulu handles

Polotno (in your app)

  • Cover + interior page templates, multi-page canvas
  • Auto spine calculation from page count
  • PDF/X-1a + CMYK export matching Lulu's requirements
  • Bleed and crop marks per pod_package_id
  • Client, self-hosted, or cloud rendering

Lulu (backend)

  • Paperback, hardcover, magazine, photo-book production
  • Binding, trimming, finishing
  • Global fulfillment
  • Print-job status webhooks

Technical details

  • Export format: PDF/X-1a from @polotno/pdf-export — CMYK conversion, transparency flattening, font embedding, print-industry compliance.
  • Spine: Auto-calculated in Polotno from current page count and Lulu's paper + binding tables.
  • Auth: OpenID Connect bearer tokens via Lulu's developer portal. Sandbox available.
  • Rendering modes: Client-side for the editor; server-side or Polotno Cloud Render API for deterministic PDF export.
  • Handoff to Lulu: POST interior + cover PDF URLs + pod_package_id to print-jobs/ ; receive status via webhook.

What you can build

Any Lulu POD format:

  • Paperbacks — perfect-bound, standard and large trim sizes
  • Hardcover books — casebound and linen
  • Photo books
  • Graphic novels and comics
  • Workbooks, journals, and notebooks
  • Technical manuals and textbooks
  • Magazines and zines — saddle-stitched

FAQ

Do I need a Lulu developer account?

Yes. Lulu's API uses OpenID Connect — you'll need client credentials from their developer portal.

What file format does Polotno export?

PDF/X-1a with CMYK, embedded fonts, and bleed via @polotno/pdf-export .

How is spine width handled?

Polotno calculates spine width live from current page count and Lulu's paper + binding tables, so interior page count and cover spine can't drift out of sync.

Can I use Lulu's test environment?

Yes. Lulu offers a sandbox — use those credentials during development, switch to production before launch.

Is this self-serve yet?

Not during the closed beta.

Closed beta

The Polotno + Lulu integration has been in closed beta since April 2026. If you're building on Lulu and need an in-app book-layout editor, request access — or start integrating Polotno first.

Skip the build, cut dev costs, launch faster

TRUSTED BY

100,000+

CREATORS

300+

BUSINESSES

ExpediaUnbounceLovePopPostGridPredis.ai