Skip to content

Copy a job

Open .md

PUT/v2/api/store/{team_slug}/v2/job/{hash_id}/clone

v2Operation ID v2_public_job_clone

Copies a job into a sales order or quote: the same one or another of your team's. Returns the new job.

By default the copy takes the job's line items, tasks, mockups and files, but not its approvals. Dates keep their distance from the order's issue date: the copy starts and is due as long after the target order's issue date as the original is after its own order's (so within the same order they don't change). A job without both dates uses its tasks' earliest start and latest due date; with neither, the copy is unscheduled.

Lines on phased-out or deleted products, sizes or colors are never copied as they are. If the job has any, the first call is refused with clone_needs_choices, which lists them. Call again with an item_choices entry for each: leave it out, or replace it with another size or color of the same product that is still sold.

Permission

Needs permission to view the source order and to edit the target order (team owner, Manage Sales Orders "update all", or "update assigned" on orders you created or are assigned to; for a draft target, also its creator when their role can create sales orders).

Business rules

  • A choice for a line that is on sale is refused with clone_choice_not_needed; a choice naming a line that isn't on the job with clone_choice_unknown_line.
  • A product without sizes or colors can only be left out: replace on it is clone_replacement_invalid.
  • A replacement must be another variant of the same product that is still sold (clone_replacement_invalid).
  • Nothing is copied when a choice is refused.

Side effects

  • Creates the job, and copies of its lines, tasks and files as chosen.
  • Recalculates the target order and may run its auto-invoicing; neither happens when the target order came from Shopify.
  • Open Admin Portal pages refresh after the copy is saved.

Path parameters

  • team_slugstringrequired

    Your team slug, shown as Team ID next to your API key in Profile.

    • Example your-team
  • hash_idstringrequired

    The job's hash id (id). Hash ids only: a unique key or a document number gives 404.

    • Example WaGvtaWsx7Kcn4

Request body

application/json, required.

  • target_orderstringrequired

    The sales order or quote to copy into (hash id or unique key). It can be the job's own order.

  • Copy the job's approvals. Fails with 500 when an approval includes mockup designs, or includes files while clone_media is false.

    • Default false
  • Copy the mockups and production files.

    • Default true
  • Copy mockup designs. Defaults to clone_media.

  • Copy the line items. Ignored (never copied) when either order came from Shopify.

    • Default true
  • Copy the tasks.

    • Default true
  • item_choicesarray of objects

    One choice per line that uses a phased-out or deleted product, size or color. Only for those lines.

    Fields of each item (3)
    • actionstringrequired
      • One of: "leave_out", "replace"
    • idstringrequired

      The line item on the source job. Each line at most once.

    • Required for replace: another size or color (variant) of the same product that is still on sale.

More examples (1)

Copy with choices for unsellable lines

curl
curl -X PUT 'https://secure.yoprint.com/v2/api/store/your-team/v2/job/WaGvtaWsx7Kcn4/clone' \  -H 'Authorization: Bearer YOUR_API_KEY' \  -H 'Accept: application/json' \  -H 'X-Yoprint-Decimal-Format: exact-v1' \  -H 'Content-Type: application/json' \  -d '{    "clone_job_approval": false,    "item_choices": [      {        "action": "leave_out",        "id": "ZJTJ2uF5dMiArL"      },      {        "action": "replace",        "id": "Py196Qo19s55qk",        "replacement_id": "Tl6eTHKHoKqrMw"      }    ],    "target_order": "yYkdcUrFwnbqE2"  }'

Response

200Successful response.

  • dataobjectrequired

    A job.

    Child fields (43)
    • assigned_usersarray of objects

      People on the job.

      Fields of each item (3)
    • auto_saved_forstring | null

      Set only on autosave copies.

    • customerobject
      Child fields (2)
      • idstring | null

        The customer.

      • namestring | null
    • due_datestring (date-time) | null

      Production due date. ISO 8601 with offset, or null.

    • Kept for older clients; not a count of services.

    • idstring

      The job.

    • impression_countnumber | null
    • inventory_statusstring | null

      The stock status of the job's lines.

    • is_rushboolean
    • item_countnumber | null

      Units on the job.

    • location_countnumber | null
    • mockuparray of objects

      Mockup files.

      Fields of each item (3)
      • idstring

        The file.

      • namestring | null
      • urlstring | null

        Download link with its own access token.

    • Child fields (2)
    • namestring | null
    • need_cust_provide_productboolean | integer | null

      Blanks are provided by the customer.

    • notestring | null
    • order_idstring

      The order.

    • The order number.

    • pdfarray of objects

      PDF links.

      Fields of each item (2)
      • labelstring
      • urlstring (uri)

        A download link that carries its own long-lived access token: don't publish it.

    • The open approval request, if any.

    • pipelinesarray of objects

      The job's tasks.

      Fields of each item (24)
      • assigned_usersarray of objects

        Who is assigned.

      • created_atstring (date-time)
      • due_datestring (date-time) | null

        Task due date. ISO 8601 with offset, or null.

      • idstring

        The task.

      • job_idstring

        The job.

      • job_is_rushboolean | integer | null
      • job_item_countnumber | null
      • job_namestring | null
      • The job number with its prefix.

      • job_status_idstring | null

        The job's current status.

      • namestring
      • notestring | null
      • order_idstring

        The order.

      • order_namestring | null
      • order_scoped_idstring | null

        The order number.

      • The task preset it comes from.

      • positioninteger

        Order among tasks; lower comes first. 0 when unset.

      • A summary of the job's order.

        Child fields (14)
      • start_datestring (date-time) | null

        Task start. ISO 8601 with offset, or null.

      • statusobject

        A status: label, kind and place in the list.

        Child fields (9)
        • colorstring | null

          Hex color.

        • idstring

          The status.

        • labelstring
        • Only on the statuses of a task preset (role pipeline): the task preset. Absent on other statuses.

        • positioninteger

          Its place in the team's list: sort by it to find the next status.

        • rolestring

          Which list it belongs to: job for job statuses, pipeline for the statuses of a task preset.

          • One of: "order", "quote", "job", "purchase_order", "shipment", "customer_message", "pipeline"
        • trashedboolean

          The status was deleted.

        • typestring

          The kind of status: start (Pending), pre_production and in_progress (In Progress), end (Completed).

          • One of: "start", "pre_production", "in_progress", "end"
      • status_completion_datestring (date-time) | null

        When it reached a Completed status. ISO 8601 with offset, or null.

      • status_idstring

        The task's status (a status of its task preset).

      • status_last_change_datestring (date-time) | null

        When the status last changed. ISO 8601 with offset, or null.

      • updated_atstring (date-time)
    • positioninteger | null
    • The job's price before pricing rules, at the stored scale. A decimal pair: the amount is value ÷ 10^dp ({ "value": 1250, "dp": 2 } is 12.50). Read dp every time: it can differ between fields and records.

    • The pricing rule that set the job's decoration price, or null. These answers usually carry only type, the two ids and the two totals. List the jobs of a sales order or quote and Get one job of a sales order or quote answer with the full summary (the rule's current name and position, the prices before and after).

      Child fields (12)
      • afterstring | null

        Full summary only: the price after the rule, as a decimal string.

      • after_totaldecimal pair

        The decoration price after the rule. A decimal pair: the amount is value ÷ 10^dp ({ "value": 1250, "dp": 2 } is 12.50). Read dp every time: it can differ between fields and records.

      • basestring | null

        Full summary only: the decoration price the rule started from, as a decimal string.

      • base_typestring | null

        Full summary only: service_price.

      • normal_pricestring | null

        Full summary only: the price with no rule (the same as base for a job).

      • original_totaldecimal pair

        The decoration price before the rule. A decimal pair: the amount is value ÷ 10^dp ({ "value": 1250, "dp": 2 } is 12.50). Read dp every time: it can differ between fields and records.

      • pricing_group_idstring | null

        The pricing group.

      • pricing_group_namestring | null

        Full summary only: the group's name now.

      • pricing_group_removedboolean | null

        Full summary only: true when the group was removed since. The job keeps its price.

      • pricing_rule_idstring | null

        The pricing rule.

      • ruleobject | null

        Full summary only: the rule as the group holds it now (id, label, position, where 1 is the first rule checked), or null when it no longer exists.

      • typestring | null

        service on a job.

    • pricing_totaldecimal pair

      The job's price, at the stored scale (usually 6 decimal places: { "value": 600000000, "dp": 6 } is 600.00). A decimal pair: the amount is value ÷ 10^dp ({ "value": 1250, "dp": 2 } is 12.50). Read dp every time: it can differ between fields and records.

    • production_filearray of objects

      Production files.

    • qr_code_urlstring | null

      A QR code image for the job.

    • A summary of the job's order.

      Child fields (14)
      • created_bystring | null

        Who created the order.

      • cust_due_datestring (date-time) | null

        Order customer due (in-hand) date. ISO 8601 with offset, or null.

      • due_datestring (date-time) | null

        Order production due date. ISO 8601 with offset, or null.

      • external_typestring | null

        shopify when the order came from Shopify, else null.

      • is_quoteboolean
      • is_rushboolean
      • issue_datestring (date-time) | null

        Order issue date. ISO 8601 with offset, or null.

      • namestring | null

        Order name.

      • object_typestring | null

        sales_order or quote.

      • ship_due_datestring (date-time) | null

        Order ship-by date. ISO 8601 with offset, or null.

      • shopify_deleted_externally_atstring (date-time) | null

        When it was deleted in Shopify. ISO 8601 with offset, or null.

      • start_datestring (date-time) | null

        Order production start. ISO 8601 with offset, or null.

      • status_idstring | null

        The order status.

    • scoped_idstring

      The job number as shown, with its JOB- prefix. Change a job number takes only the digits.

    • servicesarray of objects

      The services (decorations).

      Fields of each item (9)
    • start_datestring (date-time) | null

      Production start. ISO 8601 with offset, or null.

    • statusobject

      A status: label, kind and place in the list.

    • status_completion_datestring (date-time) | null

      When it reached a Completed status. ISO 8601 with offset, or null.

    • status_idstring

      The job's current status: its production stage. Look it up in List job statuses, or read status.

    • status_last_change_datestring (date-time) | null

      When the status last changed. ISO 8601 with offset, or null.

    • Quantity that still needs ordering, with 8 decimal places ("12.00000000"). A decimal string, such as "0.00000000"; parse it as a decimal.

    • unique_keystring | null

      The job's unique key.

    • versioninteger
  • statusintegerrequired
  • successbooleanrequired

