Only this pageAll pages
Powered by GitBook
1 of 24

API Documentation

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

What is Mediablob

Mediablob API is the developer interface for storing product information in the Shoppa eco-system.

The api comes in several versions. All api versions are both forward and backwards compatible with any version of the Shoppa Client, but to take full advantage of the latest functionality of Shoppa Client, your Mediablob integration must use the latest api version.

All xml schema definitions (xsd) can be downloaded at XSD

The customer node

An integral part of the Shoppa eco-system is the customer tree. All users belong to a customer node, which in turn has a parent node. All customer nodes for a tree in this way, with one parent and optionally multiple children.

The customer tree is created by Shoppas specialists together with the customer. Contact Shoppa Support Centre if you need to update the customer tree.

Any product or storeinfo-object created at a node is available to all lower levels, provided it is not restriced by country code.

A customer can also get access to content from an external customer node if a reference is created to that node. This is used for instance to provide supplier information to several different companies. Customer references can only be created and removed by Shoppas solution architects.

The Product object

All information in Mediablob is based around a product. Products support different languages and can be restricted to a specific country.

A product has several named text fields. Allowed field names are defined in the Fields page and are used by Tags in Shoppa templates to display the correct product information.

At a customer level, the product stores up to one text and one image per field and language code.

The same picture can be assigned to several fields and different pictures can be assigned to the same field, but for different language codes. This is especially useful for images with embedded texts.

Products can be partially overridden at any customer level. This information is then used for all customer node further down the tree. If an overriden text is later deleted, the original text is restored.

The Product primarily stores static information that is not bound by time. When a product is updated the change is visible immediately to all users and remains the same until the product is changed again. Thus, products shall not contain volatile information such as price. Such properties should be handled by StoreInfo objects.

The StoreInfo object

Existing products can be enriched for specific customers and timespans.

While any text or picture of a product can be overridden, StoreInfo objects typically describe pricelists or campaigns. StoreInfo is perfect for tracking different product prices per store.

It is important to create the products before relating to them in StoreInfo objects.

XML structure

Authorization

An authorization is necessary for the request towards Shoppa's REST API or SOAP protocol. The documentation provides a description on how to receive credentials for an integration user

Integration users and customer nodes are managed set up and managed by Shoppa. Contact your Shoppa representative if you need help with the management.

Integration user

An integration user consists of four parameters that are necessary for the integration purpose. The parameters are "username", "password", "languageCode", and "countryCode".

Username and password are used to authenticate your requests. They are part of the authentication header.

LanguageCode and countryCode values determine which languages and countries you can store Mediablob data on. These values are used in the Shoppa XML's to decide where to store the data and who should be able to access it.

Customer nodes

Customer nodes always consists of a ShoppaID which is an auto incremental value. Each customer node has the option for a custom ExternalID value. Either value can be used when uploading Shoppa XML's to decide where the data should be stored.

Fields

Products have a number of fields in which you can enter information about the product. This document provides a short summary of the fields common to all users. New, specialized, fields can be created on a customer basis, contact your Shoppa representative for more information.

Required fields

When creating a new product, there are certain fields that must be defined:

  • Brand

  • Product name

  • At least one Code field (see below)

Code fields

Code fields are special, in that their values must be unique. That is, no two of your products may contain the same value in, for example, their Code 1 field. The uniqueness constraint does not carry over multiple fields, e.g. one products Code 1 can be the same as another products Code 3 without issue. The constraint also doesn't carry over between customers, i.e. one of your products may have the same Code 1 as a product belonging to another customer.

Identifier
Data Type
Recommendation

code1

String

Primary article number

code2

String

Additional article number

code3

String

Additional article number

code4

String

Additional article number

code5

String

Additional article number

code6

String

Additional article number

ean8

String

EAN 8 code

ean13

String

EAN 13 code

Text fields

Identifier
Data type
Text recommendation

amount

Double

Amount of the product in the packaging

brand

String

The brand of the product

campaignstartdate

String

Campaign start date. YYYY-MM-DD format should be used.

campaignstopdate

String

Campaign stop date. YYYY-MM-DD format should be used.

color

String

The color of the product

comparefactor

Double

Compare factor of the product. Used to calculate the comparison price

compareunit

String

Unit for the compare factor. It will be displayed as the comaprison price unit

comparisonprice

String

The already calculated comparison price. Send both the price and unit as it should be displayed.

compprods

String

Comma separated list of complement article numbers to this product.

corp

String

The corporation that owns the brand of the product

countryoforigin

String

The country of origin of the product

depth

String

The depth measurement of the product

diameter

String

The diameter measurement of the prodct

discountpercent

Double

The products discount, in percent. Should be used in campaigns

discountsum

Double

The product discount, in monetary units. Should be used in campaigns

displayname

String

Name to be displayed. Usually used to override productname when it is to technical.

effect

String

The power consumption of the product

elearning

String

URL to a website that explains more about the product.

from

String

height

String

The height measurement of the product

infolong

String

A more detailed description of the product. Recomended length is 200 - 400 characters. Supports line breaks

infoshort

String

A short description of the product that highlights specific characteristics or differenses to similar products. Recomended length is 20 - 50 characters.

ingredients

String

Ingredients used in the product

inventory

String

Information used during inventory and ordering of the product

keywords

String

Keywords used while searching for the product. These words usually are not available in the product text description, e.g. misspelled words or synonyms

lastupdated

String

The date when the product information was last updated

length

String

The length measurement of the prodct

model

String

Model name of the product

multi

Integer

The amount of items in a multi offer

multi2

Integer

Used in X for Y promotions where the value corresponds to Y.

packsize

Integer

The number of products in i multipack.

page

String

The page number where the product appeared in advertising material

partno

String

Alternative identifying number for the article

productname

String

The name of the product. Recomended length is 10 - 20 characters

properties

String

Describes qualities, attributes or distinctive features of the product, eg. characteristic attributes such as the density or strength of a material

refund

Double

The monetary refund for the product

salespackageunit

String

The unit in which the product is sold. Used if the unit differs from the products "unit" value.

salespackageunitbefore

String

Used to store the original 'sales package unit' if it is changed for a campaign

salesrule

Integer

Used to control behavior in dynamic templates, mostly in campaigns. Send one of the values 1 - 16

salesruleb

Integer

Used to control behavior in dynamic templates, mostly in campaigns. Send one of the values 1 - 17

salesrulec

Integer

Used to control behavior in dynamic templates, mostly in campaigns. Send one of the values 1 - 15

salesruled

Integer

Used to control behavior in dynamic templates, mostly in campaigns. Send one of the values 1 - 15

salong

String

A longer selling text. Recomended length is 200 - 400 characters

sashort

String

A short selling text, e.g. a pay off text. Recomended length is 20 - 50 characters

seals

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

seals2

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

seals3

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

seals4

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

seals5

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

seals6

String

One of six fields used for enviromental symbols, fair trade symbols and general pictograms. Recomended length for text in this field is 10 - 20 characters.

size

String

Size of the product

spec

String

The technical specifications of the product

subbrand

String

The second brand of the product, if such exists

target

String

The target audience of the product

techname

String

The technical name of the product

treatment

String

Recommendations on how to treat the product after purchase. Recomended length is 200 - 400 characters

unit

String

Describes the unit used in conjunction with 'amount'

videourl

String

Used with digital signage. The URL of a video clip to use

volume

String

The volume measurement of the product

warranty

String

Information about the warranty of the product

weight

String

The weight measurement of the product

width

String

The width measurement of the product

Price fields

Price fields are only available in price lists and campaigns. They can therefore only be integrated using the storeinformation XML.

Identifier
Data type
Use case

price

Double

The price of the product

pricebefore

Double

The regular price of the product. This is automatically set by Shoppa if a campaign price is available

pricecombined

Double

The price of a package deal

pricelowest

Double

Lowest price of the product within 30 days of the campaign period. Used in purpose of the EU price information law

pricerecommended

Double

The recommended price of the product

priceto

Double

The upper limit of the price range of the product, if one exists

Picture fields

Pictures can be attached to any fields, but we do have some recommendations, i.e. the main product picture should go in the 'product name' field. These recommendations are listed below.

  • Primary image - productname

  • Secondary image - techname

  • Third image - infoshort

  • Fourth image - infolong

Additional fields

There are additional fields with no intended use case. These can be used if there are no other suiting fields available.

Identifier
Data type

text1

String

text2

String

text3

String

text4

String

text5

String

text6

String

text7

String

text8

String

text9

String

text10

String

text11

String

text12

String

text13

String

text14

String

text15

String

text16

String

text17

String

text18

String

text19

String

text20

String

text21

String

text22

String

text23

String

text24

String

text25

String

text26

String

text27

String

text28

String

