Bulk Print Packing Slips
POST/api/sales-orders/bulk-print-packing-slips
Generates packing slips for the targeted sales orders as a single merged PDF. The generation runs as an asynchronous background operation; the response returns a tracked_job_log_id to poll for progress, and the finished job's results contain the PDF download URL.
orders:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Authentication: Requires Bearer token.
Request body fields (one of ids, filters, or apply_to_all is required):
- ids (array of integers, required without
filters/apply_to_all): Sales order IDs to print. Each ID must exist. - filters (string, required without
ids/apply_to_all): Legacy JSON-string filter payload; resolves to the matching sales order IDs. - apply_to_all (boolean, optional): When true, targets every order matching the request's active filters instead of an explicit ID list.
- engine (string, optional, default
snappy): PDF renderer —snappy(current pipeline) orjasper(legacy pipeline).
Behavior:
- Returns the tracked job log ID immediately; PDF generation runs in the background.
- If the job finishes before the response is sent (small batches / fast queues), the response additionally includes
file(the PDF download URL),printed_count, andfailed_countso the file can be opened right away. - Otherwise, poll the tracked job log endpoints with the returned ID; the completed job's results include the download URL and per-order failures.
Requires permission: sales_orders.update
Request
Responses
- 200
- 401
- 403
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Unprocessable Entity
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.