New: Book-of-One API — personalized print jobs in a single call. Read the docs

A press you can POST to

One REST API covers pricing, print jobs, shipping options and status webhooks. Sandbox keys are instant and never charge a card.

node python php
import PacificLeaf from '@pacificleaf/node'

const pacificLeaf = new PacificLeaf(process.env.PACIFIC_LEAF_KEY)

const job = await pacificLeaf.printJobs.create({
  lineItems: [{
    product: 'paperback_6x9_bw',
    interior: 'https://cdn.you/int.pdf',
    cover:    'https://cdn.you/cov.pdf',
    quantity: 1
  }],
  shippingAddress: order.address,
  shippingLevel:   'MAIL'
})

console.log(job.id) // pj_8fk2m…
from pacificleaf import Client

client = Client(os.environ["PACIFIC_LEAF_KEY"])

job = client.print_jobs.create(
    line_items=[{
        "product": "paperback_6x9_bw",
        "interior": "https://cdn.you/int.pdf",
        "cover": "https://cdn.you/cov.pdf",
        "quantity": 1,
    }],
    shipping_address=order.address,
    shipping_level="MAIL",
)

print(job.id)  # pj_8fk2m…
use PacificLeaf\Client;

$pacificLeaf = new Client(getenv('PACIFIC_LEAF_KEY'));

$job = $pacificLeaf->printJobs->create([
    'line_items' => [[
        'product'  => 'paperback_6x9_bw',
        'interior' => 'https://cdn.you/int.pdf',
        'cover'    => 'https://cdn.you/cov.pdf',
        'quantity' => 1,
    ]],
    'shipping_address' => $order->address,
    'shipping_level'   => 'MAIL',
]);

echo $job->id; // pj_8fk2m…
Platform

Boring in all the right places

Predictable resources, honest errors, and idempotency on everything that spends money.

REST + JSON

Resource-oriented endpoints, cursor pagination, ISO-8601 everywhere. No SOAP, no surprises.

Webhooks

Signed events at accepted, in_production, shipped and delivered — with automatic retry and replay.

Idempotency

Pass a key on any POST. A retried request returns the original job instead of printing twice.

99.98% uptime

Trailing twelve months, measured externally. Status page and incident history are public.

Reference

The endpoints you'll actually use

Nine of them cover ninety percent of integrations. The rest are in the full docs.

GET /v2/products List the catalogue with every valid configuration.
POST /v2/pricing/quote Exact manufacturing cost for a spec and quantity.
POST /v2/print-jobs Create a print job. Idempotency-Key supported.
GET /v2/print-jobs/{id} Full status, costs and tracking for one job.
POST /v2/print-jobs/{id}/cancel Cancel — allowed until the job enters production.
POST /v2/files/preflight Validate an interior or cover before ordering.
GET /v2/shipping/options Levels, prices and estimated windows by address.
POST /v2/webhooks Subscribe an endpoint to one or more event types.
GET /v2/events Replay any event from the last 30 days.
Webhooks

Know where every copy is, without polling

Every state change fires a signed event. Verify with the shared secret, respond 2xx, and we stop. Fail, and we retry with backoff for 24 hours — then keep it available for replay for 30 days.

  • print_job.accepted — file passed preflight
  • print_job.in_production — on press
  • print_job.shipped — carrier and tracking attached
  • print_job.delivered — confirmed at the door
  • print_job.canceled — with reason code
payload
{
  "id": "evt_2Nk9pQ",
  "type": "print_job.shipped",
  "created": "2026-08-07T09:14:22Z",
  "data": {
    "print_job_id": "pj_8fk2m",
    "facility": "PL-02 Wrocław",
    "carrier": "DHL",
    "tracking": "JJD0002…",
    "eta": "2026-08-09"
  }
}

Print your first test job in ten minutes

Sandbox keys are issued instantly, simulate the full job lifecycle including webhooks, and never charge a card.

Rate limit 100 req/s · OpenAPI 3.1 spec · Postman collection included