text29

String

text30

String

text31

String

text32

String

text33

String

text34

String

text35

String

Endpoints

The Mediablob API 1.0 is based on xml.

While the original transport was only over SOAP, Mediablob now supports async posting of xml files over https. This method is much easier to use, and returns control faster to your application.

While there are no immediate plans to remove the legacy soap support, the async https transport is highly recommended for new api development.

HTTPS endpoints

There are two available endpoints; one for development and testing, and the other for production use.

  1. Development: https://api.test2.mediablob.com/api/xml

  2. Production: https://api.mediablob.com/api/xml

REST/HTTP Developer tools

Since the api supports standard http requests, it is easy to connect any environment to the api once you have your account details.

An effective way of testing the Mediablob integration is by using Chrome with the extension Talend API Tester.

  1. Install the addon.

  2. Open the new app from the upper right corner of Chrome.

  3. Select the Method, i.e. POST and fill in the url to the endpoint

    https://api.test2.mediablob.com/api/xml.

  4. Add an Authentication request header that conforms to the credentials provided by Shoppa, i.e Authentication: Basic dXNlcm5hbWU6cGFzc3dvcmQ=.

  5. Add a proper Content-Type request header that describes what content is provided in the request body, if any. i.e. Content-Type: application/xml.

  6. Fill in the request body, if needed. When submitting xml to the /api/xml enpoint, the content shall not be manually xml-encoded (something that was required when using SOAP).

  7. Click Send to post the xml file to the endpoint.

Shoppa also provides C# source code for a sample application that uploads xml files to the api.

Legacy SOAP endpoints

There are two available endpoints; one for development and testing, and the other for production use.

  1. Development: http://ws.test2.mediablob.com/services/products.asmx

  2. Production: http://ws.mediablob.com/services/products.asmx

You can open the endpoint urls in a standard browser and read about the provided functions.

SOAP Developer tools

Since the api supports standard soap requests, it is easy to connect any environment to the api once you have your account details.

An effective way of testing the Mediablob integration is by using Chrome with the extension Wizdler.

  1. Install the addon.

  2. Browse to the wsdl-definition of the webserver at http://ws.test2.mediablob.com/services/products.asmx?WSDL.

  3. Click on the Wizdler icon in the addons toolbar and select the function you want to call.

  4. Rewrite the example content in the browser window.

  5. Click GO to post the xml file to the service.

  6. Await the service response.

Shoppa also provides C# source code for a sample application that uploads xml files to the api.

How to use the endpoints properly

Use the development endpoint for development and integration testing. The test environments have additional data format validation that gives better developer feedback. By working in a testing sandbox, you ensure any errors can be detected without affecting production users.

Switch to the production endpoint when uploaded data shall be seen by the end users.

The environments can of course be used in parallel. Just understand that testing and production environments are completely separated.

Requesting user access

You will need a username and password to access any services in the Mediablob api. You also need to know your customer id(s) for many operations.

Accounts to the test and production environments are provided by the Shoppa Support Centre. Ask your Shoppa representative to request an account on your behalf.

Deleting products

Sometimes you need to delete existing products or parts of a product, or you want to make sure any existing information is removed and not merged with the new information. Below we describe the different approaches you can use to solve this.

Deleting a text field

You delete a product field by simply assigning it as an empty field.

Lets say we want to delete the infoshort field we added in Adding a new text field. We can do that by sending the following xml:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
    <texts>
        <text languageCode="en-GB">
            <field name="infoshort" />
        </text>
    </texts>
    </product>
  </products>
</mediablob>

Note however that in case this product was overloaded from another customer node, the original text will now be visible again. If you actually want the field to be empty, regardless of what has been defined at a higher level, you need to write an empty space to the field, like this:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
    <texts>
        <text languageCode="en-GB">
            <field name="infoshort"> </field>
        </text>
    </texts>
    </product>
  </products>
</mediablob>

The space inside the field content is mandatory here. If the field is empty the original content will be visible again.

Deleting language support

To remove an entire language from our example product, we add a <text/> section with the attribute delete="true":

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
    <texts>
        <text languageCode="en-GB" delete="true" />
    </texts>
    </product>
  </products>
</mediablob>

There is no reason to add text fields to a deleted <text /> section since the import will simply ignore them.

Replacing all texts for a language

If you want to replace all texts for a specific language and make sure there are no legacy fields left behind, you need to write a delete-section followed by the new <text /> section:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
    <texts>
        <text languageCode="en-GB" delete="true" />
        <text languageCode="en-GB" productName="Champagne glass" brand="Orrefors">
            <field name="sashort">Exclusive Twin-pack, the perfect wedding gift.</field>
        </text>
    </texts>
    </product>
  </products>
</mediablob>

Make sure the delete comes first, or your newly added texts will be deleted too!

Deleting an entire product

Sometimes you want to delete an entire product, with all texts, codes and picture references. This is done with the following xml:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1" delete="true" />
  </products>
</mediablob>

As before, if the product is owned by another customer, the product will still be visible with its original content.

Pictures

As stated before, any product field can have one picture assigned to it. The same picture can be referenced by many fields, and many products, in several languages.

Pictures are uploaded to Mediablob by calling UploadImage2 or UploadAndClipImage. When an image is uploaded, its md5 hashCode is returned. Use this hashCode as future reference in products.

To reduce bandwidth usage, api users are encouraged to calculate the md5 hash code themselves and check if the image exists in Mediablob through the ImageExists or ImageExistsMd5 functions prior to uploading images.

Note: Images are always hashed before being processed by Mediablob services, so it can be correctly precalculated before uploading.

Note: It is not possible to delete images in Mediablob through the API.

UploadImage

REST

All endpoints use a leaky bucket queue algorithm. There is a max capacity of 50 messages at a time with a renewal of 1 message per 5 seconds.

/api/xml

Used for uploading Shoppa XML's to the integration service bus queue

PUT https://api.mediablob.com/api/xml

Available Shoppa XML's can be found at

Headers

Name
Type
Description

Request Body

Name
Type
Description

SessionId example:

Used for uploading a custom XML to the integration service

PUT https://api.mediablob.com/api/xml/custom

Custom XML's will be passed through one or several XSLT schemas before being uploaded to the service bus queue. XSLTs are uploaded by Shoppa. To upload or change an XSLT, contact your Shoppa representative for help.

Headers

Name
Type
Description

Request Body

Name
Type
Description

SessionId example:

Operation to list all uploaded XML's for the defined date

GET https://api.mediablob.com/api/xml/{date}

Headers

Name
Type
Description

Id: SessionId for the message. File: Link to the upoaded file. Result: Route to retrieve the result file. See for more information. Errors:

Operation to check if the XML processing is done

GET https://api.mediablob.com/api/status/{sessionId}/done

{sessionId} corresponds to the hashcode returned by a 202 Accepted response in

Operation to get a detailed information about the XML process

GET https://api.mediablob.com/api/status/{sessionId}/result

{sessionId} corresponds to the hashcode returned by a 202 Accepted response in

Response header contains a parameter "Location". The parameter contains an URL to the error message.

/api/images

Upload images

POST https://api.mediablob.com/api/images

Upload one or more images to Mediablob as multipart form data objects. If this image already exists, the In C# you need to add the images to a MultipartFormDataContent object, which you add to an HttpClient call. The response contains the Mediablob id for each image, which you can use to reference the images in further integrations. If your image has a clipping path you can add these parameters to the call to tell our rest endpoint which clipping path you want to use. The invert parameter is there to make it possible to invert the clipping path.

Query Parameters

Name
Type
Description

Headers

Name
Type
Description

Request Body

Name
Type
Description

Check if an image exists

HEAD https://api.mediablob.com/api/images/{Mediablob-hashcode}

Verify that an image exists in Mediablob by using the Mediablob-hashcode that was returned when the image was originally uploaded.

Headers

Name
Type
Description

Find the Mediablob hashcode for an uploaded image

GET https://api.mediablob.com/api/images

Find the Mediablob-hashcode for an image that has been previously uploaded. You need to provide one of md5 or uri query parameter, but not both in the request. The Mediablob-hashcode is returned in the response if it is successful, which you can use to reference the image in further integrations.

Query Parameters

Name
Type
Description

Headers

Name
Type
Description

SOAP (legacy)

Legacy

While our SOAP based webservice will remain in operation for some time longer, it is no longer being maintained and will not be updated with bug fixes, etc. If you are already using the SOAP based service we recommend that you switch over to using our REST based service at your earliest convenience. If you are integrating your system to ours for the first time, we strongly urge you to use the REST based service, not the SOAP based one.

The SOAP specific documentation will remain online as long as we accept SOAP requests, only as a convenience to our customers currently using it. Again, if you are building a new integration, use instead.

