Schedule and track production
AI agents: read /llms.txt; add .md to any page URL. This page as Markdown: /guides/jobs-and-production.md. Index of every page and the rules for every call: /llms.txt. Guides and concepts in one file: /llms-full.txt. OpenAPI: /openapi.json.
Read first: Production, for jobs, tasks, task presets, the two kinds of status and the schedule.
A job is one piece of production work on a sales order or quote, and its tasks are the steps it takes. In the API, tasks are the job’s work pipeline, and each comes from a task preset (the API calls it a pipeline).
1. List an order’s jobs
Section titled “1. List an order’s jobs”/v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job
This list isn’t paginated: you get every job on the order.
2. Create a job
Section titled “2. Create a job”/v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job
curl https://secure.yoprint.com/v2/api/store/your-team/v2/sales_order/V4keXwwxMQyXw7/job \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json" \ -H "X-Yoprint-Decimal-Format: exact-v1" \ -H "Content-Type: application/json" \ -d '{ "name": "Front logo tees", "is_rush": false, "pipeline": [ { "action": "create", "pipeline_id": "PtawtCkfVsaZR7", "status_id": "uU6YdSxsWUfrbN", "start_date": "2026-11-04T05:00:00Z", "due_date": "2026-11-05T04:59:59Z", "position": 1 } ] }'The answer is the new job. Shortened:
{ "status": 200, "success": true, "data": { "id": "HuhbGhG57Z7Qyi", "scoped_id": "JOB-1003", "name": "Front logo tees", "order_id": "V4keXwwxMQyXw7", "is_rush": false }}Keep data.id, the job’s id: lines and later job calls use it. scoped_id is the job number people see, not an id.
On some older orders, neither a draft nor published, the answer is 200 with "success": false and action_not_allowed, and no job is made. See Errors.
- Every field is optional.
nameis the job’s name, andis_rushmarks it as rush. pipelineadds tasks at once. Each entry needs"action": "create", apipeline_id(the task preset), and one of that task preset’sstatus_ids. Its dates are both set or both left out.serviceadds decoration services with their print locations (each entry also needs"action": "create").- The order can be a draft or published.
Get task preset (pipeline) ids, and each one’s statuses, from the settings:
GET List task presets/v1/api/store/{team_slug}/setting/pipeline
GET List the task statuses of a task preset /v1/api/store/{team_slug}/setting/status/pipeline/{hash_id}
Then put lines in the job with "job": { "type": "linked", "id": "<job id>" }. Every line on the job takes its decoration price. Line item prices, costs and quantities are decimal pairs (such as { "value": 1250, "dp": 2 } for 12.50). See Add line items and Money and quantities.
To start from a job preset instead, use the operation below. The API calls a job preset a job template. The job copies the preset’s name, note, services, tasks, files and teammates:
POST Add a job from a job template/v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job_template
3. Schedule a job
Section titled “3. Schedule a job”Schedule in whole days in the person’s timezone, as the web app does: from 00:00:00 on the first day to 23:59:59 on the last, sent as UTC. For Tuesday 3 to Thursday 5 November 2026 in America/New_York (UTC−5 once daylight saving ends on 1 November), that’s 2026-11-03T05:00:00Z to 2026-11-06T04:59:59Z. See Dates and times.
/v2/api/store/{team_slug}/v2/job/{hash_id}/update_prod_date
{ "start_date": "2026-11-03T05:00:00Z", "due_date": "2026-11-06T04:59:59Z" }- Send both dates, or both as
nullto unschedule. One without the other is refused. due_datecan’t be beforestart_date.- Scheduling a job moves its dated tasks with it.
4. Change a job’s status
Section titled “4. Change a job’s status”/v2/api/store/{team_slug}/v2/job/{hash_id}/status
{ "status_id": "kqXZfsLxjX2mpo" }- The order must be published.
status_idis one of the team’s job statuses:
/v1/api/store/{team_slug}/setting/status/job
A status change fires job.status_changed.
Move a job to the next status
Section titled “Move a job to the next status”A job’s stage in the shop is its status. Tasks have their own statuses, for the steps inside the job. Move those when your shop tracks each step.
-
Read the job, and note its
GET Get one job of an orderstatus_id:/v2/ api/ store/ {team_slug}/ v2/ sales_order/ {hash_id}/ job/ {job_id} -
List the job statuses. They aren’t sorted: sort them by
GET List job statusespositionyourself, and find the one after the job’s current status./v1/ api/ store/ {team_slug}/ setting/ status/ job -
Change the job’s status to it, then check that the answer has
"success": true. On a draft order, the answer is200with"success": false.
5. Work with tasks
Section titled “5. Work with tasks”/v2/api/store/{team_slug}/v2/job/{hash_id}/work_pipeline
POST Add a task to a job /v2/api/store/{team_slug}/v2/job/{hash_id}/work_pipeline
Change a task’s status, dates or assignee:
PUT Change a task's status/v2/api/store/{team_slug}/v2/work_pipeline/{hash_id}/status
PUT Update a task /v2/api/store/{team_slug}/v2/work_pipeline/{hash_id}
PUT Assign or unassign a person on a task /v2/api/store/{team_slug}/v2/work_pipeline/{hash_id}/assign
Dating a task resets its job’s span to cover its tasks.
6. Read the board and calendars
Section titled “6. Read the board and calendars”Across all orders:
POST Filter jobs/v1/api/store/{team_slug}/job/filter
POST Filter tasks /v1/api/store/{team_slug}/work_pipeline/filter
POST Read the production control calendar /v1/api/store/{team_slug}/production_control/filter
For a calendar, by date range. The job calendar pages through the range with page, up to 1,000 rows a page, or returns up to 1,200 rows at once without it. The task calendar never pages: it returns up to 1,200 tasks.
/v1/api/store/{team_slug}/job/calendar
POST List tasks in a date range /v1/api/store/{team_slug}/work_pipeline/calendar
7. Rush, clone and reorder
Section titled “7. Rush, clone and reorder”To mark one job as rush, update it with "is_rush": true:
/v2/api/store/{team_slug}/v2/job/{hash_id}
PUT Copy a job /v2/api/store/{team_slug}/v2/job/{hash_id}/clone
PUT Reorder the jobs of a sales order or quote /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job/rearrange
To mark every job on an order as rush, run the order’s mark_all_job_as_rush action (mark_order_as_rush marks the order too):
/v2/api/store/{team_slug}/v2/sales_order/{order_unique_key}/action/{action_name}
Printable documents
Section titled “Printable documents”Job sheets, labels and lists for the shop floor:
POST Download job details (PDF)/v1/api/store/{team_slug}/job/export_job_detail
POST Download job labels (PDF) /v1/api/store/{team_slug}/job/export_job_label
POST Download a job list (PDF) /v1/api/store/{team_slug}/job/export_job_list
Pitfalls
Section titled “Pitfalls”- Include
action: "create"on nested job entries. When creating a job, entries inpipeline,service, andmockupwithoutaction: "create"are skipped silently. Aproduction_fileentry withoutactionis refused with422. - Use the v2 job operations. The older v1 operations to show a job and change its status no longer work.
- Both dates or neither. Send both dates, or both as
nullto unschedule. One alone is refused. - Dates are UTC. Convert the shop’s day boundaries to UTC before you send them.
- Statuses belong to a kind. A job takes a job status, and a task takes a status of its own pipeline. A sales order status is refused.
- Job status changes need a published order. On a draft they answer
200with"success": false. Task statuses can change on a draft.
