Salsify Products API
The Products API from Salsify — 5 operation(s) for products.
The Products API from Salsify — 5 operation(s) for products.
openapi: 3.2.0
info:
title: Salsify Products API
version: '1.0'
description: 'Operations tagged Products across 2 of this provider''s published API definitions: salsify-api-settings-openapi.json, salsify-write-operations-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://app.salsify.com/api/v1/orgs
security:
- sec0: []
tags:
- name: Products
paths:
/{org_id}/products/{salsify:id}:
servers:
- url: https://app.salsify.com/api/v1/orgs
get:
summary: Read Product Record
description: ''
operationId: read-product-record
parameters:
- name: org_id
in: path
description: Salsify organization's unique identifier. Visit your Salsify organization and pull from the URL path, immediately following /orgs/
schema:
type: string
required: true
- name: salsify:id
in: path
description: Salsify product ID
schema:
type: string
required: true
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"salsify:id\": \"102918\",\n \"salsify:created_at\": \"2016-02-29T20:42:44.488Z\",\n \"salsify:updated_at\": \"2017-11-28T17:24:45.515Z\",\n \"salsify:version\": 61,\n \"salsify:relations_updated_at\": \"2016-11-07T20:09:53.188Z\",\n \"salsify:profile_asset_id\": null,\n \"salsify:parent_id\": \"MCS269\",\n \"salsify:system_id\": \"s-999-999-999-999\",\n \"Product ID\": \"102918\",\n \"Product Name\": \"Jetsetter Carry On Roller - Purple\",\n \"Main Image\": \"8d538dcbfd2d5547f7080f2408e7457e96c0451a\",\n \"UPC\": \"143287212918\",\n \"Certifications\": \"TSA-Approved\",\n \"Assembly Country of Origin\": \"US\",\n \"Component Country of Origin\": \"China\",\n \"Warnings\": \"<p>WARNING: To avoid danger of suffocation, keep inner plastic bag away from babies and children. Do not use bag in cribs, beds, carriages or play pens. This bag is not a toy.</p>\",\n \"Active Date\": [\n \"2015-05-01\",\n \"2017-10-17\"\n ],\n \"HTML Description\": \"<p>The 21\\\" Spinner is part of the Jetsetter Collection. Pack away any travel worries and woes with the efficient design of the Jettsetter rolling bag. Features top and side carrying handles for easy lifting, dual-tube handle with push-button extension. Maneuvers easily on four 360 degree wheels. Easy upright rolling for minimal arm strain. Jetset in style!</p>\\n<ul>\\n\\t<li>Constructed of 100% polycarbonate material.</li>\\n\\t<li>Four spinner wheels provide a silent and smooth roll.</li>\\n\\t<li>Fully-lined interior with two compartments for organized packing.</li>\\n</ul>\",\n \"Link\": \"http://salsify.com\",\n \"YouTube video\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n \"Formatted Retail Price\": \"$100.74\",\n \"Formatted Base Wholesale Price\": \"$89.45\",\n \"Sellable Package Length - Metric\": \"54.991\",\n \"Formatted MSRP\": \"$110.99\",\n \"Variant Type\": \"Color\",\n \"Manufacturer\": \"Wildflower, LLC\",\n \"Sellable Package Width - Metric\": \"52.5018\",\n \"Sellable Package Height - Metric\": \"63.1444\",\n \"Warranty Length (in years)\": \"5\",\n \"salsify:relations\": [\n {\n \"relation_type\": \"Cross-Sell\",\n \"salsify:target_product_id\": \"241029\",\n \"salsify:created_at\": \"2016-11-07T20:09:36.914Z\",\n \"salsify:updated_at\": \"2016-11-07T20:09:36.914Z\"\n }\n ],\n \"salsify:digital_assets\": [\n {\n \"salsify:id\": \"8d538dcbfd2d5547f7080f2408e7457e96c0451a\",\n \"salsify:url\": \"http://images.salsify.com/image/upload/s--u92Eqptx--/u4lc6fg1w17qzturwna3.jpg\",\n \"salsify:name\": \"purple-carryon.jpg\",\n \"salsify:created_at\": \"2016-02-28T00:23:28.777Z\",\n \"salsify:updated_at\": \"2017-05-21T03:18:00.302Z\",\n \"salsify:status\": \"completed\",\n \"salsify:asset_height\": 2000,\n \"salsify:asset_width\": 2000,\n \"salsify:asset_resource_type\": \"image\",\n \"salsify:filename\": \"purple-carryon.jpg\",\n \"salsify:bytes\": 231018,\n \"salsify:format\": \"jpg\",\n \"salsify:etag\": \"593ea8d4b29d40c1ed7ef339966a6408\",\n \"salsify:system_id\": \"s-d94cfcde-cb76-403a-80d3-1d6cbfaa48d9\",\n \"Brand\": \"Jetsetter\",\n \"Color\": \"Purple\"\n }\n ]\n}"
schema:
type: object
properties:
salsify:id:
type: string
example: '102918'
salsify:created_at:
type: string
example: '2016-02-29T20:42:44.488Z'
salsify:updated_at:
type: string
example: '2017-11-28T17:24:45.515Z'
salsify:version:
type: integer
example: 61
default: 0
salsify:relations_updated_at:
type: string
example: '2016-11-07T20:09:53.188Z'
salsify:profile_asset_id: {}
salsify:parent_id:
type: string
example: MCS269
salsify:system_id:
type: string
example: s-999-999-999-999
Product ID:
type: string
example: '102918'
Product Name:
type: string
example: Jetsetter Carry On Roller - Purple
Main Image:
type: string
example: 8d538dcbfd2d5547f7080f2408e7457e96c0451a
UPC:
type: string
example: '143287212918'
Certifications:
type: string
example: TSA-Approved
Assembly Country of Origin:
type: string
example: US
Component Country of Origin:
type: string
example: China
Warnings:
type: string
example: '<p>WARNING: To avoid danger of suffocation, keep inner plastic bag away from babies and children. Do not use bag in cribs, beds, carriages or play pens. This bag is not a toy.</p>'
Active Date:
type: array
items:
type: string
example: '2015-05-01'
HTML Description:
type: string
example: "<p>The 21\" Spinner is part of the Jetsetter Collection. Pack away any travel worries and woes with the efficient design of the Jettsetter rolling bag. Features top and side carrying handles for easy lifting, dual-tube handle with push-button extension. Maneuvers easily on four 360 degree wheels. Easy upright rolling for minimal arm strain. Jetset in style!</p>\n<ul>\n\t<li>Constructed of 100% polycarbonate material.</li>\n\t<li>Four spinner wheels provide a silent and smooth roll.</li>\n\t<li>Fully-lined interior with two compartments for organized packing.</li>\n</ul>"
Link:
type: string
example: http://salsify.com
YouTube video:
type: string
example: https://www.youtube.com/watch?v=dQw4w9WgXcQ
Formatted Retail Price:
type: string
example: $100.74
Formatted Base Wholesale Price:
type: string
example: $89.45
Sellable Package Length - Metric:
type: string
example: '54.991'
Formatted MSRP:
type: string
example: $110.99
Variant Type:
type: string
example: Color
Manufacturer:
type: string
example: Wildflower, LLC
Sellable Package Width - Metric:
type: string
example: '52.5018'
Sellable Package Height - Metric:
type: string
example: '63.1444'
Warranty Length (in years):
type: string
example: '5'
salsify:relations:
type: array
items:
type: object
properties:
relation_type:
type: string
example: Cross-Sell
salsify:target_product_id:
type: string
example: '241029'
salsify:created_at:
type: string
example: '2016-11-07T20:09:36.914Z'
salsify:updated_at:
type: string
example: '2016-11-07T20:09:36.914Z'
salsify:digital_assets:
type: array
items:
type: object
properties:
salsify:id:
type: string
example: 8d538dcbfd2d5547f7080f2408e7457e96c0451a
salsify:url:
type: string
example: http://images.salsify.com/image/upload/s--u92Eqptx--/u4lc6fg1w17qzturwna3.jpg
salsify:name:
type: string
example: purple-carryon.jpg
salsify:created_at:
type: string
example: '2016-02-28T00:23:28.777Z'
salsify:updated_at:
type: string
example: '2017-05-21T03:18:00.302Z'
salsify:status:
type: string
example: completed
salsify:asset_height:
type: integer
example: 2000
default: 0
salsify:asset_width:
type: integer
example: 2000
default: 0
salsify:asset_resource_type:
type: string
example: image
salsify:filename:
type: string
example: purple-carryon.jpg
salsify:bytes:
type: integer
example: 231018
default: 0
salsify:format:
type: string
example: jpg
salsify:etag:
type: string
example: 593ea8d4b29d40c1ed7ef339966a6408
salsify:system_id:
type: string
example: s-d94cfcde-cb76-403a-80d3-1d6cbfaa48d9
Brand:
type: string
example: Jetsetter
Color:
type: string
example: Purple
'400':
description: '400'
content:
application/json:
examples:
Result:
value: '{}'
schema:
type: object
properties: {}
deprecated: false
x-readme:
code-samples:
- language: curl
code: "curl -X GET \\\n https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products/102918 \\\n -H 'authorization: Bearer YOUR-AUTH-TOKEN' \\\n \n# where org_id = s-999-999-999-999, salsify:id=102918, api_token = YOUR-AUTH-TOKEN"
- language: ruby
code: 'require ''uri''
require ''net/http''
url = URI("https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products/102918")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
request["authorization"] = ''Bearer YOUR-AUTH-TOKEN''
response = http.request(request)
puts response.read_body
# where org_id = s-999-999-999-999, salsify:id=102918, api_token = YOUR-AUTH-TOKEN'
- language: python
code: "import http.client\n\nconn = http.client.HTTPSConnection(\"app.salsify.com\")\n\nheaders = {\n 'authorization': \"Bearer YOUR-AUTH-TOKEN\",\n }\n\nconn.request(\"GET\", \"/api/v1/orgs/s-999-999-999-999/products/102918\", headers=headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n\n# where org_id = s-999-999-999-999, salsify:id=102918, api_token = YOUR-AUTH-TOKEN"
samples-languages:
- curl
- ruby
- python
tags:
- Products
/{org_id}/products:
servers:
- url: https://app.salsify.com/api/v1/orgs
get:
summary: Bulk Read Products
description: ''
operationId: bulk-read-products
parameters:
- name: filter
in: query
description: Limit the scope of products returned from the endpoint. Details on how to build filters are available [here](https://developers.salsify.com/reference/salsify-filtering-language-syntax)
schema:
type: string
- name: page
in: query
description: Page number
schema:
type: integer
format: int32
- name: per_page
in: query
description: Number of results per page
schema:
type: integer
format: int32
default: null
- name: org_id
in: path
description: Salsify organization's unique identifier. Visit your Salsify organization and pull from the URL path, immediately following /orgs/
schema:
type: string
required: true
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"data\": [\n {\n \"salsify:id\": \"4a4393f6-54d7-4963-a3c0-b3a083c2440c\",\n \"Name\": \"My Product\"\n }\n ],\n \"meta\": {\n \"per_page\": 100,\n \"cursor\": null,\n \"total_entries\": 1,\n \"current_page\": 1\n }\n}"
Empty Response:
value: "{\n \"data\": [],\n \"meta\": {\n \"per_page\": 100,\n \"cursor\": null,\n \"total_entries\": 0\n }\n}"
schema:
oneOf:
- type: object
properties:
data:
type: array
items:
type: object
properties:
salsify:id:
type: string
example: 4a4393f6-54d7-4963-a3c0-b3a083c2440c
Name:
type: string
example: My Product
meta:
type: object
properties:
per_page:
type: integer
example: 100
default: 0
cursor: {}
total_entries:
type: integer
example: 1
default: 0
current_page:
type: integer
example: 1
default: 0
- title: Empty Response
type: object
properties:
data:
type: array
meta:
type: object
properties:
per_page:
type: integer
example: 100
default: 0
cursor: {}
total_entries:
type: integer
example: 0
default: 0
'422':
description: '422'
content:
application/json:
examples:
Invalid Filter:
value: "{\n \"errors\": [\n \"Filter is invalid\"\n ]\n}"
Result Window Exceeded:
value: "{\n \"errors\": [\n \"result_window limit of 10025 exceeded 10000\"\n ]\n}"
schema:
oneOf:
- title: Invalid Filter
type: object
properties:
errors:
type: array
items:
type: string
example: Filter is invalid
- title: Result Window Exceeded
type: object
properties:
errors:
type: array
items:
type: string
example: result_window limit of 10025 exceeded 10000
deprecated: false
tags:
- Products
delete:
summary: Bulk Delete Products
description: ''
operationId: bulk-delete-products
parameters:
- name: org_id
in: path
description: The Salsify organization's unique identifier. Visit your Salsify organization and pull from the URL path, immediately following /orgs/
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
type: object
required:
- product_id
properties:
product_id:
type: string
description: Unique value that identifies product and stored in the property that holds the product identifier role in Salsify. Send as an array of product ID values; property id label is not sent.
responses:
'204':
description: '204'
content:
text/plain:
examples:
Result:
value: Returned when content is successfully updated in Salsify.
'422':
description: '422'
content:
application/json:
examples:
Result:
value: "{\n \"errors\": [\n \"Updates must be applied to existing assets.\"\n ]\n}"
schema:
type: object
properties:
errors:
type: array
items:
type: string
example: Updates must be applied to existing assets.
deprecated: false
x-readme:
code-samples:
- language: curl
code: "curl -X DELETE \\\n https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products \\\n -H 'Authorization: Bearer YOUR-AUTH-TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '[\"123\",\"456\"]'\n \n # where org_id = s-999-999-999-999, salsify:id= My New Product, api_token = YOUR-AUTH-TOKEN"
- language: ruby
code: 'require ''uri''
require ''net/http''
url = URI("https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Delete.new(url)
request["Authorization"] = ''Bearer YOUR-AUTH-TOKEN''
request["Content-Type"] = ''application/json''
request.body = "[\"123\",\"456\"]"
response = http.request(request)
puts response.read_body
# where org_id = s-999-999-999-999, salsify:id= My New Product, api_token = YOUR-AUTH-TOKEN'
- language: python
code: "import http.client\n\nconn = http.client.HTTPConnection(\"app.salsify.com\")\n\npayload = \"[\\\"123\\\",\\\"456\\\"]\"\n\nheaders = {\n 'Authorization': \"Bearer YOUR-AUTH-TOKEN\",\n 'Content-Type': \"application/json\"\n }\n\nconn.request(\"DELETE\", \"api/v1/orgs/s-999-999-999-999/products\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n\n# where org_id = s-999-999-999-999, salsify:id= My New Product, api_token = YOUR-AUTH-TOKEN"
samples-languages:
- curl
- ruby
- python
tags:
- Products
post:
summary: Bulk Create Products
description: ''
operationId: bulk-create-products
parameters:
- name: org_id
in: path
description: The Salsify organization's unique identifier. Visit your Salsify organization and pull from the URL path, immediately following /orgs/
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
type: object
required:
- product_ID
properties:
product_ID:
type: string
description: Property ID of the property that is set as the product ID role in Salsify. Product ID value cannot begin with `=`, `_`, or `salsify`. Must be unique, and is case sensitive.
product_name:
type: string
description: Property ID for the property that is set as the product name role in Salsify. Product name will be left blank if not included.
additional_properties:
type: string
description: 'Additional information to store in properties associated with the product, sent in value pairs of `property_id : property_value`. Property IDs that don''t exist in the Salsify org will be created as default string data type. Accepts multiple property values as arrays.'
responses:
'201':
description: '201'
content:
application/json:
examples:
Result:
value: "[\n {\n \"salsify:id\": \"123\",\n \"salsify:created_at\": \"2018-10-04T22:30:03.910Z\",\n \"salsify:updated_at\": \"2018-10-04T22:30:03.910Z\",\n \"salsify:version\": 0,\n \"salsify:profile_asset_id\": null,\n \"salsify:system_id\": \"s-73cae1fc-f7c2-45c7-bce4-3cc8185ac5a5\",\n \"Product ID\": \"123\",\n \"Product Name\": \"Product 123\",\n \"Short Description\": \"These colorful Traveller headphones have a sturdy yet comfortable headband with padded ear cups for long term listening. The specially designed ear cups surround the ear cancelling out any ambient noise.\",\n \"Manufacturer\": \"Wildflower Imports, Inc.\"\n },\n {\n \"salsify:id\": \"456\",\n \"salsify:created_at\": \"2018-10-04T22:30:03.910Z\",\n \"salsify:updated_at\": \"2018-10-04T22:30:03.910Z\",\n \"salsify:version\": 0,\n \"salsify:profile_asset_id\": null,\n \"salsify:system_id\": \"s-d158ff9d-e327-4c8e-bc13-1139b250ed56\",\n \"Product ID\": \"456\",\n \"Product Name\": \"Product 456\",\n \"Material\": \"plastic\",\n \"Tags\": [\n \"headphones\",\n \"noise cancelling\"\n ],\n \"Manufacturer\": \"Wildflower Imports, Inc.\"\n }\n]"
schema:
type: array
items:
type: object
properties:
salsify:id:
type: string
example: '123'
salsify:created_at:
type: string
example: '2018-10-04T22:30:03.910Z'
salsify:updated_at:
type: string
example: '2018-10-04T22:30:03.910Z'
salsify:version:
type: integer
example: 0
default: 0
salsify:profile_asset_id: {}
salsify:system_id:
type: string
example: s-73cae1fc-f7c2-45c7-bce4-3cc8185ac5a5
Product ID:
type: string
example: '123'
Product Name:
type: string
example: Product 123
Short Description:
type: string
example: These colorful Traveller headphones have a sturdy yet comfortable headband with padded ear cups for long term listening. The specially designed ear cups surround the ear cancelling out any ambient noise.
Manufacturer:
type: string
example: Wildflower Imports, Inc.
'422':
description: '422'
content:
application/json:
examples:
Product ID property missing:
value: "{\n \"errors\": [\n \"Missing required property your-product-id\"\n ]\n}\n\n//where your-product-id is the property ID of the property that serves the salsify:id role."
Product ID value is not unique:
value: "{\n \"errors\": [\n \"A product already exists with the same id.\"\n ]\n}"
schema:
oneOf:
- title: Product ID property missing
type: object
properties:
errors:
type: array
items:
type: string
example: Missing required property your-product-id
- title: Product ID value is not unique
type: object
properties:
errors:
type: array
items:
type: string
example: A product already exists with the same id.
deprecated: false
x-readme:
code-samples:
- language: curl
code: "curl -X POST \\\n https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products \\\n -H 'Authorization: Bearer YOUR-AUTH-TOKEN' \\\n -H 'Content-Type: application/json' \\\n -d '[\n {\n \"Product ID\":\"123\",\n \"Product Name\":\"Product 123\",\n \"Short Description\":\"These colorful Traveller headphones have a sturdy yet comfortable headband with padded ear cups for long term listening. The specially designed ear cups surround the ear cancelling out any ambient noise.\"\n },\n {\n \"Product ID\":\"456\",\n \"Product Name\":\"Product 456\",\n \"Material\":\"plastic\",\n \"Tags\":[\"headphones\",\"noise cancelling\"]\n }\n]'\n\n# where org_id = s-999-999-999-999, Product ID is the system product identifier, and api_token = YOUR-AUTH-TOKEN"
- language: ruby
code: 'require ''uri''
require ''net/http''
url = URI("https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(url)
request["authorization"] = ''Bearer YOUR-AUTH-TOKEN''
request["content-type"] = ''application/json''
request.body = "{\n\t\"Product ID\":\"My New Product\",\n\t\"Product Name\":\"New Product Name\"\n}"
response = http.request(request)
puts response.read_body
# where org_id = s-999-999-999-999, Product ID is the system product identifier, and api_token = YOUR-AUTH-TOKEN'
- language: python
code: "import http.client\n\nconn = http.client.HTTPConnection(\"app.salsify.com\")\n\npayload = \"[\\n {\\n \\\"Product ID\\\":\\\"123\\\",\\n \\\"Product Name\\\":\\\"Product 123\\\",\\n \\\"Short Description\\\":\\\"These colorful Traveller headphones have a sturdy yet comfortable headband with padded ear cups for long term listening. The specially designed ear cups surround the ear cancelling out any ambient noise.\\\"\\n },\\n {\\n \\\"Product ID\\\":\\\"456\\\",\\n \\\"Product Name\\\":\\\"Product 456\\\",\\n \\\"Material\\\":\\\"plastic\\\",\\n \\\"Tags\\\":[\\\"headphones\\\",\\\"noise cancelling\\\"]\\n }\\n]\"\n\nheaders = {\n 'Authorization': \"Bearer YOUR-AUTH-TOKEN\",\n 'Content-Type': \"application/json\",\n\n }\n\nconn.request(\"POST\", \"api,v1,orgs,s-492247e8-0e24-47e9-8af5-d07defe563dc,products\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))\n\n# where org_id = s-999-999-999-999, Product ID is the system product identifier, and api_token = YOUR-AUTH-TOKEN"
samples-languages:
- curl
- ruby
- python
tags:
- Products
put:
summary: Bulk Update Products
description: ''
operationId: bulk-update-products
parameters:
- name: org_id
in: path
description: The Salsify organization's unique identifier. Visit your Salsify organization and pull from the URL path, immediately following /orgs/
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
type: object
required:
- product_id
properties:
product_id:
type: string
description: Value to identify product, stored in property with unique product identifier role in your Salsify organization.
properties:
type: string
description: 'Properties can be added in value pairs. {property_id} : {property_value} where property_id is a Salsify property, and property_value is the corresponding property value. If property_id does not exist in org, property will be created.'
responses:
'204':
description: '204'
content:
text/plain:
examples:
Result:
value: Returned when content is successfully updated in Salsify.
'404':
description: '404'
content:
text/plain:
examples:
Result:
value: Returned when salsify:id does not exist or org ID is incorrect.
'422':
description: '422'
content:
application/json:
examples:
Result:
value: "{\n \"errors\": [\n [\n \"Product '123' does not exist.\"\n ],\n []\n ]\n}"
schema:
type: object
properties:
errors:
type: array
items:
type: array
items:
type: string
example: Product '123' does not exist.
deprecated: false
x-readme:
code-samples:
- language: curl
code: "curl -X PUT \\\n https://app.salsify.com/api/v1/orgs/s-999-999-999-999/products \\\n -H 'Authorization: Bearer YOUR-AUTH-TOKEN' \\\n -H 'Cache-Control: no-cache' \\\n -H 'Content-Type: application/json' \\\n -d '[\n\t{\n \"Product ID\":\"123\",\n \"Product Name\":\"My Test Product'\\''s Name\",\n \"Brand\": null\n\t},\n\t{\n \"Product ID\":\"456\",\n \"Pr
# --- truncated at 32 KB (56 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/salsify/refs/heads/main/openapi/salsify-products-api-openapi.yml