SOAP

Soap is a standard protocol that will not be discussed in detail here. There are some peculiarities to know about when integrating with Mediablob though; specifically Mediablobs use of an <AuthHeader /> section.

Another quirk, that is handled automatically by tools such as Visual Studio, is that xml content must be xml-encoded.

The AuthHeader

Mediablob does not use any cookies or other common login mechanisms to validate access. Instead Mediablob expects an AuthHeader section in the soap header.

The AuthHeader looks like this:

The username and password authenticates the user. Mediablob then verifies the users privileges and authorizes the rest of the request.

The customerId is used to instruct Mediablob which customer node the uploaded xml file relates to. The customerId can either be a ShoppaID assigned by Shoppa when the customer node was created, or an ExternalID assigned to each store by the customer.

Contact Shoppa Service Center to change what ExternalID to use for different stores.

The customerId must always be for or below the node the user logs in to. To prevent pre-generated xml-files to be uploaded to the wrong account by mistake, the customerId must correspond with the customerId of the uploaded xml file.

Encoding

The content of any xml element must be xml encoded. This is achieved by replacing each character with its encoded counterpart. Thus, in the Mediablob product xml you would need to encode the product text Köp & vinn! as Köp &amp; vinn!.

Xml encoding is automatically handled by high-level frameworks like C# and Java. You only need think about this when you create your xml file manually.

What can be a bit confusing is when you wrap the Mediablob xml in soap. Since your xml file is content in a soap element, it needs to be xml encoded, including any text you encoded inside your xml. The product text above would then become Köp &amp;amp; vinn!.

Mediablob also requires an xml declaration line at the top.

Example SOAP Request

Lets say we want to upload the following product definition:

Using the following user details:

  • username: demouser1

  • password: Not_a_real_password

  • ShoppaID: 1143

Encoded and wrapped in a valid soap request this becomes:

Copy this text and POST it with Wizdler to Mediablobs development endpoint. You should get the following response with status code 200 if you did it right:

<AuthHeader xmlns="http://www.mediablob.com/">
  <username>demouser1</username>
  <password>Not_a_real_password</password>
  <customerId>14</customerId>
  <customerIdType>ShoppaID</customerIdType>
</AuthHeader>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7">
  <products>
    <product id="65467-14" idType="Code1">
      <codes>
        <code name="EAN13" value="123456789012" />
      </codes>
      <texts>
        <text productName="Champagneglas" brand="Orrefors" languageCode="sv-SE" />
      </texts>
    </product>
  </products>
</mediablob>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <AuthHeader xmlns="http://www.mediablob.com/">
      <username>demouser1</username>
      <password>Not_a_real_password</password>
      <customerId>1132</customerId>
      <customerIdType>ShoppaID</customerIdType>
    </AuthHeader>
    <CultureHeader xmlns="http://www.mediablob.com/">
      <currentCulture>sv-SE</currentCulture>
    </CultureHeader>
  </soap:Header>
  <soap:Body>
    <UploadProductXml xmlns="http://www.mediablob.com/">
      <productXml>&lt;mediablob customerID=&quot;1143&quot; customerIDType=&quot;ShoppaID&quot; createDate=&quot;2018-05-12T00:00:00&quot; schemaVersion=&quot;1.7&quot;&gt;
  &lt;products&gt;
    &lt;product id=&quot;65467-14&quot; idType=&quot;Code1&quot;&gt;
      &lt;codes&gt;
        &lt;code name=&quot;EAN13&quot; value=&quot;123456789012&quot; /&gt;
      &lt;/codes&gt;
      &lt;texts&gt;
        &lt;text productName=&quot;Champagneglas&quot; brand=&quot;Orrefors&quot; languageCode=&quot;sv-SE&quot; /&gt;
      &lt;/texts&gt;
    &lt;/product&gt;
  &lt;/products&gt;
&lt;/mediablob&gt;</productXml>
    </UploadProductXml>
  </soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <UploadProductXmlResponse xmlns="http://www.mediablob.com/">
            <UploadProductXmlResult />
        </UploadProductXmlResponse>
    </soap:Body>
</soap:Envelope>
REST

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

Text

String

File

Object

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

Text

String

File

Object

23829771-e1d5-4dc3-8311-6503a38f2614
{
message: "Authorization has been denied for this request."
}

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

{
id: "80004390-0000-a900-b63f-84710c7967bb",
receivedAt: "2022-12-28T13:01:51+00:00",
fileLenght: 164,
sentBy:{
    name: "sebbewstest",
    shoppaId: 17786,
    externalId: null
},
file: "https://mbintegrationdatainttest.blob.core.windows.net/xml/2022-12-28/17786/17786/a5ff59a67806e7af3d49fb184a671c68.xml",
result: "https://api.test2.mediablob.com/api/status/80004390-0000-a900-b63f-84710c7967bb/result",
errors:[]
}
{
message: "The request is invalid."
}
{
message: "Authorization has been denied for this request."
}
true
false
The request is still being proccessed.

invert

String

True if the inside of the clipping path shall be removed instead of kept. Defaults to False.

clippingpath

String

The name of the clipping path to be used. Defaults to not use clipping paths.

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

file

Object

Binary image data. Repeat for each image to be uploaded. The parameter name is not used.

{
    // Response
}

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

{
    // Response
}
{
    // Response
}

md5

String

The md5 hash of the original image.

uri

String

An external uri from which the image was originally fetched. Images can be fetched from external uri's during product xml uploads.

Authorization*

String

Basic authentication using the integration user credentials.

customerId*

String

ShoppaID or ExternalID for the customer node.

customerIdType*

String

"ShoppaID" or "ExternalID". Should be correspondant to the id used as customerId.

{
    // Response
}
{
    // Response
}
XML structure
23829771-e1d5-4dc3-8311-6503a38f2614
/api/status
/api/xml
/api/xml
{
message: "The request is invalid."
}
{
message: "Authorization has been denied for this request."
}

Local price overrides

Local prices in combination with central prices requires the use of Shoppa version 2.25 or higher.

Pricelists on a store level overrides central prices only if the store is subscribed to the central pricelist, both pricelists have the same package ID, and the local pricelist does not have the name "STANDARD"

All future price change functionality is applicable for local overridden pricelists as well as central pricelists.

Locally overridden prices for a product will always trumf any centrally price changes for the same product.

Local override of central pricelist

Here we have a central pricelist stored on a HQ level.

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T09:00:00" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Central Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="49.95" />
        </product>
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
        <product id="333333" idType="Code1">
            <field name="price" value="34.95" />
        </product>
    </package>
</storeInformation>

In one of the stores we have different prices for the products with ID 222222 and 333333. We will therefore only send the price changes to the local pricelist.

<storeInformation customerID="Store1" customerIDType="ExternalID" createDate="2020-01-01T09:00:00" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Local Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="24.95" />
        </product>
        <product id="333333" idType="Code1">
            <field name="price" value="39.95" />
        </product>
    </package>
</storeInformation>

Store1 will now have the local prices in addition to central prices that are not overridden. The other stores will receive all the prices from the Central Pricelist.

Deleting local price overrides

If a local price stops being active and we want the central price to be used again, it can be accomplished by deleting the local price from its pricelist.

<storeInformation customerID="Store1" customerIDType="ExternalID" createDate="2020-01-01T09:00:00" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Local Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="222222" idType="Code1" delete="true" />
    </package>
</storeInformation>

Here we have deleted the product with ID 222222 from the local pricelist. Store1 will now receive a price for the product from the Central Pricelist. Other local price overrides will still remain.

Pricelists

This describes StoreInfo schema version 1.6.

While most product information is static over time, prices are not. Stores have different prices for the same product and prices change at different times. This information is stored in pricelists which is one kind of StoreInformation package.

In contrast to products and campaigns, pricelists are not automatically inherited along the customer tree. A store uses the pricelist named STANDARD from its own node by default, but a named pricelist from a parent node can be explicitly selected instead.

Pricelists are described by packages with a name and a start date, but no stop date. If no name is provided, the default name STANDARD is assumed. If you also provide a package id, you can later use this to refer to that package instead of using name + start date.

Mediablob primarily identifies packages by id + countryCode. If id is not provided, the package is identified by name + countryCode. We recommend using the id for identification when possible. This behaviour is different from previous versions of the api and should be considered when updating existing integrations.

Prices are changed by sending a new package with the same name for a later date.

Lets build a pricelist from scratch and see how it evolves with different requirements.

A basic pricelist

Lets say store S123 wants to sell our sample product for 205 SEK. The price is valid from September 21st, 2008. The corresponding xml format for creating a standard pricelist is:

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T14:01:00" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-01-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="49.95" />
        </product>
    </package>
</storeInformation>

Creating a named pricelist

