Skip to content

Schedule and track production

Open .md

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).

GET List the jobs of a sales order or quote /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job

This list isn’t paginated: you get every job on the order.

POST Add a job to a sales order or quote /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job
Terminal window
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. name is the job’s name, and is_rush marks it as rush.
  • pipeline adds tasks at once. Each entry needs "action": "create", a pipeline_id (the task preset), and one of that task preset’s status_ids. Its dates are both set or both left out.
  • service adds 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

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.

PUT Schedule a job /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 null to unschedule. One without the other is refused.
  • due_date can’t be before start_date.
  • Scheduling a job moves its dated tasks with it.
PUT Change a job's status /v2/api/store/{team_slug}/v2/job/{hash_id}/status
{ "status_id": "kqXZfsLxjX2mpo" }
  • The order must be published.
  • status_id is one of the team’s job statuses:
GET List job statuses /v1/api/store/{team_slug}/setting/status/job

A status change fires job.status_changed.

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.

  1. Read the job, and note its status_id:

    GET Get one job of an order /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job/{job_id}
  2. List the job statuses. They aren’t sorted: sort them by position yourself, and find the one after the job’s current status.

    GET List job statuses /v1/api/store/{team_slug}/setting/status/job
  3. Change the job’s status to it, then check that the answer has "success": true. On a draft order, the answer is 200 with "success": false.

GET List the tasks of a job /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.

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.

POST List jobs in a date range /v1/api/store/{team_slug}/job/calendar POST List tasks in a date range /v1/api/store/{team_slug}/work_pipeline/calendar

To mark one job as rush, update it with "is_rush": true:

PUT Update a job /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):

PUT Run an action on a sales order or quote /v2/api/store/{team_slug}/v2/sales_order/{order_unique_key}/action/{action_name}

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
  • Include action: "create" on nested job entries. When creating a job, entries in pipeline, service, and mockup without action: "create" are skipped silently. A production_file entry without action is refused with 422.
  • 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 null to 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 200 with "success": false. Task statuses can change on a draft.