Errors

  • 401The API key is missing or wrong (unauthenticated).

  • 403You are not allowed to do this. api_access_not_in_plan: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only {"message": "Insufficient Permission"}. Other refusals use the error envelope, with unauthorized or user_is_not_authorized.

    When
    You can't view the source order or edit the target order.
    Fix
    Ask the team owner to adjust your role or assign you to the orders.
  • 404Not found. page_not_found: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's. code: null, with a message that starts "No query results for": there is no record with that id.

    When
    The job or target_order isn't your team's.
    Fix
    Check both ids.
  • 422The request was refused and changed nothing. validation_failed lists what to fix in error.fields; other codes name a business rule, explained in error.message. A few checks answer with only {"message": "..."}. An operation that calls another service (a payment provider, a carrier, an accounting app) can answer connect_timeout ("Please retry again") when that service does not answer in time: the change may or may not have happened there, so read the record back before you retry.

    When
    Lines need choices: clone_needs_choices, with the lines in error.lines and their jobs in error.jobs (directly under error, not in error.data). Each line has id, job_id, product_id, product_name, product_type, quantity (a decimal string), reason (variant_phased_out, variant_deleted, product_phased_out or product_deleted) and, for variant products, product_size, product_color, size_id and color_id. Each job has id, scoped_id (JOB-126), name and keeps_products.
    Fix
    Send one item_choices entry for each listed line, then call again.
    When
    A choice is refused: clone_choice_not_needed (same error.lines and error.jobs, listing the lines that are on sale again), clone_choice_unknown_line (the unknown line ids in error.ids) or clone_replacement_invalid (the line in error.line).
    Fix
    Correct item_choices as the rules say, then call again.
  • 500A business rule refused the request (see the operation's errors), or something failed inside YoPrint. Refusals use the error envelope with a code such as action_not_allowed; an unexpected failure answers {"message": "Server Error"}. Repeating a refusal gets the same answer; after an unexpected failure, read the record back before you retry a change.

    When
    With clone_job_approval: an approval includes mockup designs, or it includes files and clone_media is false. The body is { "message": "Server Error" } and nothing is copied.
    Fix
    Copy without approvals, or keep clone_media on.