Some stores may use a mutual pricelist. In this case HQ wants to publish a named pricelist the stores can subscribe to. We create the same pricelist above as a named pricelist. We use an id from the HQ ERP system for future tracking and updates. Here is the xml we need:

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T14:01:15" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Central Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="49.95" />
        </product>
    </package>
</storeInformation>

Adding a product to an existing pricelist

Now we want to add two other products to the named pricelist. The xml for this is:

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T09:00:00" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-01-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
        <product id="333333" idType="Code1">
            <field name="price" value="34.95" />
        </product>
    </package>
</storeInformation>

After this, the pricelist contains three priced products.

Deleting a complete pricelist

We finally decide to restructure our pricelist system and want to delete a pricelist completely. We do this by setting the delete attribute but omitting the startDate. The xml for this is simply:

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" countryCode="se" delete="true" />
</storeInformation>

Removing a product from the pricelist

In addition to deleting a complete pricelist you also have the option to remove a selection of products from the existing pricelist. Instead of defining the delete attribute in the package tag, it will be set in the product tag. The xml for this is simply:

<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" countryCode="se">
        <product id="111111" idType="Code1" delete="true" />
    </package>
</storeInformation>

Complement products

For every product we can assign a list of complement products. The complements are displayed in Shoppa when the base product is displayed and can be automatically assigned to templates to easily build multi-product signs.

Note: Just because product A assigns product B as a complement does not mean the opposite is true. You must explicitly assign all relationships you want to use.

Adding two complement products

Lets assign a complement product to our sample product:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <complementProducts>
        <complementProduct id="65468-1" idType="Code1" />
        <complementProduct id="65468-3" idType="Code1" />
      </complementProducts>
    </product>
  </products>
</mediablob>

You can of course assign complement products at the same time you create your product or modify other properties of it. The only requirement is that the complement product already exists in Mediablob.

Replacing existing complements

If you send a <complementProducts /> list as above, the new complements will be merged with any existing complements and make the list of complements longer. If you instead want to replace the existing complements with a new list, you need to set replace="true":

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <complementProducts replace="true">
        <complementProduct id="65468-1" idType="Code1" />
      </complementProducts>
    </product>
  </products>
</mediablob>

The above xml effectively deletes complement 65468-3, since it is no longer part of the list.

Deleting all complements for a product

If you want to delete all existing complements for a product, you set delete="true" on the <complementProducts /> section:

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <complementProducts delete="true" />
    </product>
  </products>
</mediablob>

Note that deleting the complements list does not delete the product itself.

Signorder

This describes SignOrder schema version 1.1.

A signorder file can reference a number of products, which display groups that should be used to print them, and how many copies should be printed. Additionally you can specify values for the product fields (e.g. price, text1, etc.). Note that these values will not override existing product fields, but will only populate empty fields. The exception to this is the price field, which will override existing prices.

Other notes:

  • To specify values for code fields (Code1, EAN13, etc.) you need to use the <code> element, rather than the <field> element.

  • To get multiple products onto one template they need to be grouped in a products element. Which display group to use should then be specified for the products element, and not the individual product elements. In this case the product elements need to have the productIndex attribute, in order to specify which product index to use in the template(s).

  • The usageDate attribute can be used to get prices from future dates. If omitted, todays date will be used.

  • If the autoPrint attribute is false, there is no need to specify display groups.

<?xml version="1.0" encoding="utf-8"?>
<signOrder xmlns="http://shoppa.com/signOrderSchema" createDate="1997-08-26T01:31:12.71" usageDate="2019-12-24" autoPrint="true">
    <product idType="Code1" id="12345" copies="1" displayGroup="38988a59-5c03-4876-bb34-c016575b5936" />
    <product idType="Code1" id="23456" copies="1" displayGroup="73c94b65-560c-4f74-a667-198676fd5eac">
        <field name="price" value="95.00" />
        <field name="text1" value="Battery included" />
        <code name="EAN13" value="1234567890128" />
    </product>
    <products copies="1" displayGroup="1fa465e2-ce62-484e-a0b6-a26da2dc9c6c">
        <product idType="Code1" id="34567" productIndex="1" />
        <product idType="Code1" id="45678" productIndex="2" />
    </products>
    <products copies="1" displayGroup="1fa465e2-ce62-484e-a0b6-a26da2dc9c6c">
        <product idType="Code1" id="56789" productIndex="1" />
        <product idType="Code1" id="67890" productIndex="2">
            <field name="price" value="49.90" />
            <code name="EAN13" value="2345678901234" />
        </product>
    </products>
</signOrder>

Display groups

Display groups

Display groups are managed through the Shoppa client. Each display group can reference multiple layouts and formats of multiple templates, and also a different number of copies for each. The most common use case is one copy of one format/layout/template.

DisplayGroups.xml

The file DisplayGroups.xml is located in the sub folder Schemas in the hot folder. It is automatically generated by the Shoppa client, and contains information about the available display groups. It could look something like this:

<?xml version="1.0"?>
<DisplayGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Customer="1143" Created="2019-09-19T15:11:06.4876855+02:00">
    <Items>
        <DisplayGroup Id="1fa465e2-ce62-484e-a0b6-a26da2dc9c6c" Name="Member/limited time" Customer="1143" Public="true">
            <Members>
                <DisplayGroupMember Template="Member products" Layout="Limited time offer" Format="A4" Copies="1" />
            </Members>
        </DisplayGroup>
        <DisplayGroup Id="38988a59-5c03-4876-bb34-c016575b5936" Name="Member/shelf" Customer="1143" Public="true">
            <Members>
                <DisplayGroupMember Template="Member products" Layout="Shelf label" Format="148,5x52,5" Copies="1" />
            </Members>
        </DisplayGroup>
        <DisplayGroup Id="73c94b65-560c-4f74-a667-198676fd5eac" Name="Posters" Customer="1143" Public="true">
            <Members>
                <DisplayGroupMember Template="Poster" Layout="Vertical" Format="700x1000" Copies="2" />
                <DisplayGroupMember Template="Poster" Layout="Horizontal" Format="700x1000" Copies="1" />
            </Members>
        </DisplayGroup>
    </Items>
</DisplayGroups>

Each group has a name, an Id and at least one member, groups without members are omitted from the file. Each member references a template, a layout, a format and a number of copies.

XSD

List of all available schema versions for each XML type.

Mediablob.xml

mediablob-v1.1.xsd

mediablob-v1.2.xsd

mediablob-v1.3.xsd

mediablob-v1.4.xsd

mediablob-v1.5.xsd

mediablob-v1.6.xsd

mediablob-v1.7.xsd

mediablob-v1.8.xsd

mediablob-v1.9.xsd

StoreInfo.xml

storeInfo-v1.1.xsd

storeInfo-v1.2.xsd

storeInfo-v1.3.xsd

storeInfo-v1.4.xsd

storeInfo-v1.5.xsd

storeInfo-v1.6.xsd

storeInfo-v1.7.xsd

Productgroup.xml

productGroups-v1.1.xsd

Signorder.xml

signOrder-v1.1.xsd

Local integration

The Shoppa application can accept sign orders from external applications for printing. The sign order is an XML file which follows a predefined XML schema. The external application or PDA places the XML file in a predefined “hot folder” and Shoppa imports the file from this folder. The sign order can include one or many products. Each defined product can have text fields like name, brand, description, price and so on. The sign order has an auto print option. If this option is activated Shoppa will put all products on a predefined template and automatically send them for printing. When the auto print option is disabled Shoppa will show the products in a list for further action by user.

Requirements

A few things are needed in order to use the local integration functionality:

  • The correct Add Ons for your enterprise and store level accounts. If you don't already have these, contact your Shoppa representative.

  • The location of the hot folder needs to be specified in the Shoppa configuration file, see below.

  • One or more display groups need to be created, preferably on an enterprise level account.

Hot folder

The location of the hot folder needs to be specified in Shoppas configuration file (shoppa2.exe.config). The relevant section is this:

<setting name="HotFolder" serializeAs="String">
    <value>C:\Hotfolder</value>
</setting>

If this setting does not already exist, add it in the <Shoppa.PL.Windows.Properties.Settings> section. If the folder does not already exist, the Shoppa client will create it on startup.

In order to send a signorder file to Shoppa, simply place it in the hotfolder, either by hand for testing purposes, or use another appliction.

The folder will contain three or four subfolders, depending on the version of the Shoppa client.

Archive

In Shoppa 2.25 and newer, finished files will be moved to the archive folder after three days. Older versions do not do this, and the archive folder is not created.

Error

If a something goes wrong when processing a signorder file it will be moved to the error folder, along with a .txt file containing an error message. A timestamp will be appended to the name of the signorder and the corresponding error file will have the same name, except for being a .txt file rather than an .xml file.

