Skip to main content
PUT
/
products
/
{productId}
/
product-variants
Upsert Product Variant
curl --request PUT \
  --url https://api.loopreturns.com/api/v1/products/{productId}/product-variants \
  --header 'Content-Type: application/json' \
  --header 'X-Authorization: <api-key>' \
  --data '
{
  "external_id": "<string>",
  "name": "<string>",
  "sku": "<string>",
  "weight_grams": 123,
  "barcode": "<string>",
  "price": {
    "amount": 50000,
    "currency_code": "USD"
  },
  "images": [
    "<string>"
  ],
  "options": [
    {
      "position": 123,
      "value": "<string>"
    }
  ],
  "logistics_information": {
    "origin_country_code": "<string>",
    "origin_region_code": "<string>",
    "default_hs_code": "<string>",
    "requires_shipping": true,
    "cost": {
      "amount": 50000,
      "currency_code": "USD"
    },
    "destination_country_hs_codes": [
      {
        "destination_country_code": "<string>",
        "hs_code": "<string>"
      }
    ]
  },
  "dimensions": {
    "depth": 123,
    "width": 123,
    "height": 123
  }
}
'
import requests

url = "https://api.loopreturns.com/api/v1/products/{productId}/product-variants"

payload = {
"external_id": "<string>",
"name": "<string>",
"sku": "<string>",
"weight_grams": 123,
"barcode": "<string>",
"price": {
"amount": 50000,
"currency_code": "USD"
},
"images": ["<string>"],
"options": [
{
"position": 123,
"value": "<string>"
}
],
"logistics_information": {
"origin_country_code": "<string>",
"origin_region_code": "<string>",
"default_hs_code": "<string>",
"requires_shipping": True,
"cost": {
"amount": 50000,
"currency_code": "USD"
},
"destination_country_hs_codes": [
{
"destination_country_code": "<string>",
"hs_code": "<string>"
}
]
},
"dimensions": {
"depth": 123,
"width": 123,
"height": 123
}
}
headers = {
"X-Authorization": "<api-key>",
"Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'PUT',
headers: {'X-Authorization': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
external_id: '<string>',
name: '<string>',
sku: '<string>',
weight_grams: 123,
barcode: '<string>',
price: {amount: 50000, currency_code: 'USD'},
images: ['<string>'],
options: [{position: 123, value: '<string>'}],
logistics_information: {
origin_country_code: '<string>',
origin_region_code: '<string>',
default_hs_code: '<string>',
requires_shipping: true,
cost: {amount: 50000, currency_code: 'USD'},
destination_country_hs_codes: [{destination_country_code: '<string>', hs_code: '<string>'}]
},
dimensions: {depth: 123, width: 123, height: 123}
})
};

