---
title: "Update an existing product by slug"
method: PUT
path: "/api/v1/products/by-slug/{slug}/"
tags: ["Products - By Slug"]
---

# Update an existing product by slug

`PUT /api/v1/products/by-slug/{slug}/`

## Request

- Base URL: `https://partnerapi-staging.depop.com`
- URL: `https://partnerapi-staging.depop.com/api/v1/products/by-slug/{slug}/`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/depop/apis/seller-api/docs/api/v1/products/by-slug/:slug/put.ts> (a function with typed inputs; its response is checked against the schema)

This endpoint allows you to update an existing product on Depop using its slug. The product will be updated with the new details in the request.
**Required OAuth Scopes:** - `products_write` - Required for all product operations - `offers_write` - Required when setting `auto_send_offer_price` or `auto_negotiate_offer_price`
**Note:** This endpoint only supports updating existing products. If the slug does not exist, a 404 error will be returned. To create a new product, use the POST `/api/v1/products/` or PUT `/api/v1/products/by-sku/{sku}/` endpoint instead.
**SKU:** You can set or change the product's `sku` by including it in the request. Omitting `sku` leaves the product's current SKU unchanged - it is never cleared by a PUT.

## Path parameters

- `slug` string, required

## Request body

- ProductUpdateRequest
  - `address` Address, required
    - `country_code` string, required
    - `state` string: The state/county of the product's address.
  - `description` string, required: A good description should contain key attribute information (brand, category, color, size, age etc), clarifying information about flaws, condition, fit, size and measurements. Commonly they end with hash tags (for example, \#summer). Constraints: * Limited to 1000 characters * Email addresses are not allowed * Can only have up to 5 hashtags (for example, \#summer).
  - `price_currency` string, required: The currency code of the item's price.
  - `price_amount` string, required: The price of the item. Must be at least $1.00 or £1.00. Up to 2 decimal places.
  - `auto_send_offer_price` string: The price to automatically send to buyers who liked or have bagged the product. There's a fixed 1h delay before an offer is sent. If not set, the product will not automatically send offers. Must be less at least 5% off the price_amount. Up to 2 decimal places. **Note:** Requires `offers_write` OAuth scope.
  - `auto_negotiate_offer_price` string: The price to automatically respond with when a buyer sends an offer in this product: * If the buyer offer is higher or equal to this value, then the offer will be automatically accepted. * If the buyer offer is lower than this value, then the offer will be automatically countered with this price. If the buyer counters again, the same value will be used to counter the buyer's offer. If not set, the offers will not be automatically responded to. Must be less at least 5% off the price_amount. Up to 2 decimal places. **Note:** Requires `offers_write` OAuth scope.
  - `international_shipping_cost` string: The cost of shipping the product internationally. Only set this if the product can be shipped internationally. Same currency as price_currency.
  - `national_shipping_cost` string: The cost of shipping the product nationally. Same currency as price_currency. If set to 0, the product has free shipping for buyers. **Important:** Either `national_shipping_cost` OR `depop_shipping` must be provided. If using Depop managed shipping, use `depop_shipping` instead and omit this field.
  - `depop_shipping` DepopShippingDetails
    - `address_id` integer, required: The ID of the seller address to ship from. This must be an address ID obtained from the `/api/v1/shop/seller-addresses/` endpoint. The address determines which shipping providers and parcel sizes are available.
    - `shipping_provider_id` string, required: The identifier for the shipping provider. This must be a provider ID returned from the `/api/v1/shop/seller-addresses/{address_id}/shipping-providers/` endpoint for the specified address. Common providers include: USPS, MY_HERMES (EVRI), SENDLE.
    - `parcel_size_id` string, required: The identifier for the parcel size. This must be a parcel size ID available for the specified shipping provider, obtained from the `/api/v1/shop/seller-addresses/{address_id}/shipping-providers/` endpoint. Common sizes include: SMALL, MEDIUM, LARGE, etc.
    - `payer` 'buyer' | 'seller', required: Who pays for the shipping cost. - `buyer`: The buyer pays for shipping (shipping cost is added to the total price) - `seller`: The seller pays for shipping (free shipping for buyers)
  - `quantity` number, required: The quantity of the product available for sale. Must be at least 1.
  - `pictures` PublicPicture[], required: Array of product images. Minimum 1 image is required, maximum 8 images allowed. The first image will be used as the main product image shown in search results.
    - `url` string, required: Publicly accessible URL of the picture. Non-square images are also supported. Currently, we support JPG, WebP and PNG image formats. If a Depop hosted picture URL is provided (`media-photos.depop.com`), it must reference a picture belonging to the requesting user and that picture must still exist. URLs pointing at another user's picture, or at a picture that no longer exists or is invalid, are rejected with a `422` validation error. External URLs (not hosted on `media-photos.depop.com`) are unaffected.
  - `department` string, required: Top level category of the product. Currently we support: womenswear, menswear, kidswear and everything-else. These rarely change. For an up to date list, please make use of our taxonomy endpoint. Currently, in https://api.depop.com/api/v3/attributes/ under the key `department`.
  - `product_type` string, required: The more specific category of the product. Note that there's an intermediate level between department and product type called "group". We don't need to receive this when an item is being listed but it's used in the apps/website to organize the product types. For example, in "menswear >> swim-beach-wear >> swimsuit-one-piece", we only need to know the department "menswear" and the product type "swimsuit-one-piece". For an up to date list, please make use of our taxonomy endpoint. Currently, in https://api.depop.com/api/v3/attributes/ under the key `group`.
  - `size_set_id` number: The size set ID for the given Department and Product Type. This field is mandatory for product types that have a size set available.
  - `size_id` number: The size ID for a given size Set ID. This field is mandatory for product types that have a size set available.
  - `condition` 'brand_new' | 'used_like_new' | 'used_excellent' | 'used_good' | 'used_fair', required
  - `colour` string[]
  - `style` string[]
  - `age` string[]
  - `source` string[]
  - `brand_name` string, required: The brand name of the product. For example, "Nike". If your product does not have a brand, please send "unbranded" which will show to our users as "Other". Our API will perform the brand matching based on this field to find the most accurate brand representation. If no match is found, we will default to "unbranded".
  - `attributes` object, required: Additional attributes of the product. **Required field:** Must be included in the request. Use an empty object `{}` if the product has no attributes. For an up to date list, please make use of our attributes endpoint.
  - `is_boosted` boolean: Whether to boost the product. For new products, you don't need to send this with `true` if you have a "boosted shop" or you're part of the "free boost trial". For existing products, when omitting, the current boost state is preserved. This is important as an explicit `false` will disable "boosted shop" feature or end the "free boost trial".
  - `sku` string: Optional. The product's SKU. Provide a value to set or change it. Omitting the field leaves the product's current SKU unchanged - unlike the other fields on this endpoint, an absent `sku` is never treated as a full replacement, so a PUT cannot clear a SKU. Must be unique - reusing a SKU that already belongs to another product fails with a 422 `duplicate_sku` error, and leaves both products unchanged.

## Response `200`

Successful operation

- ProductCreateOrUpdateResponse
  - `product_id` number, required: The product id of the created or updated product.
  - `slug` string, required: The URL-friendly identifier for the product on Depop. This can be used with the `/api/v1/products/by-slug/{slug}/` endpoints.
  - `sku` string, nullable: The SKU of the product. - For PUT `/api/v1/products/by-sku/{sku}/`: Always present (same as the SKU in the URL path). - For PUT `/api/v1/products/by-slug/{slug}/`: Present if the product has a SKU, otherwise null. - For PUT `/api/v1/products/by-product-id/{productId}/`: Present if the product has a SKU, otherwise null. - For POST `/api/v1/products/`: Present if SKU was provided in the request, otherwise null.

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden - Insufficient scope
- `404`: Product not found
- `422`: Unprocessable Entity - the product failed validation, or the seller's Depop account is not currently able to list items. Retrying the same request will not help until the product or the seller's account is fixed.

---

[API](https://skmtc.dev/depop/apis/seller-api.md) - [All operations](https://skmtc.dev/depop/apis/seller-api/llms.txt) - [OpenAPI document](https://skmtc.dev/depop/apis/seller-api/revisions/56fef8e38e44?raw)