Finished

When a signorder is successfully processed it is moved to the finished folder. A timestamp will be appended to the name of the file.

Schemas

The Schemas folder contains a file called DisplayGroups.xml that describes the available display groups.

Usage

There are several use cases for the signorder functionality. These are a few examples.

Printing from handheld devices

An application running on a handheld device can read the DisplayGroups.xml file if the hot folder is placed on a shared network drive and dynamically generate a list of available print options. The user can scan barcodes to select products and choose which template to use while out and about in the store. The application can generate a signorder and place it in the hot folder, and the selected signs will be printed through a computer running Shoppa. The user can then collect a stack of printed signs from the printer and start putting them up.

Generating product groups from another application

An application running on the same workstation as the Shoppa client can generate a list of products to print based on whatever business logic is available to it. The application can place a file in the hot folder and the user can access the list in Shoppa and create the required signs.

Campaigns

Campaigns

Campaigns describe temporary prices used at one or more stores for a specific time period. Campaigns are usually used to show customers the original price and how much they save during the campaign. For this reason, campaigns are layered on top of the stores pricelist when used by Shoppa.

Like pricelists, campaigns are described in a StoreInformation package. Campaigns are always created with a start- and a stopdate and they always need a name that can be used in Shoppa Client to select it.

As with pricelists, campaigns can be identified with name, startDate and countryCode, but for simplicity we recommend using a reliable id instead.

A campaign can not be converted to a pricelist and vice versa. If you create the wrong kind of package you need to delete the package and create a new one from scratch.

A basic campaign

Lets make a 50% off campaign for our sample glass 65467-14 from October 1st - 4th. The xml for this is:

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T09:32:50" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass weekend" startDate="2008-10-01" stopDate="2008-10-04" countryCode="se">
        <product id="65467-14" idType="Code1">
            <field name="price" value="102.50" />
        </product>
    </package>
</storeInformation>

Changing the duration

We decide to postpone our campaign one day and extend it to a full week. If we simply set a new startDate we would update product prices at that date rather than of changing the startdate of the entire campaign. Moving the campaign thus requires us to use the attribute newStartDate:

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T10:14:20" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass week!" newStartDate="2008-10-02" stopDate="2008-10-08" countryCode="se" />
</storeInformation>

Campaign visibility

What campaigns to run in an organization may be known a long time at HQ, but it may be sensitive to tell the stores too early and risk informing customers and competitors. By setting the visibleStartDate attribute you decide how long beforehand the stores see the campaign. All users at HQ still see the campaign in their clients and can validate its content.

Similarly, some stores may want access to campaigns after they formally end, to run them a little longer and get rid of excess stock. To keep the campaign visible in Shoppa Client after the campaign ends you set the visibleStopDate attribute.

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T09:32:50" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass week!" startDate="2008-10-02" stopDate="2008-10-08" visibleStartDate="2008-10-01" visibleStopDate="2008-10-15" countryCode="se">
        <product id="65467-14" idType="Code1">
            <field name="price" value="102.50" />
        </product>
    </package>
</storeInformation>

Complement products

A product can have complement products assigned to it specifically in a campaign. You can also assign campaign information to the complement products as you are assigning them. Note that values cannot be set with the value attribute, they have to be contained by the field element.

You should also add the attribute complementBehaviour to the product element. This takes one of three values and determines the way complement products are added and/or removed. The accepted values are replace, delete and merge. They do the following:

  • Replace: Removes all existing complement products and replaces them with the new ones. This is the default option.

  • Delete: Removes all existing complement products. Any new complement products will be ignored.

  • Merge: Adds the new complement products to the set of existing ones.

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T09:32:50" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass weekend" startDate="2008-10-01" stopDate="2008-10-04" countryCode="se">
        <product id="65467-14" idType="Code1" complementBehaviour="merge">
            <field name="price" value="102.50" />
            <complementProduct id="33648-03" idType="Code1" />
            <complementProduct id="33648-04" idType="Code1">
                <field name="text1">Batteries not included</field>
                <field name="price">24.90</field>
            </complementProduct>
        </product>
    </package>
</storeInformation>

Deleting a campaign

If a campaign should be removed completely, that can be achieved by setting the delete attribute in the package tag. We refer to the campaign by defining the corresponding id, startDate, and stopDate. The xml for this is simply:

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T09:32:50" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass week!" delete="true" startDate="2008-10-02" stopDate="2008-10-08" countryCode="se" />
</storeInformation>

Removing a product from the campaign

If we instead only want to remove a selection of products from the campaign, we set the delete attribute in the product tag. The xml for this is simply:

<storeInformation customerID="S123" customerIDType="ExternalID" createDate="2008-09-10T09:32:50" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="99001" name="Glass week!" startDate="2008-10-02" stopDate="2008-10-08" visibleStartDate="2008-10-01" visibleStopDate="2008-10-15" countryCode="se">
        <product id="65467-14" idType="Code1" delete="true" />
    </package>
</storeInformation>

Images

Uploading an image to Shoppa's central database will result in the picture passing through an image handling before the image is stored on Shoppa's servers.

Uploading Images

Uploading images to Shoppa's central database can be done in two ways. Either the image is uploaded by itself or the image is uploaded with an URI in the Mediablob.xml.

Image compression

To optimize speed of the whole workflow from creating templates to printing in the stores, Shoppa automatically reduces image sizes if needed. Images larger than 2025 x 2025 pixels or 1 MB are compressed when imported to Shoppa's central database.

With the add-on "Bigger Pictures" you can import images up to 4000x4000 pixels or 3MB. Contact Shoppa for more information on how to enable it.

Productgroups

This describes .

Product groups is used for creating a hierarchy of products. It makes it easier for the users to do the search by brand or by product type. Much like pricelists, product groups are not inherited along the customer tree automatically, only stores that subscribe to the the product groups can see them.

Usage

Subscriptions

Managing the product group subscriptions cannot currently be done through the API, it needs to be done through Mediablob.

Subscribing to product groups is all or nothing, the store either has access to the full set of product groups, or none at all.

Function call

Use the function call UploadProductGroupsXml to upload your product group xml.

Structure

The product groups are a hierarchy where each group can contain a number of subgroups, which in turn can have their own subgroups, etc. Each group must have its own unique ID. Shoppa places no particular restrictions on these ID:s, so we recommend that you mirror existing ID:s in whichever system you are using. Each group must also contain at least one text element, specifiying the name of the group. The group names can be specified by language, so that different users can have different group names, but bear in mind that the group structure and its contents will be the same.

The full definition of the product groups is done in two parts: first the structure is defined as per above, and then the products are assigned to their groups using the groups ID. Note that a product can belong to multiple groups.

Changing the structure

The group structure cannot be edited. If a change is required you need to send the entire structure again. Note that products can still be added to groups without having to resend the entire structure.

Examples

Basic product groups

Nested groups with multiple languages

Error messages

If the received XML-messages are malformed, or something goes wrong during processing of the message, an error message will be returned by our integration service. This document covers the most common error messages. Unexpected faults might produce unknown exceptions which are not covered by this document.

Error messages are reported in one of two ways: as XML or as plain strings. Problems with file contents are generally reported as XML, while other problems, such as authentication and connectivity issues are reported as strings. Error messages are contained in the <UploadProductXmlResult>-tag.

Example of XML-reported error; trying to add a product that does not exist to a campaign:

Example of string-reported error; wrong password was used:

XML-reported errors

The picture at '*' could not be retrieved.

The picture at the specified URL could not be retrieved. The reason is stated in the error text. Here are some example error texts:

  • The picture at '*' could not be retrieved. Reason: The remote server returned an error: (404) Not Found.

  • The picture at '*' could not be retrieved. Reason: Invalid URI: The format of the URI could not be determined.

  • The picture at '*' could not be retrieved. Reason: Byte array for GUID must be exactly 16 bytes long.

  • The picture at '*' could not be retrieved. Reason: Unable to read data from the transport connection: The connection was closed.

  • The picture at '*' could not be retrieved. Reason: Exception has been thrown by the target of an invocation.

  • The picture at '*' could not be retrieved. Reason: Lost connection to MySQL server during query

  • The picture at '*' could not be retrieved. Reason: Lost connection to backend server.

  • The picture at '*' could not be retrieved. Reason: Content-Disposition and Content-Type is missing and no file extension found in URI.

Recommended actions:

  • The remote server returned an error: (404) Not Found.: Verify that the URL is working and is reachable by our service.

  • Lost connection to MySQL server during query: Our service is not responding properly. Wait a few minutes and try again.

  • Lost connection to backend server.: Our service is not responding properly. Wait a few minutes and try again.

  • Content-Disposition and Content-Type is missing and no file extension found in URI.: Add missing meta-data to images, or add extensions to the URL.