fetch('https://api.loopreturns.com/api/v1/products/{productId}/product-variants', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.loopreturns.com/api/v1/products/{productId}/product-variants",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'external_id' => '<string>',
'name' => '<string>',
'sku' => '<string>',
'weight_grams' => 123,
'barcode' => '<string>',
'price' => [
'amount' => 50000,
'currency_code' => 'USD'
],
'images' => [
'<string>'
],
'options' => [
[
'position' => 123,
'value' => '<string>'
]
],
'logistics_information' => [
'origin_country_code' => '<string>',
'origin_region_code' => '<string>',
'default_hs_code' => '<string>',
'requires_shipping' => true,
'cost' => [
'amount' => 50000,
'currency_code' => 'USD'
],
'destination_country_hs_codes' => [
[
'destination_country_code' => '<string>',
'hs_code' => '<string>'
]
]
],
'dimensions' => [
'depth' => 123,
'width' => 123,
'height' => 123
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Authorization: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.loopreturns.com/api/v1/products/{productId}/product-variants"

payload := strings.NewReader("{\n \"external_id\": \"<string>\",\n \"name\": \"<string>\",\n \"sku\": \"<string>\",\n \"weight_grams\": 123,\n \"barcode\": \"<string>\",\n \"price\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"images\": [\n \"<string>\"\n ],\n \"options\": [\n {\n \"position\": 123,\n \"value\": \"<string>\"\n }\n ],\n \"logistics_information\": {\n \"origin_country_code\": \"<string>\",\n \"origin_region_code\": \"<string>\",\n \"default_hs_code\": \"<string>\",\n \"requires_shipping\": true,\n \"cost\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"destination_country_hs_codes\": [\n {\n \"destination_country_code\": \"<string>\",\n \"hs_code\": \"<string>\"\n }\n ]\n },\n \"dimensions\": {\n \"depth\": 123,\n \"width\": 123,\n \"height\": 123\n }\n}")

req, _ := http.NewRequest("PUT", url, payload)

req.Header.Add("X-Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.put("https://api.loopreturns.com/api/v1/products/{productId}/product-variants")
.header("X-Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"external_id\": \"<string>\",\n \"name\": \"<string>\",\n \"sku\": \"<string>\",\n \"weight_grams\": 123,\n \"barcode\": \"<string>\",\n \"price\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"images\": [\n \"<string>\"\n ],\n \"options\": [\n {\n \"position\": 123,\n \"value\": \"<string>\"\n }\n ],\n \"logistics_information\": {\n \"origin_country_code\": \"<string>\",\n \"origin_region_code\": \"<string>\",\n \"default_hs_code\": \"<string>\",\n \"requires_shipping\": true,\n \"cost\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"destination_country_hs_codes\": [\n {\n \"destination_country_code\": \"<string>\",\n \"hs_code\": \"<string>\"\n }\n ]\n },\n \"dimensions\": {\n \"depth\": 123,\n \"width\": 123,\n \"height\": 123\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.loopreturns.com/api/v1/products/{productId}/product-variants")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["X-Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"external_id\": \"<string>\",\n \"name\": \"<string>\",\n \"sku\": \"<string>\",\n \"weight_grams\": 123,\n \"barcode\": \"<string>\",\n \"price\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"images\": [\n \"<string>\"\n ],\n \"options\": [\n {\n \"position\": 123,\n \"value\": \"<string>\"\n }\n ],\n \"logistics_information\": {\n \"origin_country_code\": \"<string>\",\n \"origin_region_code\": \"<string>\",\n \"default_hs_code\": \"<string>\",\n \"requires_shipping\": true,\n \"cost\": {\n \"amount\": 50000,\n \"currency_code\": \"USD\"\n },\n \"destination_country_hs_codes\": [\n {\n \"destination_country_code\": \"<string>\",\n \"hs_code\": \"<string>\"\n }\n ]\n },\n \"dimensions\": {\n \"depth\": 123,\n \"width\": 123,\n \"height\": 123\n }\n}"

response = http.request(request)
puts response.read_body
{
  "product_variant": {
    "id": 2,
    "external_id": "<string>",
    "sku": "<string>",
    "name": "<string>",
    "weight_grams": 123,
    "barcode": "<string>",
    "product": {
      "id": 2,
      "external_id": "<string>",
      "sku": "<string>",
      "name": "<string>"
    },
    "price": {
      "amount": 50000,
      "currency_code": "USD"
    },
    "images": [
      "<string>"
    ],
    "inventories": [
      {
        "id": 2,
        "available_count": 123,
        "location": {
          "id": 2,
          "external_id": "<string>",
          "name": "<string>"
        }
      }
    ],
    "options": [
      {
        "position": 123,
        "value": "<string>"
      }
    ],
    "logistics_information": {
      "origin_country_code": "<string>",
      "origin_region_code": "<string>",
      "default_hs_code": "<string>",
      "requires_shipping": true,
      "cost": {
        "amount": 50000,
        "currency_code": "USD"
      },
      "destination_country_hs_codes": [
        {
          "destination_country_code": "<string>",
          "hs_code": "<string>"
        }
      ]
    },
    "dimensions": {
      "depth": 123,
      "width": 123,
      "height": 123
    }
  }
}
"<unknown>"

Authorizations

X-Authorization
string
header
required

API Scope: "Product (write)"

Path Parameters

productId
integer
required

The unique Loop identifier of the parent product.

Example:

1234567890

Body

application/json
external_id
string
required

The identifier used by an external source to identify the product variant.

Maximum string length: 64
Example:

"564400c7-7a6b-4f29-b6a5-7bb580b2992c"

name
string
required

The name of the product variant.

Example:

"Classic Brown Dress Shoes - Size 12"

sku
string | null

:The SKU of the product variant."

Maximum string length: 255
Example:

"SHOES-US44-M-Brwn"

weight_grams
integer | null

The weight of the product variant in grams.

Example:

440

barcode
string | null

The barcode of the product variant.

Maximum string length: 255
Example:

712345000019

price
object | null

The price of the product variant in minor units, such as cents, with its corresponding currency.

Example:
{ "amount": 50000, "currency_code": "USD" }
images
string<uri>[] | null

An array of URLs which reference images of the product variant.

Minimum string length: 1
options
ProductVariantOption · object[] | null

An array of optional features or characteristics of the product variant that can be selected by the customer.

logistics_information
ProductVariantLogisticsInformation · object | null

The logistics information for the product variant such as code classification, shipping, and cost.

dimensions
ProductVariantDimensions · object | null

The dimensions of the product variant, interpreted as inches. Optional and nullable. When provided, depth, width, and height are all required. Omit dimensions to leave any stored dimensions untouched, or send null to delete the stored dimensions.

Response

Success

product_variant
ProductVariantResponse · object