REST + JSON
Resource-oriented endpoints, cursor pagination, ISO-8601 everywhere. No SOAP, no surprises.
Enter the tracking ID from your order confirmation email.
Sample IDs: PLP-1234-567
One REST API covers pricing, print jobs, shipping options and status webhooks. Sandbox keys are instant and never charge a card.
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…
Predictable resources, honest errors, and idempotency on everything that spends money.
Resource-oriented endpoints, cursor pagination, ISO-8601 everywhere. No SOAP, no surprises.
Signed events at accepted, in_production, shipped and delivered — with automatic retry and replay.
Pass a key on any POST. A retried request returns the original job instead of printing twice.
Trailing twelve months, measured externally. Status page and incident history are public.
Nine of them cover ninety percent of integrations. The rest are in the full docs.
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 preflightprint_job.in_production — on pressprint_job.shipped — carrier and tracking attachedprint_job.delivered — confirmed at the doorprint_job.canceled — with reason code{
"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"
}
}
Typed, versioned, and released the same day as the API they wrap.
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