Example XML excerpt:

The supplied picture hashcode does not match any known Mediablob picture

Error text: "The supplied picture hashcode (*) does not match any known Mediablob picture"

The hashcode doesn't match any picture in Mediablob.

Recommended action: Make sure the picture is uploaded before trying to assign it to a product.

Example XML excerpt:

Product does not exist in Mediablob

Error text: "Product does not exist in Mediablob"

You're trying to include a non-existing product in a campaign or price list.

Recommended action: Make sure the product is created before adding it to campaigns/price lists.

Example XML excerpt:

Product does not exist

Error text: "Product does not exist"

You’re trying to delete a product that does not exist, or add a product that does not exist to a product group.

Recommended actions:

  • Deleting a product: The product is already deleted, or never existed. If possible, revise your integration system to avoid deleting already deleted products.

  • Adding to product group: Make sure the product is created before adding it to product groups.

Example XML excerpt (campaign/price list):

Example XML excerpt (product group):

Product is a duplicate

Error text: "Product is a duplicate"

The product appears twice in a campaign or price list.

Recommended action: If possible, revise your integration system to avoid sending the same product twice or more in the same context (same campaign, product import, etc.).

Example XML excerpt:

Failed to Save the product

Error text: "Failed to Save the product"

The product could not be saved, probably because of something that happened serverside.

Recommended action: Wait a while and resend your data.

Example XML excerpt:

Found 2 products

Error text: "Found 2 products"

When trying to add a product to a product group, two products with the same code were found.

Recommended action: Resolve the conflict, or use a different code to add the product to the product group.

Example XML excerpt:

Product has duplicates in the Xml file. The first copy of the product is saved.

Error text: "Product has duplicates in the Xml file. The first copy of the product is saved."

The same product appears multiple times in a product import. Only the first appearance of the product is used, the other ones are discarded.

Recommended action: If possible, revise your integration system to avoid sending the same product twice or more in the same context (same campaign, product import, etc.).

Example XML excerpt:

The product already belongs to another supplier.

Error text: "The product already belongs to another supplier."

You are trying to modify, or superimpose a value on, a code on a product that does not belong to the customer node you are integrating to. E.g. a store cannot change a code on a product that is owned by their HQ.

Recommended action: If possible, revise your integration system to not attempt to modify codes on lower levels in the customer hierarchy than the product is created on.

Example XML excerpt:

Found existing product in database using the same product code

Error text: Found existing product in database using the same product code: CodeType '*', Value '*'. Product codes must be unique.

You are trying to assign a code to a product, but the code is already used on another product in Mediablob.

Recommended action: If possible, revise your integration system to avoid this behaviour.

Example XML excerpt:

Found duplicate code

Error text: Found duplicate code: CodeType '*', Value '*'. Product codes must be unique.

You are trying to assign the same code to multiple products within the same file.

Recommended action: If possible, revise your integration system to avoid this behaviour.

Example XML excerpt:

String-reported errors

User is not authenticated.

Error text: "User is not authenticated."

The authentication provided in the SOAP-object is not valid.

Recommended action: Verify that you are using the correct login information.

Either uri or keyword MUST be set on a product picture

Error text: "Either uri or keyword MUST be set on a product picture."

There is a picture tag that lacks 'uri', 'hashCode' and 'md5' attributes. One of them must be present to successfully reference a picture.

Recommended action: If possible, revise your integration system to avoid this behaviour.

Object reference not set to an instance of an object

Error text: "Object reference not set to an instance of an object."

The imported XML does not contain any information.

Example of imported XML:

Recommended action: If possible, revise your integration system to avoid sending anything if there is no data to send.

Failed to save picture '*'

Error text: "Failed to save picture '*'. The picture might be corrupt, try uploading the picture again or use another picture."

Something went wrong when uploading one or more pictures. Several instances can be present in the same response.

Recommended action: Try uploading the picture again.

Example:

Syntax error

Error text: "*. Line *, position *."

There is a syntax error in the imported XML. This is typically caused by unescaped special characters: '&', '<' and '>'. See the section for more details.

Recommended action: Make sure you are encoding special characters correctly: once to get them into the import XML and then once again to get them into the SOAP-object.

Example:

Guid *

Error text: "Guid *"

You have done too many revisions and the version number has gone out of bounds.

Recommended action: Contact Shoppa.

Example:

Validation error

Error text: "Line: *, Position: * "*""

The imported XML does not match the XML-schema.

Recommended action: Adjust the generation of the XML content according to the given reason.

Example:

Deadlock found when trying to get lock

Error text: "Deadlock found when trying to get lock; try restarting transaction"

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Connection must be opened

Error text: "Connection must be opened."

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Lost connection to MySQL server during query

Error text: "Lost connection to MySQL server during query"

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Failed to create new session

Error text: "failed to create new session"

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Exception has been thrown by the target of an invocation

Error text: "Exception has been thrown by the target of an invocation."

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Lost connection to backend server

Error text: "Lost connection to backend server."

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

An exception occured that could not be fully serialized

Error text: "An exception occured that could not be fully serialized: Exception has been thrown by the target of an invocation."

Something went wrong serverside.

Recommended action: Wait a while and resend your data.

Products

NOTE: This describes .

A product has codes, texts and pictures. The texts and pictures can be defined for multiple languages. For each product a set of complement products can also be defined.

Note that all used languageCodes must be registered on the account used to upload the information to Mediablob. Please check your account details with your Shoppa representative if you are unsure.

Lets build a product from scratch and see how different requiements evolve its xml definition.

A basic product

Lets say our customerId is 1143 and we have a product with only some basic information:

  • brand: Orrefors

  • name: Champagneglas

  • sku: 65467-14

  • ean code: 123456789012

This corresponding xml format is:

A product must always have at least one text section. Brand and name are required for new products. In the example above the product is described in the Swedish language.

Extending the product information

We extend the product with additional sales arguments and a unit for prices:

  • short sales argument: Exklusivt tvåpack. En perfekt bröllopspresent.

  • long sales argument: Efva Attling är en juveldesigner som har använt sin rika erfarenhet och expertis för att skapa glaskonst. Hennes tredje glas är ett maskulint martiniglas med en silverring.

  • unit: st

The xml for describing the product now becomes:

To protect content against xml formatting constraints, the & character is xml encoded. This follows the xml specification and must be used for any content.

Additional languages

We decide to support English too. The xml gets extended with an additional <text /> section. We also start the product with a generic language text xx with generic text for all languages unless overridden.

Even without actual such texts, we recommend always including a row for xx to prevent duplicate products in the future.

Picture support

Finally, we add pictures to the swedish brand and productName fields. English users do not get to see any pictures for now.

As you can see, the pictures are referenced by a hashCode. What hashCode to use will be described in detail in the Pictures section.

Pictures require a countryCode. This is a legacy construct and is easily created by lowercasing the last two characters of the languageCode.

Reference a picture by its md5 hash

The hashCode returned from the picture uploader is based on md5, but formatted as a guid. The difference is big or little endianess. If you prefer to reference the picture by its md5 code, you can use the md5 attribute instead:

Reference a picture with a public uri

Instead of referencing an image by hashCode or md5, you can provide a public uri from where Mediablob can download the picture for you. Mediablob will only use the same uri once, so you must ensure the uri is unique for each picture. Avoid using this scheme unless you are using a picture database that ensure unique uri's per picture.

In the sample above, Mediblob would keep using the original downloaded picture even if the content of the uri changes.

Extending existing products

When you want to extend a product with additional information you simply send the product information you have with an existing product identifier.

The extended information can be anything; an additional language, an extra product code or picture references.

Adding a new text field

You can also reference the product by its ean code instead, by replacing the first line with <product id="123456789012" idType="EAN13">. As you see, any code can be used as long as it is unique to the product.

Adding a new language

Continuing on the section Extending product information, English could have been added to the existing product by sending only this xml:

As you see, adding a field or an entire extra language is essentially the same. Just reference the product by its identifier and add the missing information.

Overloading product information

As stated initially, all products at a top customer node are available to all children. This means there is usually no need to add products at a store level. Instead the products are added to the HQ node or any branch-nodes in between HQ and the stores used for segmentation of information.

In some instances a store or branch-node needs to replace a certain part of a product. This is achieved by sending the same kind of update mentioned above, but for another customerId. Customer id´s are defined in the SOAP metadata and described in detain in a later chapter.

Future price changes

Future price changes requires the use of StoreInfo schema version 1.6 or higher and is only supported by Shoppa versions 2.25 or higher.

Changing the price for a later date

Assume we have the following base price list to begin with. It has a start date of 2020-01-01

