Introduction
Welcome to the Jasper Standard PIM v1 API documentation.
We have provided examples for command line use as well as via our PHP SDK. You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
Authentication
Environment & base URL
# Replace {hash} and {region} with the values for your PIM
curl "https://{hash}.{region}.jasperpim.com/api/v1/ping" \
-H "Authorization: Bearer {token}"
Every API request targets a base URL of the form:
https://{hash}.{region}.jasperpim.com/api/v1/...
{hash}is the per-tenant PIM identifier (e.g.sxd50nab34). Each PIM has its own hash; the same token is not valid against another tenant's hash.{region}is the data-center region the PIM lives in.
Your account representative provides the {hash} and {region} values when your PIM is provisioned.
Token rotation
API tokens are issued and rotated by your account representative. If a token is rotated, the previous value stops working immediately and any client using it will receive a 401 Unauthorized. Update the token in your client and retry; no other change is needed.
A 401 Unauthorized response from the API generally means one of:
- the token has been rotated or revoked,
- the token is being sent against the wrong tenant hash, or
- the
Authorizationheader is missing or malformed.
API token
# With shell, you can just pass the correct header with each request
curl "https://{hash}.{region}.jasperpim.com/api/v1/ping"
-H "Authorization: Bearer {token}"
# Note: when entering your curl request on the command line, add all options (such as -H, -d, -X etc) on the same line
Make sure to replace
tokenwith your API token.
Jasper uses API keys to allow access to the API. Contact your account representative to receive a key for your PIM.
Jasper expects for the API key to be included in all API requests to the server in a header that looks like the following:
Authorization: Bearer {token}
Release History
This section records changes to the v1 API itself: endpoints added or removed, parameters added or changed, and responses that changed status code or shape.
It does not cover PIM application features. The Release Notes page inside your PIM covers those.
Dates are the date the change reached production, not the date it was written.
6.00.00 - 6 August 2026
New parameters
| Parameter | Endpoints | Description |
|---|---|---|
| brand_id | Get All Products, Get All Products (Lite), Get All Products by Version |
Filters the list to products belonging to one brand. Use the id from Get All Brands. |
| version | Get All Brands |
Returns the language version of every brand on the page, the same data Get a Version of a Brand returns for a single brand. |
Both are optional. Omitting them leaves the existing behaviour unchanged.
Changed response codes
Five malformed request shapes returned 500 before this release and now return
422. A request that was already valid is unaffected.
| Endpoint | Condition |
|---|---|
POST /exports |
profile_id missing from the body |
POST /brands/<BRANDID>/channel/<CHANNELID> |
web_id missing from the body |
POST /categories/<CATEGORYID>/channel/<CHANNELID> |
web_id missing from the body |
PUT and POST /products/<PRODUCTID>/barcodes/upsert |
barcodes missing, or not an array |
POST and PUT /products/<ID>/attributes |
payload not an object, attribute_id missing, or values missing, empty or not an array of objects |
If you were treating a 500 from these endpoints as a retryable server fault,
they are now a client error and retrying will not change the result.
Newly documented
These endpoints were already available and are unchanged. They simply had no entry in this documentation before.
Get a Specific Attribute Set AttributeGet a Specific Option Set OptionGet Product Relation Attributes for a Single Version
Corrected documentation
The response example for Get Product Relation Attributes previously showed a
flat list of attribute rows. The endpoint returns a map nested first by version
ID and then by attribute ID, and the example now shows that. The endpoint
itself did not change; only the documentation was wrong.
The Product Attributes section described id as the attribute identifier in the
response. The field is named attribute_id, and the property table now says so.
The type list omitted json, markdown and calculated, which are now
included.
Update a Specific Product Attribute showed its response wrapped in
product_attributes. That endpoint wraps its response in data, and the
example now shows that.
Create a Product Attribute did not say that it creates only, and did not list
the 422 returned when the attribute already holds a value for the version
being written. Both are now documented, along with the placement of
version_id, which is read from the top level of the attribute object and
ignored inside values. None of these endpoints changed; only the
documentation was wrong or incomplete.
Admin
Ping
curl "https://{hash}.{region}.jasperpim.com/api/v1/ping" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"time" : "Tue Feb 7 19:05:03 UTC 2017"
}
This endpoint returns the current PIM server time.
Ping Properties
| Property | Description |
|---|---|
| time | Current server time |
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/ping
Query Parameters
None.
Attributes
Attribute Properties
| Property | Description |
|---|---|
| id | Jasper Attribute ID |
| name | Attribute name (must be unique) |
| type | (enum) Attribute type (allowed values: selectbox, date, datetime, text, textarea, multiselect, json, markdown) |
| slug | Slugified attribute name |
| note | User information about the attribute |
| length | (integer) Maximum length for the attribute value |
| display_group_id | ID of the display group used for UI grouping (responses) |
| display_group_name | Name of the display group (read only) |
| sort_order | (integer) The sort order for display |
| publish | (boolean) Whether to publish the attribute |
| version_id | The ID of the version |
| typeValuesArray | (array) Type values for select-type attributes (read only) |
| created_at | Time the attribute was created (read only) |
| updated_at | Time the attribute was updated (read only) |
Get All Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attributes": [
{
"id": 1,
"name": "Brand",
"type": "text",
"display_group_id": null,
"sort_order": 0,
"slug": "Brand",
"publish": true,
"typeValuesArray": []
},
{
"id": 2,
"name": "Country",
"type": "multiselect",
"display_group_id": null,
"sort_order": 0,
"slug": "Country",
"publish": true,
"typeValuesArray": [
{
"id": 1,
"attribute_id": 2,
"value": "Brazil",
"slug": "Brazil",
"sort_order": 1,
"version_id": 0
},
{
"id": 2,
"attribute_id": 2,
"value": "Canada",
"slug": "Canada",
"sort_order": 2,
"version_id": 0
},
{
"id": 3,
"attribute_id": 2,
"value": "France",
"slug": "France",
"sort_order": 3,
"version_id": 0
},
{
"id": 4,
"attribute_id": 2,
"value": "USA",
"slug": "USA",
"sort_order": 4,
"version_id": 0
}
]
}
]
}
This endpoint retrieves all attributes.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes
Get All Attributes By Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/version/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attributes": [
{
"id": 1,
"name": "Marca",
"type": "text",
"display_group_id": null,
"sort_order": 0,
"slug": "Brand",
"publish": true,
"typeValuesArray": []
},
{
"id": 2,
"name": "Pais",
"type": "multiselect",
"display_group_id": null,
"sort_order": 0,
"slug": "Country",
"publish": true,
"typeValuesArray": [
{
"id": 6,
"attribute_id": 2,
"value": "Brasil",
"slug": "Brasil",
"sort_order": 1,
"version_id": 1,
"master_attribute_type_value_id": 1
},
{
"id": 17,
"attribute_id": 2,
"value": "Canada",
"slug": "Canada",
"sort_order": 2,
"version_id": 1,
"master_attribute_type_value_id": 2
},
{
"id": 18,
"attribute_id": 2,
"value": "França",
"slug": "França",
"sort_order": 3,
"version_id": 1,
"master_attribute_type_value_id": 3
},
{
"id": 19,
"attribute_id": 2,
"value": "Estados Unidos",
"slug": "Estados Unidos",
"sort_order": 4,
"version_id": 1,
"master_attribute_type_value_id": 4
}
]
}
]
}
This endpoint retrieves all attributes of the version.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| VERSION_ID | The ID of the version |
Get a Specific Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute": {
"id": 1,
"name": "Brand",
"type": "text",
"display_group_id": null,
"note": null,
"length": null,
"sort_order": 0,
"slug": "Brand",
"publish": true,
"typeValuesArray": []
}
}
This endpoint retrieves a specific attribute.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to retrieve |
Get a Specific Attribute by Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/1/version/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute": {
"id": 1,
"name": "Marca",
"type": "text",
"display_group_id": null,
"note": null,
"length": null,
"sort_order": 0,
"slug": "Brand",
"publish": true,
"typeValuesArray": []
}
}
This endpoint retrieves a specific attribute by version.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to retrieve |
| VERSION_ID | The ID of the version |
Create an Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes" \
-X POST \
-d '{
"name": "Shipment Type",
"type": "text",
"sort_order": 3,
"publish": false
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute" : {
"id" : 3,
"name": "Shipment Type",
"type": "text",
"sort_order": 3,
"publish": false
}
}
This endpoint creates a new attribute.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attributes
Update a Specific Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2" \
-X PUT \
-d '{
"name":"Countries of origin"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute" : {
"id": 2,
"name": "Countries of origin",
"type" : "text",
"sort_order" : 2,
"publish" : true
}
}
This endpoint updates a specific attribute.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to update |
Update a Specific Attribute Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/version/1" \
-X PUT \
-d '{
"name":"PaÃs"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute": {
"id": 2,
"name": "Pais",
"type": "multiselect",
"display_group_id": null,
"note": null,
"length": null,
"sort_order": 0,
"slug": "Country",
"publish": true
}
}
This endpoint updates a specific attribute.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to update |
| VERSION_ID | The ID of the version |
Delete a Specific Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to delete |
Delete a Specific Attribute Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/version/<VERSION_ID>" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to delete |
| VERSION_ID | The ID of the version |
Search Attributes by Name
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/search" \
-X POST \
-d '{
"name": "Color"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute": {
"id": 1,
"name": "Color",
"slug": "color",
...
}
}
This endpoint searches for an attribute by exact name match. Returns a single attribute or an empty response if no match is found.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attributes/search
Request Body
| Parameter | Required | Description |
|---|---|---|
| name | yes | Exact attribute name to search for |
Attribute Type Values
Attribute Type Value Properties
| Property | Description |
|---|---|
| id | Jasper attribute type value ID |
| attribute_id | ID of the attribute to which the type value belongs |
| value | Type value (e.g. for drop down list) |
| slug | Slugified type value |
| sort_order | (integer) Display sort order |
| version_id | The ID of the version |
| created_at | Time the type value was created (read only) |
| updated_at | Time the type value was updated (read only) |
Get All Attribute Type Values
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/1/type_values" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_values" :
[
{
"id": 1,
"attribute_id": 1,
"value" : "Yes"
},
{
"id": 2,
"attribute_id": 1,
"value" : "No"
}
]
}
This endpoint retrieves all attribute type values for a specific attribute.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute whose type values to retrieve |
Get All Attribute Type Values by Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/1/type_values/version/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_values" :
[
{
"id": 1,
"attribute_id": 1,
"value" : "Sim"
},
{
"id": 2,
"attribute_id": 1,
"value" : "Não"
}
]
}
This endpoint retrieves all attribute type values for a specific attribute.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute whose type values to retrieve |
| VERSION_ID | The ID of the version |
Get a Specific Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_value" : {
"id": 1,
"attribute_id": 2,
"value" : "Yes",
"version_id": 0
}
}
This endpoint retrieves the specific attribute type value.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute type value to retrieve |
| TYPE_VALUE_ID | The ID of the attribute whose type value to retrieve |
Get a Version of the Specific Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1/version/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_value" : {
"id": 1,
"attribute_id": 2,
"value" : "Sim",
"version_id": 1
}
}
This endpoint retrieves a version of the specific attribute type value.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute type value to retrieve |
| TYPE_VALUE_ID | The ID of the attribute whose type value to retrieve |
| VERSION_ID | The ID of the version |
Create an Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values" \
-X POST \
-d '{
"value" : "Blue"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_value" : {
"id": 3,
"attribute_id": 2,
"value" : "Blue"
}
}
This endpoint creates a new attribute type value.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute |
Update Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1" \
-X PUT \
-d '{
"value":"Country of origin"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_value": {
"id": 1,
"attribute_id": 2,
"value": "Country of origin",
"version_id": 0
}
}
This endpoint updates the specific attribute type value.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute |
| TYPE_VALUE_ID | The ID of the attribute type value |
Update the Version of the Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1/version/1" \
-X PUT \
-d '{
"value":"PaÃs"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_type_value": {
"id": 6,
"attribute_id": 2,
"value": "PaÃs",
"slug": null,
"version_id": 1
}
}
This endpoint updates a version of the specific attribute type value.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute |
| TYPE_VALUE_ID | The ID of the attribute type value |
| VERSION_ID | The ID of the version |
Delete a Specific Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute type value.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to delete |
| TYPE_VALUE_ID | The ID of the type value |
Delete a Version of the Specific Attribute Type Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/attributes/2/type_values/1/version/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a version of the specific attribute type value.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attributes/<ATTRIBUTE_ID>/type_values/<TYPE_VALUE_ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTE_ID | The ID of the attribute to delete |
| TYPE_VALUE_ID | The ID of the type value |
| VERSION_ID | The ID of the version |
Attribute Sets
Attribute Set Properties
| Property | Description |
|---|---|
| id | Jasper Attribute Set ID |
| name | Attribute Set name (must be unique) |
| sort_order | (integer) The sort order for display |
Get All Attribute Sets
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_sets" :
[
{
"id": 1,
"name": "Shoes",
"sort_order" : 1
},
{
"id": 2,
"name": "Bow Ties",
"sort_order" : 2
}
]
}
This endpoint retrieves all attribute sets.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets
Get a Specific Attribute Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set" : {
"id": 2,
"name": "Bow Ties",
"sort_order" : 2
}
}
This endpoint retrieves a specific attribute set.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the attribute set to retrieve |
Create an Attribute Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets" \
-X POST \
-d '{
"name" : "Gaskets",
"sort_order" : 3
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set" : {
"id" : 3,
"name" : "Gaskets",
"sort_order" : 3
}
}
This endpoint creates a new attribute set.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets
Update a Specific Attribute Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/2" \
-X PUT \
-d '{
"name":"Bikes"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set" : {
"id": 2,
"name": "Bikes",
"sort_order": 2
}
}
This endpoint updates a specific attribute set.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the attribute set to update |
Delete a Specific Attribute Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute set.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the attribute set to delete |
Search Attribute Sets by Name
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/search" \
-X POST \
-d '{
"name": "Default"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set": {
"id": 1,
"name": "Default",
...
}
}
This endpoint searches for an attribute set by exact name match. Returns a single attribute set or an empty response if no match is found.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/search
Request Body
| Parameter | Required | Description |
|---|---|---|
| name | yes | Exact attribute set name to search for |
Attribute Set Attributes
Attribute Set Attribute Properties
| Property | Description |
|---|---|
| id | Jasper attribute set attribute ID |
| attribute_id | ID of the attribute |
| attribute_set_id | ID of the attribute set |
Get All Attribute Set Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/1/attributes" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set_attributes" :
[
{
"id": 1,
"attribute_id": 1,
"attribute_set_id" : 1
},
{
"id": 2,
"attribute_id": 2,
"attribute_set_id" : 1
}
]
}
This endpoint retrieves all attribute set attributes for a specific attribute set.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ATTRIBUTESETID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTESETID | The ID of the attribute set whose attributes to retrieve |
Errors
| Status | Reason |
|---|---|
| 404 | The attribute set has no attributes, or does not exist |
Get a Specific Attribute Set Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/1/attributes/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"attribute_set_attribute" : {
"id": 2,
"attribute_set_id": 1,
"attribute_id": 2,
"sort_order": 1,
"created_at": "2026-05-09T14:10:55+00:00",
"updated_at": "2026-05-09T14:10:55+00:00"
}
}
This endpoint retrieves a single attribute as assigned to an attribute set.
Note that ATTRIBUTEID is the ID of the attribute itself, not the ID of the
assignment row returned as id.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ATTRIBUTESETID>/attributes/<ATTRIBUTEID>
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTESETID | The ID of the attribute set |
| ATTRIBUTEID | The ID of the attribute whose assignment to retrieve |
Errors
| Status | Reason |
|---|---|
| 404 | The attribute is not assigned to this attribute set |
Create an Attribute Set Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/2/attributes" \
-X POST \
-d '{
"attribute_id" : 3
}' \
-H "Authorization: Bearer {token}"
This endpoint creates a new attribute set attribute.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ATTRIBUTESETID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ATTRIBUTESETID | The ID of the attribute set |
Delete a Specific Attribute Set Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/2/attributes/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute set attribute.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/attribute_sets/<ATTRIBUTESETID>/attributes/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The attribute ID to delete |
| ATTRIBUTESETID | The ID of the attribute set whose attribute to delete |
Blocks
Block Properties
| Property | Description |
|---|---|
| id | Jasper Block ID |
| name | Block name |
| slug | Slug |
| content | Content |
Get All Blocks
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"blocks" :
[
{
"id": 1,
"name": "Main Script",
"slug": "main-script",
...
},
{
"id": 2,
"name": "Footer Script",
"slug": "footer-script"
...
}
]
}
This endpoint retrieves all blocks.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/blocks
Get a Specific Block
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"block" : {
"id": 2,
"name": "Footer Script",
"slug": "footer-script"
...
}
}
This endpoint retrieves a specific block.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/blocks/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the block to retrieve |
Create a Block
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks" \
-X POST \
-d '{
"name":"Header Script",
"slug":"header-script"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"block" : {
"id" : 3,
"name" : "Header Script",
"slug" : "header-script"
...
}
}
This endpoint creates a new block.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/blocks
Update a Specific Block
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks/2" \
-X PUT \
-d '{
"name":"Other Script"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"block" : {
"id": 2,
"name": "Other Script",
"slug": "Footer Script"
...
}
}
This endpoint updates a specific block.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/blocks/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the block to update |
Delete a Block
Deleting a block is not available through the API. The route exists but always
responds 501 Not Implemented, on every PIM and for every token.
{
"message": "Not implemented."
}
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/blocks/<ID>
Block Assets
Block Asset Properties
| Property | Description |
|---|---|
| id | Jasper block asset ID |
| block_id | ID of the block to which the asset belongs |
| uri | URI |
| alttext | Image alternate text |
| sort_order | Sort order of the asset |
| thumbnail | (boolean) Whether the asset is the thumbnail |
Get All Block Assets
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks/1/assets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"block_assets" :
[
{
"id": 1,
"block_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"sort_order": 1,
"thumbnail": 1
},
{
"id": 2,
"block_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"sort_order": 2,
"thumbnail": 0
}
]
}
This endpoint retrieves all block assets for a specific block.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/blocks/<BLOCKID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| BLOCKID | The ID of the block whose assets to retrieve |
Get a Specific Block Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/blocks/2/assets/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"block_asset" : {
"id": 1,
"block_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"sort_order": 1,
"thumbnail" : 1
}
}
This endpoint retrieves a specific block asset.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/blocks/<BLOCKID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the block asset to retrieve |
| BLOCKID | The ID of the block whose assets to retrieve |
Adding, Updating and Deleting Block Assets
Creating, updating and deleting block assets is not available through the API.
These routes exist but always respond 501 Not Implemented, on every PIM and
for every token. Block assets are read-only through the API; use the two
endpoints above to retrieve them.
{
"message": "Not implemented."
}
HTTP Requests
POST https://{hash}.{region}.jasperpim.com/api/v1/blocks/<BLOCKID>/assets
PUT https://{hash}.{region}.jasperpim.com/api/v1/blocks/<BLOCKID>/assets/<ID>
DELETE https://{hash}.{region}.jasperpim.com/api/v1/blocks/<BLOCKID>/assets/<ID>
Brands
Brand Properties
| Property | Description |
|---|---|
| id | Jasper Brand ID |
| name | Brand name (required on create, must be unique) |
| desc | Description |
| excluded | (boolean) Whether the brand is excluded from syndication |
| exclusion_start_date | (datetime) Start of the exclusion window |
| exclusion_end_date | (datetime) End of the exclusion window |
| exclusion_reason | Reason for the exclusion |
| seo_search_keywords | Comma separated list of search keywords |
| seo_meta_desc | Meta description |
| seo_meta_keywords | Meta keywords |
| seo_title | Meta page title |
| product_count | (integer) Number of products assigned to the brand (read only) |
| created_at | Time the brand was created (read only) |
| updated_at | Time the brand was updated (read only) |
Get All Brands
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brands" :
[
{
"id": 1,
"name": "Aurora",
"seo_title": "Aurora",
"seo_search_keywords": "shoes, running",
"product_count": 120,
...
},
{
"id": 2,
"name": "Northwind",
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/brands?page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/brands?page=3",
"prev": null,
"next": "https://{hash}.{region}.jasperpim.com/api/v1/brands?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 3,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/brands",
"per_page": 25,
"to": 25,
"total": 64
}
}
This endpoint retrieves all brands. Results are paginated (default 25 per page).
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/brands
Query Parameters
| Parameter | Description |
|---|---|
| page | The page of brands to retrieve |
| limit | Number of brands per page (default: 25) |
| version | (integer) Return the language version of every brand on the page, the same data Get a Version of a Brand returns for a single brand. Omit it, or pass 0, for the master version. |
Get a Specific Brand
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand" : {
"id": 2,
"name": "Northwind",
...
}
}
This endpoint retrieves a specific brand.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/brands/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand to retrieve |
Get a Version of a Brand
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2/version/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand" : {
"id": 2,
"name": "Northwind - V2",
...
}
}
This endpoint retrieves a specific version of a brand.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/brands/<ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand to retrieve |
| VERSION_ID | The ID of the version |
Create a Brand
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands" \
-X POST \
-d '{
"name":"New Northwind",
"seo_title":"New Northwind",
"seo_search_keywords":"shoes, apparel"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand" : {
"id" : 3,
"name": "New Northwind",
"seo_title": "New Northwind",
"seo_search_keywords": "shoes, apparel",
...
}
}
This endpoint creates a new brand.
name is required and must be unique; creating a brand with a name that already exists returns 422.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/brands
Update a Specific Brand
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2" \
-X PUT \
-d '{
"name":"New Northwind"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand" : {
"id" : 2,
"name": "New Northwind",
...
}
}
This endpoint updates a specific brand.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/brands/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand to update |
Delete a Specific Brand
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific brand.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/brands/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand to delete |
Search Brands by Name
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/search" \
-X POST \
-d '{
"name": "Acme"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand": {
"id": 1,
"name": "Acme",
...
}
}
This endpoint searches for a brand by exact name match. Returns a single brand or an empty response if no match is found.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/brands/search
Request Body
| Parameter | Required | Description |
|---|---|---|
| name | yes | Exact brand name to search for |
Brand Assets
Brand Asset Properties
| Property | Description |
|---|---|
| id | Jasper Brand asset ID |
| brand_id | ID of the brand to which the asset belongs |
| uri | URI |
| alttext | Image alternate text |
| thumbnail | (boolean) Whether the asset is the thumbnail |
Get All Brand Assets
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/1/assets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand_assets" :
[
{
"id": 1,
"brand_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
},
{
"id": 2,
"brand_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 0
}
]
}
This endpoint retrieves all brand assets for a specific brand.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| BRANDID | The ID of the brand whose assets to retrieve |
Get a Specific Brand Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2/assets/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand_asset" : {
"id": 1,
"brand_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint retrieves a specific brand asset.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand asset to retrieve |
| BRANDID | The ID of the brand whose assets to retrieve |
Create a Brand Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2/assets" \
-X POST \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand_asset" : {
"id": 42,
"brand_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint creates a new brand asset.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| BRANDID | The ID of the brand |
Update a Specific Brand Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2/assets/1" \
-X PUT \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"brand_asset" : {
"id": 1,
"brand_id" : 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint updates a specific brand asset.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand asset to update |
| BRANDID | The ID of the brand whose asset to update |
Delete a Specific Brand Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/2/assets/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific brand asset.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the brand asset to delete |
| BRANDID | The ID of the brand whose asset to delete |
Brand Channels
Update or Create Web ID
curl "https://{hash}.{region}.jasperpim.com/api/v1/brands/1/channel/2" \
-X POST \
-d '{
"web_id": 1
}' \
-H "Authorization: Bearer {token}"
This endpoint updates or creates a web ID in brand_channels. If a web_id already exists in the given channel for a different brand, the request returns 422.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/brands/<BRANDID>/channel/<CHANNELID>
URL Parameters
| Parameter | Description |
|---|---|
| BRANDID | The ID of the brand. |
| CHANNELID | The ID of the channel. |
Request Body
| Parameter | Required | Description |
|---|---|---|
| web_id | yes | The web ID to store for this brand and channel |
Errors
| Status | Reason |
|---|---|
| 400 | Request body was not valid JSON |
| 422 | web_id was missing from the request body |
| 422 | web_id already exists in this channel for a different brand |
Categories
Category Properties
| Property | Description |
|---|---|
| id | Jasper Category ID |
| parent_id | ID of the parent category (set to 0 if root category) (required) |
| parent_name | Name of the parent category (read only) |
| name | Category name (required, must be unique within its parent) |
| slug | Slugified category name |
| desc | Description |
| status | (string) Category status (allowed values: enabled, disabled) |
| is_visible | (boolean) Whether to display the category |
| sort_order | (integer) The sort order for display |
| attribute_sets | (array) Attribute set IDs (see the note below on how this field behaves on reads vs writes) |
| seo_meta_desc | Meta description |
| seo_meta_keywords | Meta keywords |
| seo_meta_title | Meta page title |
| search_keywords | Comma separated list of search keywords |
| is_smart | (boolean) Whether the category is a smart category (read only) |
| fqn | Fully qualified category name path (read only) |
| category_attributes | (array) Attributes with values assigned to the category (read only, always present) |
| channels | (array) Channels the category is assigned to, as {id, name} objects (read only) |
| assets | (array) Assets attached to the category (read only) |
| assets_thumbnail | (object) The category's thumbnail asset (read only) |
| image_alttext | Alt text of the thumbnail asset (read only) |
| attributes | (array) Array of attributes and the values assigned to the category, properties described below. Note: only present in certain requests when setting the query paramenter "?withAttributes=true" |
Category "attributes" properties
| Property | Description |
|---|---|
| id | Jasper attribute ID |
| name | Name of the attribute |
| slug | Slugified category name |
| displayName | Display name of the attribute |
| sortOrder | Sort order of the attribute |
| value | Value of the attribute assigned to the category |
Get All Categories
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories?withAttributes=true" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"categories" :
[
{
"id" : 1,
"parent_id" : null,
"name" : "Shopify Root",
"desc" : "Root for Shopify collections",
"attribute_sets" : [1, 4, 5],
"is_visible" : true,
"seo_meta_desc": "Meta description",
"seo_meta_keywords": "Keyword A, keyword B",
"seo_meta_title": "Shopify Root",
"search_keywords": "Keyword A, keyword B",
"created_at": "1999-12-31 23:59:59",
"updated_at": "2099-12-31 23:59:59",
"attributes": [
{
"id": 55,
"name": "Special Tags",
"slug": "special-tags",
"displayName": "Special Tags",
"value": "TagOne,TagTwo",
"sortOrder": 0
},
{
"id": 56,
"name": "Is promotional?",
"slug": "is-promotional",
"displayName": "Is promotional?",
"value": "false",
"sortOrder": 1
}
]
},
{
"id" : 2,
"parent_id" : 1,
"name" : "Shoes",
"desc" : "Shoes",
"attribute_sets" : [],
"is_visible" : true
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/categories?page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/categories?page=2",
"prev": null,
"next": "https://{hash}.{region}.jasperpim.com/api/v1/categories?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/categories",
"per_page": 25,
"to": 25,
"total": 42
}
}
This endpoint retrieves all categories. Results are paginated (default 25 per page).
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/categories
Query Parameters
| Parameter | Description |
|---|---|
| withAttributes | (optional) If set to "true" will also pull the attributes assigned to the category and their values. |
| page | (optional) The page of categories to retrieve |
| limit | (optional) Number of categories per page (default: 25) |
Get a Specific Category
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category" : {
"id" : 1,
"parent_id" : null,
"name" : "Shopify Root",
"desc" : "Root for Shopify collections",
"attribute_sets" : [1, 4, 5],
"is_visible" : true
...
}
}
This endpoint retrieves a specific category.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/categories/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category to retrieve |
Query Parameters
| Parameter | Description |
|---|---|
| withAttributes | (optional) If set to "true" will also pull the attributes assigned to the category and their values. |
Get a Version of a Category
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/1/version/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category" : {
"id" : 1,
"parent_id" : null,
"name" : "Shopify Root",
"desc" : "Root for Shopify collections",
"attribute_sets" : [1, 4, 5],
"is_visible" : true,
...
}
}
This endpoint retrieves a specific version of a category.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/categories/<ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category to retrieve |
| VERSION_ID | The ID of the version |
Create a Category
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories" \
-X POST \
-d '{
"parent_id" : 2
"name":"Men\'s"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category" : {
"id" : 3,
"parent_id" : 2,
"name" : "Men's",
...
}
}
This endpoint creates a new category.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/categories
Update a Specific Category
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/1" \
-X PUT \
-d '{
"name":"Shopify New Root"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category" : {
"id" : 1,
"parent_id" : null,
"name" : "Shopify New Root",
"desc" : "Root for Shopify collections",
"attribute_sets" : [1, 4, 5],
"is_visible" : true,
...
}
}
This endpoint updates a specific category.
Protected categories cannot be updated. parent_id cannot point to the category itself or to any of its descendants. The category name must remain unique within its parent.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/categories/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category to update |
Delete a Specific Category
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/categories/<ID>
Category Assets
Category Asset Properties
| Property | Description |
|---|---|
| id | Jasper Category asset ID |
| category_id | ID of the category to which the asset belongs |
| uri | URI |
| alttext | Image alternate text |
| thumbnail | (boolean) Whether the asset is the thumbnail |
Get All Category Assets
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/1/assets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category_assets" :
[
{
"id": 1,
"category_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
},
{
"id": 2,
"category_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 0
}
]
}
This endpoint retrieves all category assets for a specific category.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| CATEGORYID | The ID of the category whose assets to retrieve |
Get a Specific Category Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/2/assets/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category_asset" : {
"id": 1,
"category_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint retrieves a specific category asset.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category asset to retrieve |
| CATEGORYID | The ID of the category whose assets to retrieve |
Create a Category Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/2/assets" \
-X POST \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category_asset" : {
"id": 42,
"category_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint creates a new category asset.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| CATEGORYID | The ID of the category |
Update a Specific Category Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/2/assets/1" \
-X PUT \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"category_asset" : {
"id": 1,
"category_id" : 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint updates a specific category asset.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category asset to update |
| CATEGORYID | The ID of the category whose asset to update |
Delete a Specific Category Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/2/assets/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific category asset.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the category asset to delete |
| CATEGORYID | The ID of the category whose asset to delete |
Category Channels
Update or Create Web ID
curl "https://{hash}.{region}.jasperpim.com/api/v1/categories/680/channel/2" \
-X POST \
-d '{
"web_id": 1
}' \
-H "Authorization: Bearer {token}"
This endpoint updates or creates a web ID in category_channels. If a web_id already exists in the given channel for a different category, the request returns 422.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/categories/<CATEGORYID>/channel/<CHANNELID>
URL Parameters
| Parameter | Description |
|---|---|
| CATEGORYID | The ID of the category. |
| CHANNELID | The ID of the channel. |
Request Body
| Parameter | Required | Description |
|---|---|---|
| web_id | yes | The web ID to store for this category and channel |
Errors
| Status | Reason |
|---|---|
| 400 | Request body was not valid JSON |
| 422 | web_id was missing from the request body |
| 422 | web_id already exists in this channel for a different category |
Changelogs
The Changelogs endpoint returns a feed of recent change events recorded against PIM entities (products, categories, brands, etc.). Use it to power incremental sync clients that need to know what has changed since their last poll.
Changelog Properties
| Property | Description |
|---|---|
| id | Changelog row ID |
| updated_at | (datetime) When the change was recorded (ISO 8601, UTC) |
| entity_id | The ID of the entity that changed |
| entity_type | (string) The entity type that changed (valid values: product, brand, category, product_asset, attribute, attribute_set) |
| change_type | (string) The type of change (valid values: full, delete, reset) |
Get All Changelogs
curl "https://{hash}.{region}.jasperpim.com/api/v1/changelogs" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"changelogs" : [
{
"id": 12345,
"updated_at": "2026-05-09 14:10:55",
"entity_id": 678,
"entity_type": "product",
"change_type": "full"
},
{
"id": 12346,
"updated_at": "2026-05-09 14:11:02",
"entity_id": 9,
"entity_type": "brand",
"change_type": "full"
}
]
}
This endpoint returns a paginated list of changelog entries. Default page size is 250 entries.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/changelogs
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| limit | 250 | Page size (entries per response) |
| entity_type | (none) | Filter to a single entity type, e.g. product |
| updated_at | (none) | Return only entries with updated_at >= this value (ISO 8601 datetime) |
Get a Specific Changelog
curl "https://{hash}.{region}.jasperpim.com/api/v1/changelogs/12345" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"changelogs" : {
"id": 12345,
"updated_at": "2026-05-09 14:10:55",
"entity_id": 678,
"entity_type": "product",
"change_type": "full"
}
}
This endpoint returns a single changelog entry by ID.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/changelogs/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the changelog entry to retrieve |
Channels
Channel Properties
| Property | Description |
|---|---|
| id | Jasper Channel ID |
| channel_name | Channel name |
| sync | (boolean) Whether the channel is currently enabled |
| price_base | Code for price book base for use on channel |
| inventory_location | Code for base inventory for use on channel |
| version_id | ID of the version (language) the channel publishes; 0 is master |
| version_name | Name of that version (Master when version_id is 0) |
Channels are read-only
Get All Channels
curl "https://{hash}.{region}.jasperpim.com/api/v1/channels" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"channels" :
[
{
"id": 1,
"channel_name": "Shopify",
"sync": true,
"price_base": "USD",
"inventory_location": "NYC",
"version_id": 0,
"version_name": "Master"
},
{
"id": 2,
"channel_name": "BigCommerce",
"sync" : false,
"price_base": "CAD",
"inventory_location": "YYZ",
"version_id": 0,
"version_name": "Master"
}
]
}
This endpoint retrieves all channels.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/channels
Get a Specific Channel
curl "https://{hash}.{region}.jasperpim.com/api/v1/channels/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"channel" : {
"id": 2,
"channel_name": "BigCommerce",
"sync" : false,
"price_base": "CAD",
"inventory_location": "YYZ",
"version_id": 0,
"version_name": "Master"
}
}
This endpoint retrieves a specific channel.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/channels/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the channel to retrieve |
Display Groups
Display Group Properties
| Property | Description |
|---|---|
| id | Jasper Display Group Id |
| name | Display Group Name |
| sort_order | (integer) the sort order for display |
| in_navigation | (boolean) Whether to display the display group |
Get All Display Groups
curl "https://{hash}.{region}.jasperpim.com/api/v1/display-groups" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"display_groups" :
[
{
"id" : 1,
"name" : "Textiles",
"sort_order" : 1,
"in_navigation" : true
},
{
"id" : 2,
"name" : "Logos",
"sort_order" : 2,
"in_navigation" : false
}
]
}
This endpoint retrieves all display groups.
HTTP request
GET https://{hash}.{region}.jasperpim.com/api/v1/display-groups
Get a Specific Display Group
curl "https://{hash}.{region}.jasperpim.com/api/v1/display-groups/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"display_group": {
"id" : 1,
"name" : "Textiles",
"sort_order" : 1,
"in_navigation" : true
}
}
This endpoint retrieves a specific display group.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/display-groups/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the display group to retrieve |
Create a Display Group
curl "https://{hash}.{region}.jasperpim.com/api/v1/display-groups" \
-X POST \
-d '{
"name":"Technical Specifications"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"display_group" : {
"id" : 3,
"name" : "Technical Specifications"
}
}
This endpoint creates a new display group.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/display-groups
Update a Specific Display Group
curl "https://{hash}.{region}.jasperpim.com/api/v1/display-groups/1" \
-X PUT \
-d '{
"name":"Textile Classifications"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"display_group" : {
"id" : 1,
"name" : "Textiles",
"sort_order" : 1,
"in_navigation" : true
}
}
This endpoint updates a specific display group.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/display-groups/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the display group to update |
Exports
Get Export File and Status
curl "https://{hash}.{region}.jasperpim.com/api/v1/exports/2" \
-X GET \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"export" : {
"id": 1,
"profile_id": 1,
"status": "queued",
"filename": "something",
"file_url": "https://{hash}.{region}.jasperpim.com/exports/1/download",
"created_at": "2020-02-07T21:09:01+00:00"
}
}
This endpoint gets the export status and retrieves the exported file.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/exports/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the export to check status and retrieve file |
Create an Export
curl "https://{hash}.{region}.jasperpim.com/api/v1/exports" \
-X POST \
-d '{
"profile_id": 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"export" : {
"id": 2,
"profile_id": 1,
"status": "queued",
"filename": null,
"file_url": "https://{hash}.{region}.jasperpim.com/exports/2/download",
"created_at": "2026-05-09T14:10:55+00:00"
}
}
This endpoint queues a new export job for the given import/export profile. The export starts in queued state; poll GET /exports/{id} to check progress and retrieve the file_url once status is done. Possible status values: queued, processing, done, failed.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/exports
Request Body
| Parameter | Required | Description |
|---|---|---|
| profile_id | yes | The ID of the import/export profile to run |
Errors
| Status | Reason |
|---|---|
| 400 | Request body was not valid JSON |
| 404 | No profile exists with the given profile_id |
| 422 | profile_id was missing from the request body |
Generic Entities
Generic Entity Properties
| Property | Description |
|---|---|
| id | Jasper generic entity ID |
| name | Generic entity name |
| description | Generic entity description |
| is_tree | (boolean) Whether to display the listing as a flat table or nested view |
| is_product_attribute | (boolean) Whether the generic entity is selectable in the product details |
| priority | Generic entity priority |
| publishable | (boolean) Whether the generic entity can be published to channels |
| display_on_navigation | (boolean) Whether the generic entity gets displayed on the navigation bar |
Get All Generic Entities
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"generic_entities" :
[
{
"id" : 1,
"name" : "Ambassador",
"description" : "Product Ambassador campaign",
"is_tree" : 1,
"is_product_attribute" : 0,
"priority" : 1,
"publishable" : 1,
"display_on_navigation" : 1,
"attributes" : []
},
{
"id" : 1,
"name" : "Lookbook",
"description" : "Stylized model shots",
"is_tree" : 0,
"is_product_attribute" : 1,
"priority" : 2,
"publishable" : 1,
"display_on_navigation" : 1,
"attributes" : []
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities?page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities",
"per_page": 250,
"to": 1,
"total": 1
}
}
This endpoint retrieves all generic entities.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/generic-entities
Optional URL Parameter
| Parameter | Description |
|---|---|
| Page number | page number |
Example: GET https://{hash}.{region}.jasperpim.com/api/v1/generic-entities?page=1
Generic entities are paginated in groups of 250
Get a Specific Generic Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"generic_entity" : {
"id" : 1,
"name" : "Ambassador",
"description" : "Product Ambassador campaign",
"is_tree" : 1,
"is_product_attribute" : 0,
"priority" : 1,
"publishable" : 1,
"display_on_navigation" : 1,
"attributes" : []
}
}
This endpoint retrieves a specific generic entity.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the generic entity to retrieve |
Create a Generic Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities" \
-X POST \
-d '{
"name" : "Designer",
"is_tree" : 0,
"display_on_navigation" : 1,
"publishable" : 0,
"is_product_attribute" : 0,
"priority" : 3
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"generic_entity" : {
"id" : 3,
"name" : "Designer",
"description" : null,
"parent_id" : null,
"is_tree" : 0,
"display_on_navigation" : 1,
"publishable" : 0,
"is_product_attribute" : 0,
"priority" : 3
}
}
This endpoint creates a new generic entity.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/generic-entities
Update a Specific Generic Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1" \
-X PUT \
-d '{
"name" : "Designer",
"is_tree" : 1,
"description" : "Product designer",
"display_on_navigation" : 0,
"publishable" : 1,
"is_product_attribute" : 1,
"priority" : 4
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"generic_entity" : {
"id" : 3,
"name" : "Designer",
"description" : "Product designer",
"parent_id" : null,
"is_tree" : 1,
"display_on_navigation" : 0,
"publishable" : 1,
"is_product_attribute" : 1,
"priority" : 3
}
}
This endpoint updates a specific generic entity.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the generic entity to update |
Delete a Specific Generic Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific generic entity.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the generic entity to delete |
Concrete Entities
Concrete Entity Properties
| Property | Description |
|---|---|
| id | Concrete entity ID |
| name | Concrete entity name |
| parent_id | ID of the parent concrete entity |
| generic_entity_id | ID of the generic entity to which the concrete entity is attached |
| priority | Concrete entity priority |
| slug | Concrete entity slug |
Get Generic Entity Concrete Entities
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"concrete_entities": [
{
"id": 1,
"name": "Summer Lookbook",
"priority": 1,
"parent_id": null,
"generic_entity_id": 2,
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities?page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities",
"per_page": 1000,
"to": 1,
"total": 1
}
}
This endpoint retrieves all concrete entities assigned to a specific generic entity.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<ID>/concrete-entities
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the generic entity from which you want to retrieve concrete entities` |
Generic entities are paginated in groups of 1000
Get a Specific Concrete Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"concrete_entity": {
"id": 1,
"name": "Summer Lookbook",
"priority": 1,
"parent_id": null,
"generic_entity_id": 1,
...
}
}
This endpoint retrieves a specific concrete entity within a specific generic entity.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<genID>/concrete-entities/<conID>
URL Parameters
| Parameter | Description |
|---|---|
| conID | The ID of the concrete entity |
| genID | The ID of the generic entity |
Create a Concrete Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities" \
-X POST \
-d '{
"name" : "Winter Lookbook",
"priority" : 2,
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"concrete_entity": {
"id": 1,
"name": "Winter Lookbook",
"priority": 2,
"parent_id": null,
"generic_entity_id": 1,
...
}
}
This endpoint creates a concrete entity for a generic entity
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<ID>/concrete-entities
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the generic entity for which you want to create a concrete entity |
Delete a Specific Concrete Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific concrete entity.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<genID>/concrete-entities/<conID>
URL Parameters
| Parameter | Description |
|---|---|
| conID | The ID of the concrete entity to delete |
| genID | The ID of the generic entity from which you're deleting the concrete entity |
Update a Concrete Entity
curl "https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/1/concrete-entities/1" \
-X PUT \
-d '{
"name" : "Summer Lookbook",
"priority" : 3,
"parent_id" : 2,
"generic_entity_id" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"concrete_entity": {
"id": 1,
"name": "Summer Lookbook",
"priority": 3,
"parent_id": 2,
"generic_entity_id": 1,
...
}
}
This endpoint updates a specific concrete entity.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/generic-entities/<genID>/concrete-entities/<conID>
URL Parameters
| Parameter | Description |
|---|---|
| conID | The ID of the concrete entity to update |
| genID | The ID of the generic entity to update |
Options
Option Properties
| Property | Description |
|---|---|
| id | Jasper Option ID |
| name | Option name (must be unique) |
| display_name | Display name of the option |
| slug | Slugified option name |
| created_at | Time the option was created (read only) |
| updated_at | Time the option was updated (read only) |
Get All Options
curl "https://{hash}.{region}.jasperpim.com/api/v1/options" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"options" :
[
{
"id": 1,
"name": "Size"
},
{
"id": 2,
"name": "Colour"
}
]
}
This endpoint retrieves all options.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/options
Get a Specific Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option" : {
"id": 2,
"name": "Colour"
}
}
This endpoint retrieves a specific option.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/options/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option to retrieve |
Create an Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/options" \
-X POST \
-d '{
"name": "Finish",
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option" : {
"id" : 3,
"name": "Finish"
}
}
This endpoint creates a new option.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/options
Update a Specific Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2" \
-X PUT \
-d '{
"name":"Type of Finish"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option" : {
"id": 2,
"name": "Type of Finish"
}
}
This endpoint updates a specific option.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/options/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option to update |
Delete a Specific Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"message": "Deleted."
}
This endpoint deletes a specific option.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/options/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option to delete |
Search Options by Name
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/search" \
-X POST \
-d '{
"name": "Size"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option": {
"id": 1,
"name": "Size",
...
}
}
This endpoint searches for an option by exact name match. Returns a single option or an empty response if no match is found.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/options/search
Request Body
| Parameter | Required | Description |
|---|---|---|
| name | yes | Exact option name to search for |
Option Values
Option Value Properties
| Property | Description |
|---|---|
| id | Jasper option value ID |
| optionId | ID of the option to which the value belongs (response key) |
| value | Value of the Option Value |
| label | Label of the Option Value |
| sortOrder | (integer) Sort order for the value (response key) |
| version_id | ID of the version (language) the value belongs to; 0 is master |
| versions | (object) Per-version variants of the value, keyed by version ID (read only) |
| createdAt | Time the value was created (read only) |
| updatedAt | Time the value was updated (read only) |
Get All Option Values
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/1/values" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_values" :
[
{
"id": 1,
"version_id": 0,
"optionId": 1,
"value" : "Yes",
"label": "Yes",
"sortOrder": 0,
"versions": {}
},
{
"id": 2,
"version_id": 0,
"optionId": 1,
"value" : "No",
"label": "No",
"sortOrder": 1,
"versions": {}
}
]
}
This endpoint retrieves all option values for a specific option.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/options/<OPTION_ID>/values
URL Parameters
| Parameter | Description |
|---|---|
| OPTION_ID | The ID of the option whose values to retrieve |
Get a Specific Option Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2/values/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_value" : {
"id": 1,
"version_id": 0,
"optionId": 2,
"value": "Yes",
"label": "Yes",
"sortOrder": 0,
"versions": {}
}
}
This endpoint retrieves a specific option value.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/options/<OPTION_ID>/values/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option value to retrieve |
| OPTION_ID | The ID of the option whose value to retrieve |
Create an Option Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2/values" \
-X POST \
-d '{
"value" : "Blue",
"label" : "Blue"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_value" : {
"id": 3,
"version_id": 0,
"optionId": 2,
"value": "Blue",
"label": "Blue",
"sortOrder": 0,
"versions": {}
}
}
This endpoint creates a new option value.
If a value with the same value already exists for the option, no new record is created; the existing option value is returned with status 200 instead of 201.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/options/<OPTION_ID>/values
URL Parameters
| Parameter | Description |
|---|---|
| OPTION_ID | The ID of the option |
Update a Specific Option Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2/values/1" \
-X PUT \
-d '{
"value": "Pink",
"label": "Pink"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_value" : {
"id": 1,
"version_id": 0,
"optionId": 2,
"value": "Pink",
"label": "Pink",
"sortOrder": 0,
"versions": {}
}
}
This endpoint updates a specific option value.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/options/<OPTION_ID>/values/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option value to update |
| OPTION_ID | The ID of the option whose value to update |
Delete a Specific Option Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/options/2/values/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific option value.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/options/<OPTION_ID>/values/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option value to delete |
| OPTION_ID | The ID of the option whose value to delete |
Option Sets
Option Set Properties
| Property | Description |
|---|---|
| id | Jasper Option Set ID |
| name | Option Set name |
Get All Option Sets
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_sets" :
[
{
"id": 1,
"name": "Shoes"
},
{
"id": 2,
"name": "Bow Ties"
}
]
}
This endpoint retrieves all option sets.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/option_sets
Get a Specific Option Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_set" : {
"id": 2,
"name": "Bow Ties"
}
}
This endpoint retrieves a specific option set.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option set to retrieve |
Create an Option Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets" \
-X POST \
-d '{
"name" : "Gaskets"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_set" : {
"id" : 3,
"name" : "Gaskets"
}
}
This endpoint creates a new option set.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/option_sets
Update a Specific Option Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/2" \
-X PUT \
-d '{
"name":"Bikes"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_set" : {
"id": 2,
"name": "Bikes"
}
}
This endpoint updates a specific option set.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option set to update |
Delete a Specific Option Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns a JSON structured like this:
{
"message": "Deleted."
}
This endpoint deletes a specific option set.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the option set to delete |
Option Set Options
Option Set Option Properties
| Property | Description |
|---|---|
| id | Jasper option set option ID |
| option_id | (integer) ID of the option |
| option_set_id | (integer) ID of the option set |
| sort_order | (integer) Sort order for the option within the option set |
Get All Option Set Options
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/1/options" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_set_options" :
[
{
"id": 1,
"option_id": 1,
"option_set_id": 1
},
{
"id": 2,
"option_id": 2,
"option_set_id": 1
}
]
}
This endpoint retrieves all option set options for a specific option set.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<OPTIONSETID>/options
URL Parameters
| Parameter | Description |
|---|---|
| OPTIONSETID | The ID of the option set whose options to retrieve |
Get a Specific Option Set Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/1/options/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"option_set_option" : {
"id": 2,
"option_set_id": 1,
"option_id": 2,
"sort_order": 1,
"created_at": "2026-05-09T14:10:55+00:00",
"updated_at": "2026-05-09T14:10:55+00:00"
}
}
This endpoint retrieves a single option as assigned to an option set.
Note that OPTIONID is the ID of the option itself, not the ID of the
assignment row returned as id.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<OPTIONSETID>/options/<OPTIONID>
URL Parameters
| Parameter | Description |
|---|---|
| OPTIONSETID | The ID of the option set |
| OPTIONID | The ID of the option whose assignment to retrieve |
Errors
| Status | Reason |
|---|---|
| 403 | The option is not assigned to this option set, or does not exist |
Create/Update an Option Set Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/2/options" \
-X POST \
-d '{
"option_id" : 3,
"sort_order" : 2
}' \
-H "Authorization: Bearer {token}"
This endpoint creates a new option set option or updates an option set option.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<OPTIONSETID>/options
URL Parameters
| Parameter | Description |
|---|---|
| OPTIONSETID | The ID of the option set |
Delete a Specific Option Set Option
curl "https://{hash}.{region}.jasperpim.com/api/v1/option_sets/2/options/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns a JSON structured like this:
{
"message": "Deleted."
}
This endpoint deletes a specific option set option.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/option_sets/<OPTIONSETID>/options/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The option ID to delete |
| OPTIONSETID | The ID of the option set whose option to delete |
Pages
Page Properties
| Property | Description |
|---|---|
| id | Jasper Page ID |
| name | Page name |
| slug | Page slug |
| content | HTML Content |
| mobile_body | Mobile optimized HTML content |
| url | Page URL |
| has_mobile_version | (boolean) The page has a mobile version |
| is_customers_only | (boolean) The page is restricted to logged in customers |
| is_homepage | (boolean) The page is a homepage |
| is_visible | (boolean) The page is visible |
| seo_meta_desc | Meta description |
| seo_meta_keywords | Meta keywords |
| seo_meta_title | Meta page title |
| search_keywords | Comma separated list of search keywords |
Get All Pages
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"pages" :
[
{
"id": 1,
"name": "About Us",
"url": "/about-us/"
...
},
{
"id": 2,
"name": "Contact Us",
"url": "/contact-us/"
...
}
]
}
This endpoint retrieves all pages.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/pages
Get a Specific Page
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"page" : {
"id": 2,
"name": "Contact Us",
"url": "/contact-us/"
...
}
}
This endpoint retrieves a specific page.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/pages/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the page to retrieve |
Create a Page
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages" \
-X POST \
-d '{
"name":"Our History",
"url":"/our-history/",
"parent_id":"1"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"page" : {
"id" : 3,
"name" : "Our History",
"url" : "/our-history/"
...
}
}
This endpoint creates a new page.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/pages
Update a Specific Page
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages/2" \
-X PUT \
-d '{
"name":"Where We Are"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"page" : {
"id": 2,
"name": "Where We Are",
"url": "/contact-us/"
...
}
}
This endpoint updates a specific page.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/pages/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the page to update |
Delete a Page
Deleting a page is not available through the API. The route exists but always
responds 501 Not Implemented, on every PIM and for every token.
{
"message": "Not implemented."
}
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/pages/<ID>
Page Assets
Page Asset Properties
| Property | Description |
|---|---|
| id | Jasper page asset ID |
| page_id | ID of the page to which the asset belongs |
| uri | URI |
| alttext | Image alternate text |
| thumbnail | (boolean) Whether the asset is the thumbnail |
Get All Page Assets
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages/1/assets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"page_assets" :
[
{
"id": 1,
"page_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
},
{
"id": 2,
"page_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 0
}
]
}
This endpoint retrieves all page assets for a specific page.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/pages/<PAGEID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| PAGEID | The ID of the page whose assets to retrieve |
Get a Specific Page Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/pages/2/assets/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"page_asset" : {
"id": 1,
"page_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"thumbnail" : 1
}
}
This endpoint retrieves a specific page asset.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/pages/<PAGEID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the page asset to retrieve |
| PAGEID | The ID of the page whose assets to retrieve |
Adding, Updating and Deleting Page Assets
Creating, updating and deleting page assets is not available through the API.
These routes exist but always respond 501 Not Implemented, on every PIM and
for every token. Page assets are read-only through the API; use the two
endpoints above to retrieve them.
{
"message": "Not implemented."
}
HTTP Requests
POST https://{hash}.{region}.jasperpim.com/api/v1/pages/<PAGEID>/assets
PUT https://{hash}.{region}.jasperpim.com/api/v1/pages/<PAGEID>/assets/<ID>
DELETE https://{hash}.{region}.jasperpim.com/api/v1/pages/<PAGEID>/assets/<ID>
Products
Product Properties
| Property | Description |
|---|---|
| id | Jasper Product ID |
| name | Name |
| sku | Sku (must be unique) |
| product_url | Product URL |
| style_id | Style ID |
| brand_id | Brand ID |
| parent_id | Parent product ID |
| option_set_id | Option set ID |
| option_values | (array) Required for variant child products |
| is_bundle | Product is the top of a bundle |
| bundle_id | Bundle that product belongs to |
| categories | (array) Category objects |
| children | (array) Child product objects (READ ONLY) |
| is_visible | (boolean) Product is visible |
| enabled | (boolean) Product is enabled |
| desc_short | Master short description |
| desc_long | Master long description |
| prices | (array) Product price objects (READ ONLY) |
| inventory | (array) Product inventory objects (READ ONLY) |
Get All Products
curl "https://{hash}.{region}.jasperpim.com/api/v1/products?page=1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"products": [
{
"id": 1,
"name": "Red T-Shirt",
"sku": "RED1",
...
},
{
"id": 2,
"name": "Blue T-Shirt",
"sku": "BLUE1",
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/products?page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/products?page=6",
"prev": null,
"next": "https://{hash}.{region}.jasperpim.com/api/v1/products?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 6,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/products",
"per_page": 25,
"to": 25,
"total": 127
}
}
This endpoint show a collection of products (with attributes, categories, channels, product children and assets).
The default is to list 25 products per page (but you can change it using the "limit" parameter in the URL).
Also use the "page" parameter in the URL to navigate in the pagination of the product list.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products?page=1&limit=50
URL Parameters
| Parameter | Description |
|---|---|
| page | The page of the products |
| limit | The limit of products to retrieve |
| sku | Filter by exact SKU match |
| brand_id | Filter to products belonging to one brand. Use the id from Get All Brands. |
Get All Products (Lite)
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/lite?page=1&limit=25" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"products": [
{
"id": 1,
"name": "Red T-Shirt",
"sku": "RED1",
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/products/lite?limit=25&page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/products/lite?limit=25&page=6",
"prev": null,
"next": "https://{hash}.{region}.jasperpim.com/api/v1/products/lite?limit=25&page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 6,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/products/lite",
"per_page": 25,
"to": 25,
"total": 127
}
}
A lightweight version of the "Get All Products" endpoint optimized for bulk retrieval. Returns paginated products with only the relations you request via the with parameter, reducing response size and query load.
Child variants are returned under the key children (instead of variants used by the standard endpoint).
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/lite
Query Parameters
| Parameter | Description |
|---|---|
| page | Page number for pagination |
| limit | Number of products per page (default: 25) |
| sku | Filter by exact SKU match |
| brand_id | Filter to products belonging to one brand. Use the id from Get All Brands. |
| with | Comma-separated list of relations to include (see below) |
Allowed with values
| Value | Description |
|---|---|
| variants | Child/variant products |
| variants-attributes | Variant attributes |
| variants-prices | Variant prices |
| variants-inventory | Variant inventory |
| attributes | Product attributes |
| active-prices | Currently active prices |
| all-prices | All prices including inactive |
| inventory | Product inventory |
| generic-entities | Generic entity associations |
| related-products | Related product associations |
| tags | Product tags |
| assets | Product assets |
| categories | Product categories |
Get All Products by Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/version/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"products": [
{
"id": 1,
"name": "Tshirt Rouge",
"sku": "ts-rouge1",
...
},
{
"id": 2,
"name": "Tshirt Bleue",
"sku": "ts-bleue1",
...
}
],
"links": {
"first": "https://{hash}.{region}.jasperpim.com/api/v1/products/version/1?limit=25&page=1",
"last": "https://{hash}.{region}.jasperpim.com/api/v1/products/version/1?limit=25&page=2",
"prev": null,
"next": "https://{hash}.{region}.jasperpim.com/api/v1/products/version/1?limit=25&page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://{hash}.{region}.jasperpim.com/api/v1/products/version/1",
"per_page": 25,
"to": 25,
"total": 50
}
}
This endpoint shows a collection of versioned products with option of filtering out some products and/or adding some relations such as attributes, categories, product variant, assets, etc. to them.
Refer to the URL Optional Parameters below to check all the possible filters and/or relations to the endpoint.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/version/<VERSION_ID>?status=enabled&with=variants,assets,categories&limit=25&page=1
URL Required Parameters
| Parameter | Description |
|---|---|
| VERSION_ID | The ID of the version |
URL Optional Parameters
| Parameter | Description |
|---|---|
| sku | Filters the result by product SKU. |
| brand_id | Filters the result to products belonging to one brand. Use the id from Get All Brands. |
| type | Filters the type of products to be retrieved (allowed values: all, parents. default: parents). |
| status | Filters the type of products to be retrieved (allowed values: all, enabled, disabled. default: all). |
| with | Comma separated relation to be added to the product (allowed values: variants,variants-attributes,variants-prices,variants-inventory,attributes,active-prices,all-prices,inventory,generic-entities,related-products,tags,assets,categories) |
| limit | Limit the quantity of products at each request (default: 25). |
| page | Navigate through the pagination of product list (default: 1). |
Get a Specific Product by ID
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product": {
"id": 2,
"name": "Blue T-Shirt",
"sku": "TSHIRT-BLUE-2",
"product_url": "tshirt-blue",
"page_title": "Product page - Blue T-shirt",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint retrieves a specific product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to retrieve |
Get a Version of a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/version/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product": {
"id": 2,
"name": "T-shirt bleu",
"sku": "BLEU-TSHIRT-2",
"product_url": "tshirt-bleu",
"page_title": "Fiche produit - t-shirt bleu",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint retrieves a specific version of product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to retrieve |
| VERSION_ID | The ID of the version |
Get a Specific Product by SKU
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/sku/12345" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product": {
"id": 2,
"name": "Blue T-Shirt",
"sku": "12345",
"product_url": "tshirt-blue",
"page_title": "Product page - Blue T-shirt",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint retrieves a specific product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/sku/<SKU>
URL Parameters
| Parameter | Description |
|---|---|
| SKU | The SKU of the product to retrieve |
Create a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products" \
-X POST \
-d '{
"name":"Green T-Shirt",
"sku":"GREEN1",
"enabled": 1,
"is_visible": 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product" : {
"id" : 3,
"name" : "Green T-Shirt",
"sku" : "GREEN-1",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint creates a new product.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products
Create a Child Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products" \
-X POST \
-d '{
"name": "T-Shirt",
"sku": "GREEN1",
"enabled": 1,
"is_visible": 1,
"option_values": [
{
"option_id": 1,
"option_value_id": 2
},
{
"option_id": 2,
"option_value_id": 5
}
],
"parent_id": 5
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product" : {
"id" : 4,
"name":"T-Shirt",
"sku":"GREEN1",
"parent_id": 5,
"updated_at": "2020-03-12",
"enabled": 1,
"is_visible": 1,
"is_bundle": 0,
"featured": 0,
"shipping_weight": "0.00",
"shipping_override": "inherit",
"special_order": 0,
"generic_entities": [],
"product_attributes": [],
"related_products": [],
"categories": [],
"channels": [],
"barcodes": [],
"prices": [],
"inventory": [],
"children": []
}
}
This endpoint creates a new product.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products
Update a Specific Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2" \
-X PUT \
-d '{
"name":"Bluish T-Shirt",
"sku":"BLUE1",
"product_url":"bluish-tshirt"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product" : {
"id": 2,
"name": "Bluish T-Shirt",
"sku": "BLUE1",
"product_url": "bluish-tshirt",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint updates a specific product.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to update |
Update a Specific Version of a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/version/2" \
-X PUT \
-d '{
"name":"Bleu T-Shirt",
"sku":"BLEU-TSHIRT-2",
"product_url":"bleu-tshirt"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product" : {
"id": 2,
"name": "Bleu T-Shirt",
"sku": "BLEU-TSHIRT-2",
"product_url": "bleu-tshirt",
"enabled": 1,
"is_visible": 1,
...
}
}
This endpoint updates a specific version of a product. If the product version does not exist (and the version is set up in your PIM), it creates a new product version.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to update |
| VERSION_ID | The ID of the version |
Delete a Specific Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific product.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to delete |
Delete a Specific Version of a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/version/2" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific version of a product.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/version/<VERSION_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to delete |
| VERSION_ID | The ID of the version |
Remove Child Product From Parent
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/123/remove-from-parent" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint remove a given child product from it's parent product. The child product will be unpublished as a result of this operation.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/remove-from-parent
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the child product |
Product Assets
Product Asset Properties
| Property | Description |
|---|---|
| id | Jasper Product asset ID |
| product_id | ID of the product to which the asset belongs |
| uri | URI |
| sort_order | Sort order |
| private | (boolean) |
| alttext | Image alternate text |
| name | Name of the Image |
| desc | Description of the Image |
| type | Type of the Image |
| thumbnail | (boolean) Whether the asset is the thumbnail |
Product Asset Channel Properties
| Property | Description |
|---|---|
| channel_id | ID of the channel or "default" |
| enabled | (boolean) Whether the asset is enabled or not in the channel |
| is_thumbnail | (boolean) Wheter the asset is the thumbnail for the channel |
Get All Product Assets
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/assets" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_assets" :
[
{
"id": 1,
"product_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Image alternate text",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 1,
...
},
{
"id": 2,
"product_id": 1,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Image alternate text",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 0,
...
}
]
}
This endpoint retrieves all product assets for a specific product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product whose assets to retrieve |
Query Parameters
| Parameter | Description |
|---|---|
| with_channel | (optional) If set to "true" then the request will also pull the product asset channel information. |
Get a Specific Product Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_asset" : {
"id": 1,
"product_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Image alternate text",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 1,
...
}
}
This endpoint retrieves a specific product asset.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to retrieve |
| PRODUCT_ID | The ID of the product whose assets to retrieve |
Query Parameters
| Parameter | Description |
|---|---|
| with_channel | (optional) If set to "true" then the request will also pull the product asset channel information. |
Create a Product Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets" \
-X POST \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_asset" : {
"id": 42,
"product_id": 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Image alternate text",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 1,
...
}
}
This endpoint creates a new product asset.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product |
Update a Specific Product Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1" \
-X PUT \
-d '{
"image_url": "https://cdnpim.com/coolimage.png",
"alttext": "Description of image",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 1
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_asset" : {
"id": 1,
"product_id" : 2,
"uri": "https://cdnpim.com/coolimage.png",
"alttext": "Image alternate text",
"name": "Name of the Image",
"desc": "Description of the Image",
"type": "Type of the Image",
"thumbnail" : 1,
...
}
}
This endpoint updates a specific product asset.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to update |
| PRODUCT_ID | The ID of the product whose asset to update |
Delete a Specific Product Asset
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific product asset.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to delete |
| PRODUCT_ID | The ID of the product whose asset to delete |
Get Product Asset Channel Data for ALL Channels
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1/channels" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_assets_channels" : {
"id": 1,
"channels": [
{
"channel_id": "default",
"enabled": true,
"is_thumbnail": true
},
{
"channel_id": 1,
"enabled": true,
"is_thumbnail": true
}
]
}
}
This endpoint retrieves product asset channel data for ALL channels.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>/channels
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to retrieve or "all" to get ALL assets at once |
| PRODUCT_ID | The ID of the product whose assets to retrieve |
Get Product Asset Channel Data for One Channel
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1/channels/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_assets_channels" : {
"id": 1,
"channels": {
"channel_id": 1,
"enabled": true,
"is_thumbnail": true
}
}
}
This endpoint retrieves product asset channel data for one channel.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>/channels/<CHANNEL_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to retrieve or "all" to get ALL assets at once |
| PRODUCT_ID | The ID of the product whose assets to retrieve |
| CHANNEL_ID | The ID of the channel or "default" |
Update Product Asset Channel Data for ALL Channels
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1/channels" \
-X PUT \
-d '{
"enabled": false,
"is_thumbnail": false
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_assets_channels" : {
"id": 1,
"channels": [
{
"channel_id": "default",
"enabled": false,
"is_thumbnail": false
},
{
"channel_id": 1,
"enabled": false,
"is_thumbnail": false
}
]
}
}
This endpoint updates product asset channel data for ALL channels.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>/channels
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to update or "all" to update ALL assets at once |
| PRODUCT_ID | The ID of the product whose assets to update |
Update Product Asset Channel Data for One Channel
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/assets/1/channels/1" \
-X PUT \
-d '{
"enabled": false,
"is_thumbnail": false
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_assets_channels" : {
"id": 1,
"channels": {
"channel_id": 1,
"enabled": false,
"is_thumbnail": false
}
}
}
This endpoint updates product asset channel data for one channel.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/assets/<ID>/channels/<CHANNEL_ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product asset to update or "all" to update ALL assets at once |
| PRODUCT_ID | The ID of the product whose assets to update |
| CHANNEL_ID | The ID of the channel or "default" |
Product Barcodes
Product Barcodes Properties
| Property | Description |
|---|---|
| id | Product barcode ID |
| product_id | ID of the product to which the barcode belongs |
| type | The type of this barcode (EAN, UPC-A, GTIN-13, ITF-14, Custom) |
| barcode | The barcode number |
| created_at | Datetime of the creation |
| updated_at | Datetime of the last update |
Get All Product Barcodes
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcodes" :
[
{
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789000",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-11T19:59:55+00:00"
},
{
"id": 2,
"product_id": 1,
"type": "ITF-14",
"barcode": "01234567891234",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-11T19:58:12+00:00"
}
]
}
This endpoint retrieves all product barcodes for a specific product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product whose barcodes to retrieve |
Create a Product Barcode
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes" \
-X POST \
-d '{
"type": "UPC-A",
"barcode": "123456789000"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcode": {
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789000",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-11T19:59:55+00:00"
}
}
This endpoint creates a new product barcode.
Note: For "UPC-A" we expect 12 digits. "ITF-14": 14 digits. "GTIN-13": 13 digits. "EAN": 13 digits. "Custom": any number of digits.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Update a Product Barcode
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes/1" \
-X PUT \
-d '{
"type": "UPC-A",
"barcode": "123456789123"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcode": {
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789123",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
}
}
This endpoint updates a given product barcode.
Note: For "UPC-A" we expect 12 digits. "ITF-14": 14 digits. "GTIN-13": 13 digits. "EAN": 13 digits. "Custom": any number of digits.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes/<BARCODEID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
| BARCODEID | The ID of the product barcode |
Delete a Product Barcode
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcode": {
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789123",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
}
}
This endpoint deletes a given product barcode.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes/<BARCODEID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
| BARCODEID | The ID of the product barcode |
Upsert Product Barcodes (with delete)
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes/upsert" \
-X PUT \
-d '{
"barcodes": [
{
"type": "UPC-A",
"barcode": "123456789123"
},
{
"type": "Custom",
"barcode": "0000444498765321"
}
]
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcodes": [
{
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789123",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
},
{
"id": 3,
"product_id": 1,
"type": "Custom",
"barcode": "0000444498765321",
"created_at": "2022-11-12T12:30:38+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
}
]
}
This endpoint upsert (update and/or insert) a list of given product barcodes. If a product has barcodes that were not touched by this operation then those are going to be DELETED. Only the barcodes present on the request payload will remain on the product.
Note: For "UPC-A" we expect 12 digits. "ITF-14": 14 digits. "GTIN-13": 13 digits. "EAN": 13 digits. "Custom": any number of digits.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes/upsert
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Errors
| Status | Reason |
|---|---|
| 422 | barcodes was missing from the request body, or was not an array |
Upsert Product Barcodes (without delete)
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/barcodes/upsert" \
-X POST \
-d '{
"barcodes": [
{
"type": "UPC-A",
"barcode": "123456789123"
},
{
"type": "Custom",
"barcode": "0000444498765321"
}
]
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"barcodes": [
{
"id": 1,
"product_id": 1,
"type": "UPC-A",
"barcode": "123456789123",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
},
{
"id": 2,
"product_id": 1,
"type": "ITF-14",
"barcode": "01234567891234",
"created_at": "2022-11-11T19:58:12+00:00",
"updated_at": "2022-11-11T19:58:12+00:00"
},
{
"id": 3,
"product_id": 1,
"type": "Custom",
"barcode": "0000444498765321",
"created_at": "2022-11-12T12:30:38+00:00",
"updated_at": "2022-11-12T12:30:38+00:00"
}
]
}
This endpoint upsert (update and/or insert) a list of given product barcodes. No barcode will be deleted with this endpoint.
Note: For "UPC-A" we expect 12 digits. "ITF-14": 14 digits. "GTIN-13": 13 digits. "EAN": 13 digits. "Custom": any number of digits.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/barcodes/upsert
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Errors
| Status | Reason |
|---|---|
| 422 | barcodes was missing from the request body, or was not an array |
Product Categories
Product Categories Properties
| Property | Description |
|---|---|
| id | Jasper Product category ID |
| parent_id | Category parent ID |
| name | Category name |
| desc | Category description |
| slug | Category slug |
| attribute_sets | (array) Attribute set IDs for the category |
| is_visible | (boolean) Whether to display the category |
| seo_meta_desc | Meta description |
| seo_meta_keywords | Meta keywords |
| seo_meta_title | Meta page title |
| search_keywords | Comma separated list of search keywords |
| created_at | Time the category was created (read only) |
| updated_at | Time the category was updated (read only) |
Get All Product Categories
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/categories" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_categories": [
{
"id": 1,
"parent_id": 0,
"name": "Clothes",
"desc": null,
"slug": "clothes",
...
},
{
"id": 5,
"parent_id": 1,
"name": "T-Shirts",
"desc": null,
"slug": "t-shirts",
...
}
]
}
This endpoint retrieves all categories assigned to a product, including smart categories.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/categories
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product |
Get a Specific Product Category
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/categories/5" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_categories": {
"id": 5,
"parent_id": 1,
"name": "T-Shirts",
"desc": null,
"slug": "t-shirts",
...
}
}
This endpoint retrieves a specific category assigned to a product. Returns 404 if the category is not assigned to the product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/categories/<CATEGORY_ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product |
| CATEGORY_ID | The ID of the category |
Assign a Category to a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/categories" \
-X POST \
-d '{
"category_id": "1"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_categories": {
"id": 1,
"parent_id": 0,
"name": "Clothes",
"desc": null,
"slug": "root",
...
}
}
This endpoint assigns a category to a product. If the category is already assigned, the request succeeds without creating a duplicate.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/categories
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product |
Remove a Category from a Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/categories/5" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint removes a category assignment from a product. Returns 404 if the category is not assigned to the product.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT_ID>/categories/<CATEGORY_ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT_ID | The ID of the product |
| CATEGORY_ID | The ID of the category to remove |
Product Prices
Product Price Properties
| Property | Description |
|---|---|
| id | Jasper Product price ID |
| product_id | ID of the product to which the price belongs |
| msrp | MSRP |
| map | Minimum Advertised Price |
| cost | Cost Price |
| sell_price | Selling price |
| from | (datetime) Price start date. On create, must use the exact format YYYY-MM-DD HH:MM:SS; defaults to the current time when omitted |
| to | (datetime) Price end date. On create, must use the exact format YYYY-MM-DD HH:MM:SS |
| currency | (string) Price currency code |
| tax_class_id | Tax class ID |
| author | Price author. Set by the system to API on create; any value sent is ignored |
| booktype | Pricebook Type. Set by the system on create (ProductPrice - Create or ProductPrice - BulkCreate); any value sent is ignored |
| price_book_code | Price book code |
| batch_id | Batch Import ID |
| sell_price_reason | Price over-ride reason |
| base | Price base (required) |
| source | Price source |
| is_expired | (boolean) Whether the price is expired (read only, computed) |
| is_future | (boolean) Whether the price starts in the future (read only, computed) |
| created_at | Time the price was created (read only) |
| updated_at | Time the price was updated (read only) |
Get All Product Prices
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/prices" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_prices" :
[
{
"id": 1,
"product_id": 1,
"msrp": 250.00,
"cost": 73.00,
"base": "US"
...
},
{
"id": 2,
"product_id": 2,
"msrp": 254.00,
"cost": 53.00,
"base": "US"
...
}
]
}
This endpoint retrieves all product prices for a specific product.
Each price includes computed is_future and is_expired flags relative to today's date. When more than one price record for the same base is active at the same time, only the newest record (highest ID) is reported as active; the older ones are returned with is_expired set to 1.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product whose prices to retrieve |
Get a Specific Product Price
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/prices/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_price" : {
"id": 2,
"product_id": 2,
"msrp": 254.00,
"cost": 53.00,
"base": "US"
...
}
}
This endpoint retrieves a specific product price.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product price to retrieve |
| PRODUCTID | The ID of the product whose prices to retrieve |
Create a Product Price
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/prices" \
-X POST \
-d '{
"msrp": 75.99,
"cost" : 10.00,
"base" : "US"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_price" : {
"id": 42,
"product_id": 3,
"msrp": 75.99,
"cost" : 10.00,
"base" : "US"
...
}
}
This endpoint creates a new product price.
Note: when creating a price, you must have at least one value for msrp, cost, map or sell_price
Validation on create:
fromandtomust use the exact formatYYYY-MM-DD HH:MM:SS(for example2026-07-21 00:00:00); any other date format returns422.fromdefaults to the current time when omitted.authorandbooktypeare set by the system (APIandProductPrice - Create); values sent for these fields are ignored.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Update a Specific Product Price
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/prices/1" \
-X PUT \
-d '{
"msrp": 99.99,
"cost" : 15.00,
"base" : "US"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_price" : {
"id": 1,
"product_id": 2,
"msrp": 99.99,
"cost" : 15.00,
"base" : "US"
...
}
}
This endpoint updates a specific product price.
On update, from and to accept any parseable date, but from must be today or later and to must be after both from and the current time.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
| ID | The ID of the product price to update |
Update Active Product Price
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/prices" \
-X PUT \
-d '{
"sell_price": 89.99,
"base" : "US"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_price" : {
"id": 42,
"product_id": 2,
"sell_price": 89.99,
"base" : "US"
...
}
}
This endpoint updates the currently active price for a product. The active price is the most recent price whose from and to date range includes the current time.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Create Product Prices in Bulk
curl "https://{hash}.{region}.jasperpim.com/api/v1/product_prices/bulk" \
-X POST \
-d '[
{
"sku":"4d0db189",
"msrp": null,
"map": null,
"cost": 49,
"sell_price": 99,
"base": "USD"
},
{
"sku":"3w1fd67f5s",
"msrp": null,
"map": null,
"cost": null,
"sell_price": 75,
"base": "USD"
},
{
"sku":"f9ef83cf1b54",
"msrp": null,
"map": null,
"cost": null,
"sell_price": 123,
"from": "2026-08-01 01:00:00",
"to": "2026-08-31 23:59:59",
"base": "CAD"
}
]' \
-H "Authorization: Bearer {token}"
Success response:
{
"status": 200,
"message": "Product prices updated successfully."
}
Error response:
{
"status": 422,
"error": "ValidationErrors",
"message": "One or more items in the request have validation errors.",
"details": [
{
"index": 1,
"errors": [
"You must have at least one price in your payload."
]
},
{
"index": 2,
"errors": [
"The sku field is required."
]
}
]
}
This endpoint creates new product prices in bulk.
Note: when creating a price, you must have at least one value for msrp, cost, map or sell_price
Each item requires a sku identifying the product. The same create validation applies per item: from and to must use the exact format YYYY-MM-DD HH:MM:SS, from defaults to the current time when omitted, and author / booktype are set by the system (API and ProductPrice - BulkCreate). If any item fails validation, no prices are created and the response lists the errors per item index.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/product_prices/bulk
Delete a Specific Product Price
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/prices/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific product price.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/prices/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product price to delete |
| PRODUCTID | The ID of the product |
Product Inventory
Product Inventory Properties
| Property | Description |
|---|---|
| id | Jasper Product inventory ID |
| product_id | ID of the product to which the inventory belongs |
| site | Site of inventory |
| bin | Bin |
| location | Location |
| type | Inventory type |
| count_on_hand | Count on hand |
| count_on_hold | Count on hold |
| source | Inventory source |
| batch_id | Batch ID from inventory loading |
Get All Product Inventories
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/inventory" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_inventory" :
[
{
"id": 1,
"product_id": 1,
"count_on_hand" : 42
...
},
{
"id": 2,
"product_id": 2,
"count_on_hand" : 52
...
}
]
}
This endpoint retrieves all product inventory for a specific product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/inventory
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product whose inventory to retrieve |
Get a Specific Product Inventory
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/inventory/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_inventory" : {
"id": 2,
"product_id": 2,
"count_on_hand" : 52
...
}
}
This endpoint retrieves a specific product inventory.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/inventory/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product inventory to retrieve |
| PRODUCTID | The ID of the product whose inventory to retrieve |
Create a Product Inventory
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/inventory" \
-X POST \
-d '{
"product_id": 3,
"count_on_hand": 75
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_inventory" : {
"id": 42,
"product_id": 3,
"count_on_hand": 75
...
}
}
This endpoint creates a new product inventory.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/inventory
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product |
Update a Specific Product Inventory
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/inventory/1" \
-X PUT \
-d '{
"count_on_hand": 22
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_inventory" : {
"id": 1,
"product_id" : 2,
"count_on_hand" : 22
...
}
}
This endpoint updates a specific product inventory.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/inventory/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product inventory to update |
| PRODUCTID | The ID of the product whose inventory to update |
Delete a Specific Product Inventory
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/inventory/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific product inventory.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/inventory/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product inventory to delete |
| PRODUCTID | The ID of the product whose inventory to delete |
Product Attributes
Product Attribute Properties
| Property | Description |
|---|---|
| attribute_id | Jasper Attribute ID |
| name | Attribute name (must be unique) |
| slug | Slugified Attribute name |
| user_defined_key | User Key |
| type | (enum) Attribute type (allowed values: selectbox, multiselect, text, textarea, date, datetime, json, markdown, calculated) |
| values | The values held for this attribute, one entry per version |
Product Attribute Value Properties
Each entry in values is the value held for one version.
| Property | Description |
|---|---|
| id | ID of this value row. Use it in the Update a Specific Product Attribute and Delete a Specific Product Attribute Value URLs |
| version_id | ID of the version (language) the value belongs to; 0 is master |
| value | The stored value |
Writing to a specific version
version_id belongs at the top level of the attribute object, next to
attribute_id. It is not read from inside values.
A request that puts version_id inside a values entry is still accepted, but
the field is ignored and the write falls back to the default of 0. It lands on
master rather than on the version you intended.
Writes to version 3:
{ "attribute_id": 1, "version_id": 3, "values": [{ "value": "No" }] }
Writes to master, because version_id is in the wrong place:
{ "attribute_id": 1, "values": [{ "value": "No", "version_id": 3 }] }
Get All Product Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_attributes" : [
{
"attribute_id" : 1,
"name" : "Attribute One",
"slug" : "attribute-one",
"user_defined_key" : "{}",
"type" : "text",
"values" : []
},
{
"attribute_id" : 2,
"name" : "Attribute Two",
"slug" : "attribute-two",
"user_defined_key" : "{}",
"type" : "selectbox",
"values" : [
{
"id" : 1,
"version_id" : 0,
"value" : "Selected"
}
]
}
]
}
This endpoint retrieves all product attributes.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product related with the attributes to retrieve |
Get A Product Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_attributes" : [
{
"attribute_id" : 1,
"name" : "Attribute One",
"slug" : "attribute-one",
"user_defined_key" : "{}",
"type" : "text",
"values" : [
{
"id" : 1,
"version_id" : 0,
"value" : "Text"
}
]
}
]
}
This endpoint retrieves a specific product attribute.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes/<AttributeID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product related with the specific attribute to retrieve |
| AttributeID | The ID of the attribute to retrieve |
Create a Product Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes" \
-X POST \
-d '{
"attribute_id" : 1,
"version_id" : 0,
"values" : [
{
"value" : "Text"
}
]
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_attributes" : {
"attribute_id" : 1,
"name" : "Attribute One",
"slug" : "attribute-one",
"user_defined_key" : "{}",
"type" : "text",
"values" : [
{
"id" : 1,
"version_id" : 0,
"value" : "Text"
},
{
"id" : 2,
"version_id" : 1,
"value" : "Texte"
}
]
}
}
This endpoint creates the value of a product attribute for one version.
It creates only. If the attribute already holds a value for that version_id,
the request returns 422 and writes nothing, even when the value being sent is
the same as the value already stored. To overwrite an existing value, use
Update many Product Attributes or Update a Specific Product Attribute.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
Errors
| Status | Reason |
|---|---|
| 422 | Request body was empty or not valid JSON |
| 422 | Payload was not an object, or attribute_id was missing |
| 422 | values was missing, empty, or not an array of objects |
| 422 | attribute_id is not an attribute in this PIM, or version_id is not a version in this PIM |
| 422 | A value already exists for this attribute_id and version_id |
| 422 | The value is not one of the available values of a selectbox or multiselect attribute |
| 422 | More than one value was sent for an attribute that is not a multiselect |
A 422 response carries an errors array naming each problem it found.
The already-exists message differs by attribute type. A selectbox returns
Selectbox Attribute Value already exists, a multiselect returns
Attribute Value already exists, and every other type returns
Attribute Value Version already exists.
Some releases return the selectbox message spelled Selextbox. It is the same
error and carries the same status code.
Update many Product Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes" \
-X PUT \
-d '[
{
"attribute_id":1,
"version_id":0,
"values":[
{
"value":"No"
}
]
},
{
"attribute_id":3,
"version_id":0,
"values":[
{
"value":"Yes"
}
]
}
]' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_attributes": [
{
"attribute_id": 1,
"name": "Attribute One",
"slug": "attribute-one",
"user_defined_key": null,
"type": "text",
"values": [
{
"id": 998,
"version_id": 0,
"value": "No"
}
]
},
{
"attribute_id": 3,
"name": "Attribute Three",
"slug": "attribute-three",
"user_defined_key": null,
"type": "text",
"values": [
{
"id": 999,
"version_id": 0,
"value": "Yes"
}
]
}
]
}
This endpoint updates or creates the values of several product attributes in one request.
The body is a list, even when it holds a single attribute. For each entry, the
existing value for that attribute_id and version_id is replaced. Values held
for other versions of the same attribute are left alone. An entry whose
version_id is omitted is written to master.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
Errors
| Status | Reason |
|---|---|
| 422 | Request body was empty or not valid JSON |
| 422 | Body was a single object instead of a list, or an entry was missing attribute_id |
| 422 | values was missing, empty, or not an array of objects |
A 422 response carries an errors array naming each problem it found.
Update a Specific Product Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes/1/values/1" \
-X PUT \
-d '{
"attribute_id" : 1,
"version_id" : 1,
"values" : [
{
"value" : "Text Update"
}
]
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"data" : {
"attribute_id" : 1,
"name" : "Attribute One",
"slug" : "attribute-one",
"user_defined_key" : "{}",
"type" : "text",
"values" : [
{
"id" : 1,
"version_id" : 0,
"value" : "Text"
},
{
"id" : 2,
"version_id" : 1,
"value" : "Text Update"
}
]
}
}
This endpoint updates one existing product attribute value in place.
Take AttributeValueID from the values array returned by
Get All Product Attributes. This endpoint checks that the version_id in the
body matches the version of that value row and returns 422 if it does not, so
it cannot write to a version you did not name. That makes it the safer choice
when a write has to land on one version.
Unlike every other endpoint in this section, the response is wrapped in data
rather than product_attributes.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes/<AttributeID>/values/<AttributeValueID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
| AttributeID | The ID of the attribute |
| AttributeValueID | The ID of the attribute value to update |
Errors
| Status | Reason |
|---|---|
| 422 | Request body was empty or not valid JSON |
| 422 | Payload was not an object, or attribute_id was missing |
| 422 | values was missing, empty, or not an array of objects |
| 422 | version_id does not match the version of the value named in the URL |
| 422 | The value is not one of the available values of a selectbox or multiselect attribute |
A 422 response carries an errors array naming each problem it found.
Delete All Product Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes all attributes for a specific product.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
Delete a Specific Product Attribute Value
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/attributes/1/values/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific product attribute value.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/attributes/<AttributeID>/values/<AttributeValueID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
| AttributeID | The ID of the attribute |
| AttributeValueID | The id of the attribute value to delete |
Product Assign Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/assigned-attributes" \
-X POST \
-d '{
"attribute_id" : 1
}' \
-H "Authorization: Bearer {token}"
This endpoint assigns a specific attribute to a product.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/assigned-attributes
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
Product Assign Attribute Set
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/assigned-attribute-sets" \
-X POST \
-d '{
"attribute_set_id" : 1
}' \
-H "Authorization: Bearer {token}"
This endpoint assigns a specific attribute set to a product.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/assigned-attribute-sets
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product |
Product Channels
Update or Create Web ID
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/680/channel/2" \
-X POST \
-d '{
"web_id": 1
}' \
-H "Authorization: Bearer {token}"
This endpoint updates or creates a web ID in product_channels.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCTID>/channel/<CHANNELID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCTID | The ID of the product. |
| CHANNELID | The ID of the channel. |
Product Relation Types
Product Relation Type Properties
| Property | Description |
|---|---|
| id | Jasper Product Relation Type ID |
| name | Product Relation Type name |
| description | Product Relation Type description |
| child_label | How the relation is labeled when saw from the products assigned in the relation. Example: Parent, Is a part of |
| parent_label | How the relation is labeled when saw from the product where the related are being assigned. Example: Children, Parts |
| relationship_cardinality | Controls how products can be assigned to a relation in different products |
| label | grouping label for product relation type |
Get All Product Relation Types
curl "https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_types" :
[
{
"id": 1,
"name": "Footwear",
"description": "Related footwear",
"child_label": "Is a part of",
"parent_label": null,
"relationship_cardinality": "many-to-many",
"created_at": null,
"updated_at": null,
"label": "shoes",
"deleted_at": null
},
{
"id": 2,
"name": "Athletic footwear",
"description": "Running and sports shoes",
"child_label": null,
"parent_label": "Parts",
"relationship_cardinality": "one-to-many",
"created_at": null,
"updated_at": null,
"label": "shoes",
"deleted_at": null
}
]
}
This endpoint retrieves all product relation types.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types
Get a Specific Product Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_type" : {
"id": 1,
"name": "Footwear",
"description": "Related footwear",
"child_label": "Is a part of",
"parent_label": null,
"relationship_cardinality": "many-to-many",
"created_at": null,
"updated_at": null,
"label": "shoes",
"deleted_at": null
}
}
This endpoint retrieves a specific product relation type.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product relation type to retrieve |
Create a Product Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types" \
-X POST \
-d '{
"name": "Jackets"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_type": {
"name": "Jackets",
"updated_at": "2019-06-10 20:40:07",
"created_at": "2019-06-10 20:40:07",
"id": 3
}
}
This endpoint creates a new product relation type.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types
Update a Specific Product Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/1" \
-X PUT \
-d '{
"name":"Shoes"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_type" : {
"id": 1,
"name": "Shoes",
"description": "Related footwear",
"child_label": "Is a part of",
"parent_label": null,
"relationship_cardinality": "many-to-many",
"created_at": null,
"updated_at": null,
"label": "shoes",
"deleted_at": null
}
}
This endpoint updates a specific product relation type.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product relation type to update |
Delete a Specific Product Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"message": "Deleted."
}
This endpoint deletes a specific product relation type.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/product-relation-types/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product relation type to delete |
Product Relations
Get All Product Relations From a Single Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relations" : {
"Related products" : [
{
"id" : 2,
"name" : "Blue T-Shirt",
"sku" : "BLUE1",
...
},
{
"id" : 3,
"name" : "Red T-Shirt",
"sku" : "RED1",
...
},
{
"id" : 4,
"name" : "Navy Blue T-Shirt",
"sku" : "BLUE2",
...
}
]
}
}
This endpoint retrieves all relations to a single product, grouped by relation type name. Each related product is returned as a full product object.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/relations
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product from which you are retrieving relations |
Get Product Relations From a Product by Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/type/1" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relations_by_type" : [
{
"id" : 2,
"name" : "Blue T-Shirt",
"sku" : "BLUE1",
...
},
{
"id" : 4,
"name" : "Navy Blue T-Shirt",
"sku" : "BLUE2",
...
}
]
}
This endpoint retrieves relations to a product for a single relation type, as a flat list of full product objects.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/type/<RELATION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product from which you are retrieving relations |
| RELATION-ID | The ID of the relation type from which you are retrieving relations |
Create Product Relation
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/5/type/1" \
-X POST \
-H "Authorization: Bearer {token}"
The above command returns HTTP 201 and JSON structured like this:
{
"product_relations" : [
{
"id" : 2,
"name" : "Blue T-Shirt",
"sku" : "BLUE1",
...
},
{
"id" : 4,
"name" : "Navy Blue T-Shirt",
"sku" : "BLUE2",
...
},
{
"id" : 5,
"name" : "Maroon Red T-Shirt",
"sku" : "RED2",
...
}
]
}
This endpoint creates a product relation between two products on a single relation type. No request body is required. The response is the product's current relations for that type. Creating a relation also queues a sync of the product to its connected channels.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product on which the relation is based |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is being attached |
| RELATION-ID | The ID of the relation type to which the relation should belong |
Delete a Product Relation
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/5/type/1" \
-X DELETE \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"message" : "Product relation removed"
}
This endpoint deletes a specific product relation. Deleting a relation also queues a sync of the product to its connected channels.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product on which the relation is based |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is attached |
| RELATION-ID | The ID of the relation type to which the relation belongs |
Product Relation Attributes
Get Product Relation Attributes From a Product by Relation and Relation Type
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/2/type/1/attributes" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_attributes": [
{
"0": {
"1": {
"id": 2,
"entity_type": "product_related_product",
"entity_id": 3,
"language_id": 0,
"attribute_id": 1,
"value": "blue",
"attribute_name": "Colour"
},
"4": {
"id": 7,
"entity_type": "product_related_product",
"entity_id": 3,
"language_id": 0,
"attribute_id": 4,
"value": "12 cm",
"attribute_name": "Length"
}
},
"2": {
"1": {
"id": 9,
"entity_type": "product_related_product",
"entity_id": 3,
"language_id": 2,
"attribute_id": 1,
"value": "bleu",
"attribute_name": "Colour"
}
}
}
]
}
This endpoint retrieves relations to a product for a single relation type.
product_relation_attributes holds one entry per matching relation. Each entry
is a nested map keyed first by version ID and then by attribute ID, so
product_relation_attributes[0]["2"]["1"] is the value of attribute 1 on the
master version. Version 0 is the master version.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product from which you are retrieving relations |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is being attached |
| RELATION-ID | The ID of the relation type to which the relation should belong |
Errors
| Status | Reason |
|---|---|
| 422 | The product, related product, and relation type do not form a valid relation |
Get Product Relation Attributes for a Single Version
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/2/type/1/attributes/version/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_attributes": [
{
"2": {
"1": {
"id": 9,
"entity_type": "product_related_product",
"entity_id": 3,
"language_id": 2,
"attribute_id": 1,
"value": "bleu",
"attribute_name": "Colour"
}
}
}
]
}
The same data as above, restricted to one version. The response keeps the same nested shape, so the version you asked for is still the outer key.
Passing 0, or leaving the version off the end of the URL, returns every
version rather than the master version alone.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>/attributes/version/<VERSION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product from which you are retrieving relations |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is being attached |
| RELATION-ID | The ID of the relation type to which the relation should belong |
| VERSION-ID | The ID of the version to return |
Errors
| Status | Reason |
|---|---|
| 422 | The product, related product, and relation type do not form a valid relation |
Create or Update Product Relation Attributes
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/5/type/1/attributes" \
-X POST \
-d '{}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_attributes": [
{
"id": 2,
"entity_id": 3,
"attribute_id": 1,
"value": "blue",
...
},
{
"id": 4,
"entity_id": 3,
"attribute_id": 1,
"value": "red",
...
}
]
}
This endpoint creates or updates product relation attributes between two products on a single relation type.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>/attributes
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product on which the relation is based |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is being attached |
| RELATION-ID | The ID of the relation type to which the relation should belong |
Create or Update a Single Attribute of a Product Relation
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/5/type/1/attribute/3" \
-X POST \
-d '{}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_relation_attributes": [
{
"id": 2,
"entity_id": 3,
"attribute_id": 1,
"value": "blue",
...
}
]
}
This endpoint creates or updates a single attribute of a product relation between two products on a single relation type.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>/attribute/<ATTRIBUTE-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product on which the relation is based |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is being attached |
| RELATION-ID | The ID of the relation type to which the relation should belong |
| ATTRIBUTE-ID | The ID of the attribute to create or update |
Delete a Product Relation Attribute
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/relations/5/type/1/attribute/3" \
-X DELETE \
-H "Authorization: Bearer {token}"
This endpoint deletes a specific attribute of a product relation.
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/products/<PRODUCT-ID>/relations/<RELATED-PRODUCT-ID>/type/<RELATION-ID>/attribute/<ATTRIBUTE-ID>
URL Parameters
| Parameter | Description |
|---|---|
| PRODUCT-ID | The ID of the product on which the relation is based |
| RELATED-PRODUCT-ID | The ID of the product to which the base product is attached |
| RELATION-ID | The ID of the relation type to which the relation belongs |
| ATTRIBUTE-ID | The ID of the attribute to delete |
Product Tags
Get All Product Tags From a Single Product
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/tags/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_id": 1,
"2": [
"tag_1",
"tag_2",
"tag_3"
]
}
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/1/tags" \
-H "Authorization: Bearer {token}"
Without the specific version as a last parameter it will return all tags from all versions.
{
"product_id": 1,
"0": [
"tag_1",
"tag_2",
"tag_3"
],
"1": [
"tag_a",
"tag_b",
"tag_c"
],
"2": [
"tag_x",
"tag_y",
"tag_z"
]
}
This endpoint retrieves all tags to a single product.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/tags/<VERSION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product from which you are retrieving tags |
| VERSION-ID | The ID of the version (optional) |
Modify Product Tags
curl "https://{hash}.{region}.jasperpim.com/api/v1/products/2/tags/1" \
-X PUT \
-d '{
"product_id": 2,
"0": [
"tag_1",
"tag_2",
"tag_3"
]
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"product_id": 2,
"1": [
"tag_1",
"tag_2",
"tag_3"
]
}
This endpoint updates a specific product.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/products/<ID>/tags/<VERSION-ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the product to update |
| VERSION-ID | The version ID |
Templates
Template Properties
| Property | Description |
|---|---|
| id | Jasper Template ID |
| name | Template name |
| slug | Slug |
| content | Content |
Get All Templates
curl "https://{hash}.{region}.jasperpim.com/api/v1/templates" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"templates" :
[
{
"id": 1,
"name": "Main",
"slug": "main",
...
},
{
"id": 2,
"name": "Side",
"slug": "side"
...
}
]
}
This endpoint retrieves all templates.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/templates
Get a Specific Template
curl "https://{hash}.{region}.jasperpim.com/api/v1/templates/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"template" : {
"id": 2,
"name": "Footer",
"slug": "footer"
...
}
}
This endpoint retrieves a specific template.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/templates/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the template to retrieve |
Create a Template
curl "https://{hash}.{region}.jasperpim.com/api/v1/templates" \
-X POST \
-d '{
"name":"Header",
"slug":"header"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"template" : {
"id" : 3,
"name" : "Header",
"slug" : "header"
...
}
}
This endpoint creates a new template.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/templates
Update a Specific Template
curl "https://{hash}.{region}.jasperpim.com/api/v1/templates/2" \
-X PUT \
-d '{
"name":"Other"
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"template" : {
"id": 2,
"name": "Other",
"slug": "footer"
...
}
}
This endpoint updates a specific template.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/templates/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the template to update |
Delete a Template
Deleting a template is not available through the API. The route exists but
always responds 501 Not Implemented, on every PIM and for every token.
{
"message": "Not implemented."
}
HTTP Request
DELETE https://{hash}.{region}.jasperpim.com/api/v1/templates/<ID>
Webhooks
Webhook Properties
| Property | Description |
|---|---|
| name | (string, required) Webhook name. Must be unique per entity_type. |
| callback_url | (string, required) Webhook callback URL |
| entity_type | (string, required) Entity type (valid values: product, category, brand, product_asset, concrete_entity) |
| include_entity_data | (integer) Include entity data with the payload (valid values: 0 or 1) |
| headers | (json, nullable) Custom headers to include with the payload |
| connection_timeout | (integer) Connection timeout in seconds (between 1 and 30) |
| retry_policy | (string, required) Retry policy (valid values: linear, exponential, no_retry) |
| minimum_retry_interval | (integer) Interval time before retry in seconds (between 60 and 86400) |
| retry_limit | (integer) Retry limit (between 0 and 10) |
| channel_id | (integer) PIM channel ID (channel-specific webhook) |
| event_type | (string) Sync channel type (channel-specific webhook) |
| status | (string, read-only) Current status (enabled, disabled, failed) |
| signing_secret | (string, read-only) Auto-generated HMAC signing secret |
Get All Webhooks
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" :
[
{
"id": 1,
"created_at": "2022-01-10 15:14:18",
"updated_at": "2022-01-10 15:14:18",
"created_by": 12,
"updated_by": 12,
"status": "enabled",
"name": "Product Update",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-1-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "exponential",
"minimum_retry_interval": 120,
"retry_limit": 10
},
{
"id": 2,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "enabled",
"name": "Category Update",
"callback_url": "https://callback_url.com/category",
"entity_type": "category",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-2-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 120,
"retry_limit": 10
}
]
}
This endpoint will retrieve all webhooks.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/webhooks
Get a Specific Webhook
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks/2" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" : {
"id": 2,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "enabled",
"name": "Category Update",
"callback_url": "https://callback_url.com/category",
"entity_type": "category",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-2-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 120,
"retry_limit": 10
}
}
This endpoint will retrieve a specific webhook.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/webhooks/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the webhook to retrieve |
Create a Webhook
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks" \
-X POST \
-d '{
"name": "Product Update",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data" : 1,
"headers" : "{\"header-title\": \"header_value\"}",
"retry_policy" : "linear",
"minimum_retry_interval" : 60,
"retry_limit" : 3
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" : {
"id": 1,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "enabled",
"name": "Product Update",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-3-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 60,
"retry_limit": 3
}
}
This endpoint will create a webhook. The webhook will be enabled by default. A signing secret is auto-generated.
The combination of name and entity_type must be unique. Creating a webhook with an existing name and entity_type returns 422.
HTTP Request
POST https://{hash}.{region}.jasperpim.com/api/v1/webhooks
Update a Webhook
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks/1" \
-X PUT \
-d '{
"name": "Product Update Edited",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data" : 1,
"headers" : "{\"header-title\": \"header_value\"}",
"retry_policy" : "linear",
"minimum_retry_interval" : 60,
"retry_limit" : 5
}' \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" : {
"id": 1,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "enabled",
"name": "Product Update Edited",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-3-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 60,
"retry_limit": 5
}
}
This endpoint will update a webhook. The combination of name and entity_type must be unique across all webhooks.
HTTP Request
PUT https://{hash}.{region}.jasperpim.com/api/v1/webhooks/<ID>
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the webhook to retrieve |
Disable a Webhook
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks/1/disable" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" : {
"id": 1,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "disabled",
"name": "Product Update",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-3-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 60,
"retry_limit": 15
}
}
This endpoint will disable a webhook.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/webhooks/<ID>/disable
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the webhook to retrieve |
Enable a Webhook
curl "https://{hash}.{region}.jasperpim.com/api/v1/webhooks/1/enable" \
-H "Authorization: Bearer {token}"
The above command returns JSON structured like this:
{
"webhooks" : {
"id": 1,
"created_at": "2022-01-11 16:55:08",
"updated_at": "2022-01-11 16:55:08",
"created_by": 3,
"updated_by": 3,
"status": "enabled",
"name": "Product Update",
"callback_url": "https://callback_url.com/product",
"entity_type": "product",
"include_entity_data": 1,
"signing_secret":"EXAMPLE-SIGNING-SECRET-WEBHOOK-3-VALUE-IS-GENERATED-PER-WEBHOOK",
"headers": "{'header-title': 'header_value'}",
"connection_timeout": 3,
"retry_policy": "linear",
"minimum_retry_interval": 60,
"retry_limit": 15
}
}
This endpoint will enable a webhook.
HTTP Request
GET https://{hash}.{region}.jasperpim.com/api/v1/webhooks/<ID>/enable
URL Parameters
| Parameter | Description |
|---|---|
| ID | The ID of the webhook to retrieve |
Errors
The Jasper API uses the following error codes:
| Error Code | Meaning |
|---|---|
| 200 | Success -- The request was successfully processed by Jasper. |
| 201 | Created -- The request has been fulfilled and a new resource has been created. |
| 202 | Accepted --The request has been accepted, but not yet processed. |
| 400 | Bad Request -- The request was not understood by the server. |
| 401 | Unauthorized -- The server was unable to authenticate the request. |
| 403 | Forbidden -- The current API user doesn't have correct permissions to execute the request. |
| 404 | Not Found -- The requested resource cannot be found. |
| 418 | I'm a teapot. |
| 429 | Too Many Requests -- The request was not accepted because the application has exceeded the rate limit. |
| 500 | Internal Server Error -- We had a problem with our server. Please report errors to Jasper. |
| 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |