Skip to content

Update a variant

Open .md

PUT/v1/api/store/{team_slug}/product/{hash_id}/variant/{id}

v1Operation ID v1_public_product_variant_update

Changes one variant's price, pricing group prices, weight, supplier code and vendor, and returns it. Its size and color are renamed with Rename sizes and colors.

Permission

Needs the Manage Products permission at the level that can update products.

Business rules

  • Send vendor_id on every update: leaving it out, or sending an empty string, clears the variant's vendor.
  • The product id in the path is not checked: the variant is found by its own id within the team.
  • supplier_id is saved as sent; other fields, such as barcode, are not changed here.

Path parameters

  • team_slugstringrequired

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

    • Example your-team
  • hash_idstringrequired

    The product's id (id from List products). A hash id from an earlier answer; unique keys and document numbers (such as PO0042) don't work here.

    • Example EDhVUaC6jbLbed
  • idstringrequired

    The variant's id (id from List a product's variants, or attr_data[].id from Load a product for a sales order line). A hash id from an earlier answer; unique keys and document numbers (such as PO0042) don't work here.

    • Example uAu3dAKIaHyAYk

Request body

application/json, required.

  • Send a whole number of thousandths: 9500 is 9.50.

  • price_datamap of objects

    Prices for pricing groups, keyed by pricing group id: {"<pricing group id>": {"price": 11000}}. A line priced with that group uses this price instead of default_price. Send a whole number of thousandths: 11000 is 11.00.

    Fields of each item (1)
    • priceintegerrequired

      Send a whole number of thousandths: 11000 is 11.00.

  • The supplier's code for this variant.

  • vendor_idstring

    The vendor id. Send it every time: leaving it out clears the vendor.

  • weightnumber

Response

200Successful response.

  • dataobjectrequired
    Child fields (23)
    • typestringrequired
      • Always "variant_option"
    • default_priceinteger | number | stringrequired

      This variant's selling price. Never null. Thousandths, an older encoding: 12500 is 12.50. Usually a whole number; an amount finer than a thousandth comes back as a number with a fraction (1234.5 is 1.2345), or as a string ("1234.5") when you send X-Yoprint-Decimal-Format: exact-v1. See Money and quantities.

    • idstringrequired

      The variant id: the db_variant line's product id.

    • phased_outbooleanrequired
    • trashedbooleanrequired
    • barcodestring | null
    • brandstring | null

      The parent product's brand.

    • color_hexstring | null
    • color_idstring | null
    • color_labelstring | null
    • descriptionstring | null

      The parent product's description.

    • enableboolean
    • phased_out_atstring (date-time) | null
    • phased_out_byobject | null

      Who did it, as {id, name}; null when on sale or nobody was recorded.

      Child fields (2)
    • price_dataobject | array

      Prices for pricing groups, as saved: keyed by the pricing group's internal number (not its hash id), each {"price": <thousandths>}. An empty list [] when there are none.

    • size_idstring | null
    • size_labelstring | null
    • supplier_idstring | null
    • taxableboolean

      The parent product's taxable.

    • titlestring | null

      The parent product's title.

    • vendor_idstring

      The vendor id, or an empty string when none.

    • weightnumber | string | null
  • 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
    Your role cannot update products. This 403 has a short body, {"message": "Insufficient Permission"}, with no success or error.
    Fix
    Ask a team owner to set Manage Products to "Users CAN view, update and create products".
  • 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
    No live variant with this id. error.code is null and error.message names the record type.
    Fix
    Check the id.
  • 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
    A price, weight or a price_data price is not a number, or vendor_id or a price_data key is not a valid id. error.code is validation_failed.
    Fix
    Fix each field named in error.fields; its keys are field paths such as contact.0.phone.
  • 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
    default_price is not a whole number of thousandths, such as 9.5. Nothing is saved.
    Fix
    Send a whole number: 9500 for 9.50.
  • GETGet a variant/v1/api/store/{team_slug}/product/{hash_id}/variant/{id}