From 2020-01-15 we want to increase the price of product 111111 to 59.95 SEK. We also want to lower the price of 222222 to 19.95 and 444444 to 69.95 two weeks later.

Here we have to refer to the same package ID as the base price list if the changes are to be combined with the base price list at desired change date. Each package startdate in the XML defines when the changes will apply.

We have therefore created one package with startdate 2020-01-15 and one with startdate 2020-02-01 for the respective price changes.

The price of the product 333333remains the same at each change date.

Periodically changed price

If we want to reduce a price during a short period of time, for e.g. under a two month time. Afterwards we are to set the old price back again. We can not set a stopdate for the reduced price, instead we have to send the higher price on new.

The product will now be on a reduced priced during the two months between 2020-02-01 and 2020-03-31. At 2020-04-01 th eproduct will return to its original price.

Deleting future price changes

It is possible to remove a previously uploaded package in case it was incorrect. This will remove all price changes that were set to occur at the specific date.

We delete the price changes above for 2020-02-01 with this xml:

The price change at 2020-01-15 will still be in effect.

To remove individual products from future price changes, use the delete attribute on the product element, like so:

We have now deleted the change for product 444444.The change for product 222222 at 2020-02-01 will still remain.

Removing all future price changes for a product

Here we will send in a few price changes for the product 111111 over a period of time. We will have price changes at each package startdate.

To remove all future price changes for product 111111we have to delete the product from each future price change package with the same startdate defined as when the change were to occur. The XML will look like this:

Assuming we don't know when all the price changes for a product occurs, we can delete all prices for a product by sending in the product with an empty price value. The startdate of the package will determine from which date the prices are deleted.

All future price changes and the current price for product 111111 are now deleted, starting 2020-01-15.

Correct a future price change

Here we have a price change for 2020-02-01. After a while it is decided that the product should have another price from the same startdate. Correcting the price change is accomplished by setting the new price for the same startdate.

At 2020-02-01 the product will now have a price of 24.95 instead of the original 19.95.

Replacing an entire pricelist

Some time passes and we have made multiple changes to our pricelists at different times. For some reason we may have the need to replace all prices in a pricelist with new prices. Some products may no longer be relevant for example. We do this by setting the fullPackage attribute like this:

Now there will no longer be a price for product 333333 or 444444 starting from 2020-04-15.

<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <texts>
        <text languageCode="en-GB">
          <field name="infoshort">Manufactured in Sweden by the respected brand Orrefors.</field>
        </text>
      </texts>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <texts>
        <text productName="Champagne glass" brand="Orrefors" languageCode="en-GB">
          <field name="sashort"><![CDATA[Exclusive Twin-pack, the perfect wedding present.]]></field>
          <field name="salong"><![CDATA[Efva Attling is a designer of jewellery who has now brought her considerable experience and skills to the creation of glass. The third glass of the collection is a more masculine martini glass whose silver ring, though slightly sterner than its cousins, expresses the same warm sentiments.]]></field>
          <field name="unit">item</field>
        </text>
      </texts>
    </product>
  </products>
</mediablob>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T12:51:18" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Central Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="49.95" />
        </product>
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
        <product id="333333" idType="Code1">
            <field name="price" value="34.95" />
        </product>
        <product id="444444" idType="Code1">
            <field name="price" value="79.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T12:51:18" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-01-15" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="59.95" />
        </product>
    </package>
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="19.95" />
        </product>
        <product id="444444" idType="Code1">
            <field name="price" value="69.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T12:51:18" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" name="Central Pricelist" startDate="2020-01-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
    <package id="PL01" name="Central Pricelist" startDate="2020-02-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="19.95" />
        </product>
    </package>
    <package id="PL01" name="Central Pricelist" startDate="2020-04-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se" delete="true" />
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="444444" idType="Code1" delete="true" />
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="69.95" />
        </product>
    </package>
    <package id="PL01" startDate="2020-03-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="64.95" />
        </product>
    </package>
    <package id="PL01" startDate="2020-04-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="69.95" />
        </product>
    </package>
    <package id="PL01" startDate="2020-05-01" countryCode="se">
        <product id="111111" idType="Code1">
            <field name="price" value="59.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="111111" idType="Code1" delete="true" />
    </package>
    <package id="PL01" startDate="2020-03-01" countryCode="se">
        <product id="111111" idType="Code1" delete="true" />
    </package>
    <package id="PL01" startDate="2020-04-01" countryCode="se">
        <product id="111111" idType="Code1" delete="true" />
    </package>
    <package id="PL01" startDate="2020-05-01" countryCode="se">
        <product id="111111" idType="Code1" delete="true" />
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T15:11:14" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-01-15" countryCode="se">
        <product id="111111" idType="Code1" />
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T16:32:05" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="19.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-01-01T16:32:05" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-02-01" countryCode="se">
        <product id="222222" idType="Code1">
            <field name="price" value="24.95" />
        </product>
    </package>
</storeInformation>
<storeInformation customerID="HQ" customerIDType="ExternalID" createDate="2020-04-15T16:32:05" schemaVersion="1.6" xmlns="http://shoppa.com/storeInfoSchema">
    <package id="PL01" startDate="2020-04-15" countryCode="se" fullPackage="true">
        <product id="111111" idType="Code1">
            <field name="price" value="49.95" />
        </product>
        <product id="222222" idType="Code1">
            <field name="price" value="29.95" />
        </product>
    </package>
</storeInformation>
Image upload via REST
Image upload via SOAP
Image upload as URI via Mediablob.xml
<?xml version="1.0" encoding="UTF-8"?>
<productGroups customerID="" customerIDType="" createDate="2016-08-25T01:01:33Z" xmlns="http://shoppa.com/productGroupsSchema">
    <groups>
        <group id="">
            <texts>
                <text languageCode="" name="" />
            </texts>
            <groups>
                <group id="">
                    <texts>
                        <text languageCode="" name="" />
                        <text languageCode="" name="" />
                    </texts>
                </group>
            </groups>
        </group>
    </groups>
    <products>
        <product id="" idType="">
            <group ref="" />
            <group ref="" />
        </product>
    </products>
</productGroups>
<?xml version="1.0" encoding="UTF-8"?>
<productGroups customerID="1143" customerIDType="ShoppaID" createDate="2019-08-25T01:01:33Z" xmlns="http://shoppa.com/productGroupsSchema">
    <groups>
        <group id="1">
            <texts>
                <text languageCode="xx" name="Gardening" />
            </texts>
        </group>
        <group id="2">
            <texts>
                <text languageCode="xx" name="Interior decoration" />
            </texts>
        </group>
        <group id="3">
            <texts>
                <text languageCode="xx" name="Plumbing" />
            </texts>
        </group>
    </groups>
    <products>
        <product id="91234" idType="Code1">
            <group ref="1" />
        </product>
        <product id="92345" idType="Code1">
            <group ref="2" />
        </product>
        <product id="93456" idType="Code1">
            <group ref="3" />
        </product>
    </products>
</productGroups>
<?xml version="1.0" encoding="UTF-8"?>
<productGroups customerID="1143" customerIDType="ShoppaID" createDate="2016-08-25T01:01:33Z" xmlns="http://shoppa.com/productGroupsSchema">
    <groups>
        <group id="1">
            <texts>
                <text languageCode="xx" name="Plants" />
                <text languageCode="sv-SE" name="Växter" />
                <text languageCode="no-NO" name="Planter" />
            </texts>
            <groups>
                <group id="11">
                    <texts>
                        <text languageCode="xx" name="Vegetables" />
                        <text languageCode="sv-SE" name="Grönsaker" />
                        <text languageCode="no-NO" name="Grønnsaker" />
                    </texts>
                </group>
                <group id="12">
                    <texts>
                        <text languageCode="xx" name="Flowers" />
                        <text languageCode="sv-SE" name="Blommor" />
                        <text languageCode="no-NO" name="Blomster" />
                    </texts>
                    <groups>
                        <group id="121">
                            <texts>
                                <text languageCode="xx" name="Perennials" />
                                <text languageCode="sv-SE" name="Perenner" />
                                <text languageCode="no-NO" name="Stauder" />
                            </texts>
                        </group>
                        <group id="122">
                            <texts>
                                <text languageCode="xx" name="Annuals" />
                                <text languageCode="sv-SE" name="Annueller" />
                                <text languageCode="no-NO" name="Årbøker" />
                            </texts>
                        </group>
                    </groups>
                </group>
            </groups>
        </group>
        <group id="2">
            <texts>
                <text languageCode="xx" name="Gardening tools" />
                <text languageCode="sv-SE" name="Trädgårdsverktyg" />
                <text languageCode="no-NO" name="Hageredskap" />
            </texts>
        </group>
    </groups>
    <products>
        <product id="91234" idType="Code1">
            <group ref="11" />
            <group ref="12" />
        </product>
        <product id="92345" idType="Code1">
            <group ref="12" />
        </product>
        <product id="93456" idType="Code1">
            <group ref="121" />
        </product>
        <product id="94567" idType="Code1">
            <group ref="122" />
        </product>
        <product id="95678" idType="Code1">
            <group ref="2" />
        </product>
    </products>
</productGroups>
Product Group schema version 1.1
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <UploadStoreInfoXmlResponse xmlns="http://www.mediablob.com/">
            <UploadStoreInfoXmlResult>?&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;storeInformation customerID="7" customerIDType="ShoppaID" xmlns="http://shoppa.com/storeInfoSchema"&gt;&lt;package id="C1" name="Campaign nr. 1" startDate="01/01/2019 00:00:00" stopDate="02/02/2019 00:00:00" countryCode="se"&gt;&lt;product id="000001" idType="code1" error="Product does not exist in Mediablob." /&gt;&lt;/package&gt;&lt;/storeInformation&gt;</UploadStoreInfoXmlResult>
        </UploadStoreInfoXmlResponse>
    </soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <UploadStoreInfoXmlResponse xmlns="http://www.mediablob.com/">
            <UploadStoreInfoXmlResult>User is not authenticated.</UploadStoreInfoXmlResult>
        </UploadStoreInfoXmlResponse>
    </soap:Body>
</soap:Envelope>
<picture countryCode="xx" languageCode="xx" fieldName="productname" uri="http://example.com/img/product000001.jpg" error="The picture at 'http://example.com/img/product000001.jpg' could not be retrieved. Reason: The remote server returned an error: (404) Not Found.">http://example.com/img/product000001.jpg</picture>
<<picture fieldName="productName" hashCode="00000000-0000-0000-0000-000000000000" error="The supplied picture hashcode (00000000-0000-0000-0000-000000000000) does not match any known Mediablob picture.">00000000-0000-0000-0000-000000000000</picture>
<product id="000001" idType="code1" error="Product does not exist in Mediablob.">
    <field name="price" value="299.00" />
</product>
<product id="000001" idType="Code1" delete="true" error="Product does not exist.">true</product>
<product id="000001" idType="Code1" error="Product does not exist">
    <group ref="22" />
</product>
<product id="000001" idType="code1" error="Product is a duplicate.">
    <field name="price" value="299.00" />
</product>
<product id="000001" idType="code1" error="Failed to Save the product" />
<product id="000001" idType="Code1" error="Found 2 products">
    <group ref="22" />
</product>
<product id="000001" idType="Code1" error="Product has duplicates in the Xml file. The first copy of the product is saved.">Code1</product>
<product id="000001" idType="Code1" error="The product already belongs to another supplier.">Code1</product>
<product id="000001" idType="code1" error="Found existing product in database using the same product code: CodeType 'code1', Value '000001'. Product codes must be unique." />
<product id="000001" idType="code1" error="Found duplicate code: CodeType 'code1', Value '000001'. Product codes must be unique." />
<?xml version="1.0" encoding="utf-8"?>
<mediablob customerID="7" customerIDType="ShoppaID" createDate="2016-07-15T00:31:12.0043405+02:00" xmlns="http://shoppa.com/mediablobSchema">
</mediablob>
Failed to save picture '00000000-0000-0000-0000-000000000000'. The picture might be corrupt, try uploading the picture again or use another picture.
Failed to save picture '00000001-0001-0001-0001-000000000001'. The picture might be corrupt, try uploading the picture again or use another picture.
'<', hexadecimal value 0x3C, is an invalid attribute character. Line 3, position 57.
Guid 00000000-0000-0000-0000-000000000000
Line: 11, Position: 27 "The 'productName' attribute is invalid - The value '' is invalid according to its datatype 'String' - The actual length is less than the MinLength value."
encoding
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <codes>
        <code name="EAN13" value="123456789012" />
      </codes>
      <texts>
        <text productName="Champagneglas" brand="Orrefors" languageCode="sv-SE" />
      </texts>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <codes>
        <code name="EAN13" value="123456789012" />
      </codes>
      <texts>
        <text productName="Champagne glass" brand="Orrefors" languageCode="sv-SE">
          <field name="sashort">Exklusivt tvåpack &amp; en perfekt bröllopspresent.</field>
          <field name="salong">Efva Attling är en juveldesigner som har använt sin rika erfarenhet och expertis för att skapa glaskonst. Hennes tredje glas är ett maskulint martiniglas med en silverring.</field>
          <field name="unit">st</field>
        </text>
      </texts>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <codes>
        <code name="EAN13" value="123456789012" />
      </codes>
      <texts>
        <text productName="Champagne glass" brand="Orrefors" languageCode="xx"></text>
        <text productName="Champagne glas" languageCode="sv-SE">
          <field name="sashort">Exklusivt tvåpack &amp; en perfekt bröllopspresent.</field>
          <field name="salong">Efva Attling är en juveldesigner som har använt sin rika erfarenhet och expertis för att skapa glaskonst. Hennes tredje glas är ett maskulint martiniglas med en silverring.</field>
          <field name="unit">st</field>
        </text>
        <text productName="Champagne glass" languageCode="en-GB">
          <field name="sashort">Exclusive Twin-pack &amp; the perfect wedding present.</field>
          <field name="salong">Efva Attling is a designer of jewellery who has now brought her considerable experience and skills to the creation of glass. The third glass of the collection is a more masculine martini glass whose silver ring, though slightly sterner than its cousins, expresses the same warm sentiments.</field>
          <field name="unit">item</field>
        </text>
      </texts>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <codes>
        <code name="EAN13" value="123456789012" />
      </codes>
      <texts>
        <text productName="Champagne glass" brand="Orrefors" languageCode="xx"></text>
        <text productName="Champagne glass" brand="Orrefors" languageCode="sv-SE">
          <field name="sashort">Exklusivt tvåpack &amp; en perfekt bröllopspresent.</field>
          <field name="salong">Efva Attling är en juveldesigner som har använt sin rika erfarenhet och expertis för att skapa glaskonst. Hennes tredje glas är ett maskulint martiniglas med en silverring.</field>
          <field name="unit">st</field>
        </text>
        <text productName="Champagne glass" brand="Orrefors" languageCode="en-GB">
          <field name="sashort">Exclusive Twin-pack &amp; the perfect wedding present.</field>
          <field name="salong">Efva Attling is a designer of jewellery who has now brought her considerable experience and skills to the creation of glass. The third glass of the collection is a more masculine martini glass whose silver ring, though slightly sterner than its cousins, expresses the same warm sentiments.</field>
          <field name="unit">item</field>
        </text>
      </texts>
      <pictures>
        <picture countryCode="se" languageCode="sv-SE" fieldName="brand" hashCode="a18deaa4383718cefc1a643f49e37607" />
        <picture countryCode="se" languageCode="sv-SE" fieldName="productName" hashCode="4b70b9000951a15db2ba6e61f05c3158" />
      </pictures>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <pictures>
        <picture countryCode="se" languageCode="sv-SE" fieldName="brand" md5="a4ea8da13738ce18fc1a643f49e37607" />
      </pictures>
    </product>
  </products>
</mediablob>
<mediablob customerID="1143" customerIDType="ShoppaID" createDate="2018-05-12T00:00:00" schemaVersion="1.7" xmlns="http://shoppa.com/mediablobSchema">
  <products>
    <product id="65467-14" idType="Code1">
      <pictures>
        <picture countryCode="se" languageCode="sv-SE" fieldName="brand" uri="http://www2.mediablob.com/images/mediablob.png" />
      </pictures>
    </product>
  </products>
</mediablob>
schema version 1.7

Formats and resolution

The documentation is based on FreeImage version 3.18.0

Supported image formats

BMP (.bmp)

RGB – Indexed and 8 bits (per channel).

GIF (.gif )

Supports transparency RGB – Indexed

JPEG (.jpg and .jpeg)

RGB / CMYK / Grayscale Recommended format for product images that don’t need transparency and other photos.

PNG (.png)

RGB – Indexed, 8 bits and 16 bits (per channel) Grayscale – 8 bits and 16 bits (per channel)

Recommended format for graphics, logotypes and product images that need transparency.

TIFF (.tif and .tiff)

RGB – 8 bits and 16 bits (per channel) , supports transparency CMYK – 8 bits (per channel).

WebP (.webp)

Recommended resolution

The same image will be used between multiple print formats in Shoppa. To ensure that the image works in all formats, we advise you to use an image resolution that works in the largest format you will print from Shoppa.

We recommend using at least 150 PPI for your images to ensure a good quality for printing. The area of the image box in Shoppa will determine what pixel dimensions are needed.