Changes for page Sellables

Last modified by Shop Team on 2023/02/13 22:56

<
From version < 14.1 >
edited by Shop Team
on 2019/10/28 13:39
To version < 4.1 >
edited by Shop Team
on 2019/07/18 07:55
>
Change comment: There is no comment for this version

Summary

Details

Page properties
Title
... ... @@ -1,1 +1,1 @@
1 -Sellables
1 +Public Shop API
Content
... ... @@ -1,110 +1,119 @@
1 -= General Remarks =
1 += Preface =
2 2  
3 -These resources only work for shops that are based on the (new) Partner Area, not for legacy User Area-based shops. Terminology:
3 +Spreadshirt provides several ways to offer an online shop experience to your customers:
4 4  
5 +1. The standalone Spreadshop ([[this>>url:https://shop.spreadshirt.com/SpreadShop||shape="rect"]], for example). This application is officially developed, hosted and maintained by Spreadshirt. Running a Spreadshop requires zero technical skills and is always the recommended approach.
6 +1. JavaScript integration (described [[here>>url:https://help.spreadshirt.com/hc/en-us/articles/207487815-Website-Integration-with-JavaScript||shape="rect"]]). If you have an existing website, you can embed a piece of JavaScript into it that manipulates your website in order to embed the Spreadshop into your site. This requires a decent understanding of HTML and CSS in order to resolve any conflicts between your site and the Spreadshop that may arise.
7 +1. CMS plugins for [[WordPress>>url:https://wordpress.org/plugins/spreadshop/#developers||shape="rect"]] and others (currently just [[Joomla>>url:https://extensions.joomla.org/extension/spreadshop/||shape="rect"]]) that embed the JavaScript snippet mentioned in (2.) for you. If you run a website based on such CMS, these plugins can make your life a bit easier. An understanding of HTML and CSS is nonetheless important.
8 +1. An independent, custom built web application based on the **Public Shop API** described in this document. This interface is for web developers only (or people who can afford to hire one). Going for this approach is only feasible for people who have a solid understanding of server side & client side programming, HTTP, HTML and CSS.
9 +
10 += Prerequisites =
11 +
12 +The **Public Shop API** only works for shops that are based on the (new) Partner Area, not for legacy User Area-based shops. On top of that, an API key is required.
13 +Note that not only the content you upload in the Partner Area, but also the shop settings affect the output of the **Public Shop API**. For example, enabling model images affects the image URLs returned by the API.
14 +
15 += Terminology =
16 +
17 +Partner Area shops are not based on the old domain entities **articles** and **products** anymore. Instead, they are based on **ideas** and **sellables** (sic!).
18 +
5 5  * an **idea** represents an image you uploaded in the Partner Area that you gave a name and added other meta data to. In the Partner Area this is loosely referred to as a **design**.
6 6  * a **sellable** is a representation of an **idea** printed on a **product type**. Depending on the product range selected in the Partner Area, one **idea** might have 100+ **sellables** associated with it.
7 7  
8 8  A **sellable** is thus something concrete that a customer can buy, while an **idea** represents a grouping of content mainly intended to make administration easier.
9 9  
10 -All requests to the **Public Shop API** should be made from your server and not from the browser. This allows you to leverage caching, avoids [[CORS>>url:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing||shape="rect"]] policy interference and keeps your API key secure.
24 += Changelog =
11 11  
12 -= List Resource =
26 +* 22 July 2019: 1.0
27 +** The field **previewImage** as well as the content of the **images** array have been changed from strings to objects. These objects now contain information about the image type.
28 +** Introduced a **legacy article mapping resource**.
29 +* 27 June 2019: Beta
30 +** Beta release with request for feedback
13 13  
14 -(% class="wrapped" %)
15 -|=(((
16 -Method
17 -)))|=(((
18 -URL
19 -)))|=(((
20 -Example
21 -)))
22 -|(((
23 -GET
24 -)))|(((
25 -{{{/api/v1/shops/&#x3c;shopId&#x3e;/sellables?page=&#x3c;page&#x3e;}}}
26 -)))|(((
27 -(% style="color: rgb(80,80,80);" %)[[https:~~/~~/api.spreadshirt.net/api/v1/shops/100488332/sellables?page=0>>url:https://api.spreadshirt.net/api/v1/shops/100488332/sellables?page=0||shape="rect"]]
28 -)))
32 += REST Resources =
29 29  
34 +== Base URLs ==
30 30  
36 +As always, use [[https:~~/~~/api.spreadshirt.com>>url:https://api.spreadshirt.com||shape="rect"]] if your shop is based on the North American Spreadshirt platform or use [[https:~~/~~/api.spreadshirt.net>>url:https://api.spreadshirt.net||shape="rect"]] if your shop runs on the European platform.
37 +
38 +== Authentication ==
39 +
40 +Please provide your API key as described [[here>>doc:Security]]. A signature or sessionId is not required.
41 +Remember to set a user agent header naming your application and including its version. Example: "MyApp-1.0"
42 +
43 +== Client / Server ==
44 +
45 +All requests to the *Public Shop API* should be made from your server and not from the browser. This allows you to leverage caching, avoids CORS policy interference and keeps your API key secure.
46 +
47 +== List Resource ==
48 +
49 +\\
50 +
51 +{{code title="Request"}}
52 +GET {baseUrl}/api/v1/shops/{shopId}/sellables?page=0
53 +
54 +{{/code}}
55 +
56 +\\
57 +
31 31  Returns a paginated list of the shop's sellables in a format like this:
32 32  
33 33  {{code language="js" title="Response Payload"}}
34 34  {
35 - "count" : 4760,
36 - "limit" : 48,
37 - "offset" : 0,
38 - "sellables" :
39 - [
40 - {
41 - "sellableId" : "praawgg73zU5gzZN0gaM-812-7",
42 - "ideaId" : "5d22f8ebb264a16f6b87fb6f",
43 - "mainDesignId": "142648902",
44 - "productTypeId" : "812",
45 - "price" :
46 - {
47 - "amount" : 17.49,
48 - "currencyId" : "1"
49 - },
50 - "name" : "I love you",
51 - "tags" :
52 - [
53 - "Young wild and free",
54 - "shop api",
55 - "test",
56 - "Young money",
57 - "Loved",
58 - "Lovestruck",
59 - "Love with heart",
60 - "Love hurts",
61 - "Love",
62 - "Love me",
63 - "Youtube",
64 - "migration",
65 - "Your",
66 - "You",
67 - "Love parade"
68 - ],
69 - "previewImage" :
70 - {
71 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/1,width=500,height=500,appearanceId=2,crop=list,modelId=1111,version=1564481428.jpg",
72 - "type" : "MODEL"
73 - },
74 - "appearanceIds" :
75 - [
76 - "411",
77 - "645",
78 - "648",
79 - "649",
80 - "719",
81 - "1",
82 - "2",
83 - "366",
84 - "348",
85 - "387",
86 - "92",
87 - "39",
88 - "231",
89 - "317",
90 - "3",
91 - "29",
92 - "328",
93 - "339"
94 - ],
95 - "defaultAppearanceId" : "2"
96 - }
97 - ]
62 +"count" : 473,
63 +"limit" : 48,
64 +"offset" : 0,
65 +"sellables" :
66 +[
67 +{
68 +"sellableId" : "74bYwmw5a3tXgyZpnw7j-812-7",
69 +"ideaId" : "5c7e78f95fd3e45786249fb0",
70 +"productTypeId" : "812",
71 +"price" :
72 +{
73 +"amount" : 21.99,
74 +"currencyId" : "1"
75 +},
76 +"name" : "Boss in black",
77 +"description" : "Be your own boss in black and printed by real people in black!",
78 +"tags" :
79 +[
80 +"Fanwear",
81 +"SpreadShop",
82 +"Awesome"
83 +],
84 +"previewImage" :
85 +{
86 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/1,width=500,height=500,appearanceId=1,crop=list,modelId=85,version=1554885779/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
87 +"type" : "MODEL"
88 +},
89 +"appearanceIds" :
90 +[
91 +"411",
92 +"645",
93 +"649",
94 +"1",
95 +"366",
96 +"92",
97 +"39",
98 +"231",
99 +"317",
100 +"3",
101 +"29",
102 +"328"
103 +],
104 +"defaultAppearanceId" : "1"
105 +},
106 +// more sellables
107 +]
98 98  }
99 99  {{/code}}
100 100  
101 101  The fields are to be interpreted as follows:
102 102  
103 -(% class="wrapped" %)
104 104  |=(((
105 -Field
114 +Field name
106 106  )))|=(((
107 -Description
116 +Meaning
108 108  )))
109 109  |(((
110 110  sellableId
... ... @@ -116,17 +116,10 @@
116 116  )))|(((
117 117  Identifies the uploaded design. Necessary to query the detail resource but also useful to group content by design if desired.
118 118  )))
119 -|(% colspan="1" %)(% colspan="1" %)
120 -(((
121 -(% class="objectBox objectBox-string" %)mainDesignId
122 -)))|(% colspan="1" %)(% colspan="1" %)
123 -(((
124 -Identifies the main image/design which is used for this Idea (usually the first design you add in the Partner Area). Can be used if you want to use  the [[Designs Resource>>doc:Designs]] in combination with this resource.
125 -)))
126 126  |(((
127 127  productTypeId
128 128  )))|(((
129 -Identifies the 'type of garment' used. Can be used to lookup additional meta data from the product type resources described [[here>>doc:ProductType]].
131 +Identifies the 'type of garment' used. Can be used to lookup additional meta data from the product type resources described [[here>>doc:Inventory Resources]].
130 130  )))
131 131  |(((
132 132  price
... ... @@ -154,12 +154,12 @@
154 154  An image we deem best suited to represent the sellable on a list page.
155 155  )))
156 156  |(((
157 -previewImage/url
159 +previewImage.url
158 158  )))|(((
159 159  The image url you can embed directly into your page.
160 160  )))
161 161  |(((
162 -previewImage/type
164 +previewImage.type
163 163  )))|(((
164 164  Describes the type of image available from the url using one of the following values: PRODUCT, DESIGN, MODEL, ALTERNATIVE_MODEL.
165 165  )))
... ... @@ -168,7 +168,7 @@
168 168  appearanceIds
169 169  )))|(% colspan="1" %)(% colspan="1" %)
170 170  (((
171 -The 'colors' a sellable currently has available for purchase. If you need more information on the colors, the product type resource [[here>>doc:ProductType]] is useful.
173 +The 'colors' a sellable currently has available for purchase. If you need more information on the colors, the product type resource [[here>>doc:Inventory Resources]] is useful.
172 172  )))
173 173  |(% colspan="1" %)(% colspan="1" %)
174 174  (((
... ... @@ -182,124 +182,97 @@
182 182  Implementation remarks: For advanced implementations, it is usually best to import the content of the sellable list into your own data base in regular intervals (for example once every 24h).
183 183  This allows you to implement a custom navigation structure, filters, etc. according to your needs.
184 184  
185 -= Detail Resource =
187 +== Detail Resource ==
186 186  
187 -(% class="wrapped" %)
188 -|=(((
189 -Method
190 -)))|=(((
191 -URL
192 -)))|=(((
193 -Example
194 -)))
195 -|(((
196 -GET
197 -)))|(((
198 -{{{/api/v1/shops/&#x3c;shopId&#x3e;/sellables/&#x3c;sellableId&#x3e;?appearanceId=&#x3c;appearanceId&#x3e;&#x26;ideaId=&#x3c;ideaId&#x3e;}}}
199 -)))|(((
200 -(% style="color: rgb(80,80,80);" %)[[https:~~/~~/api.spreadshirt.net/api/v1/shops/100488332/sellables/praawgg73zU5gzZN0gaM-812-7?appearanceId=411&ideaId=5d22f8ebb264a16f6b87fb6f>>url:https://api.spreadshirt.net/api/v1/shops/100488332/sellables/praawgg73zU5gzZN0gaM-812-7?appearanceId=411&ideaId=5d22f8ebb264a16f6b87fb6f||shape="rect"]]
201 -)))
189 +{{code title="Request"}}
190 +GET {baseUrl}/api/v1/shops/{shopId}/sellables/{sellableId}?appearanceId={appearanceId}&ideaId={ideaId}
202 202  
203 -\\
192 +{{/code}}
204 204  
205 205  Returns detailed information on a specific sellable in a specific appearance in a format like this:
206 206  
207 207  {{code language="js" title="Response Payload"}}
208 208  {
209 - "sizeIds" :
210 - [
211 - "2",
212 - "3",
213 - "4",
214 - "5",
215 - "6",
216 - "38",
217 - "94",
218 - "102"
219 - ],
220 - "images" :
221 - [
222 - {
223 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/1,width=650,height=650,appearanceId=411,crop=detail,modelId=1111,version=1564481428.jpg",
224 - "type" : "MODEL"
225 - },
226 - {
227 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/compositions/T812A2PA3811PT17X50Y96D163261757FS2991/views/1,width=650,height=650,appearanceId=411.jpg",
228 - "type" : "DESIGN"
229 - },
230 - {
231 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/2,width=650,height=650,appearanceId=411,crop=detail,modelId=1117,version=1564481457.jpg",
232 - "type" : "MODEL"
233 - },
234 - {
235 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/3,width=650,height=650,appearanceId=411.jpg",
236 - "type" : "PRODUCT"
237 - },
238 - {
239 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/4,width=650,height=650,appearanceId=411.jpg",
240 - "type" : "PRODUCT"
241 - },
242 - {
243 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/1,width=650,height=650,appearanceId=411,crop=detail,modelId=85,version=1564482744.jpg",
244 - "type" : "ALTERNATIVE_MODEL"
245 - }
246 - ],
247 - "sellableId" : "praawgg73zU5gzZN0gaM-812-7",
248 - "ideaId" : "5d22f8ebb264a16f6b87fb6f",
249 - "mainDesignId": "142648902",
250 - "productTypeId" : "812",
251 - "price" :
252 - {
253 - "amount" : 17.49,
254 - "currencyId" : "1"
255 - },
256 - "name" : "112016603 143175205 I love you",
257 - "tags" :
258 - [
259 - "Young wild and free",
260 - "shop api",
261 - "test",
262 - "Young money",
263 - "Loved",
264 - "Lovestruck",
265 - "Love with heart",
266 - "Love hurts",
267 - "Love",
268 - "Love me",
269 - "Youtube",
270 - "migration",
271 - "Your",
272 - "You",
273 - "Love parade"
274 - ],
275 - "previewImage" :
276 - {
277 - "url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A2PA3811PT17X50Y96D163261757FS2991/views/1,width=500,height=500,appearanceId=2,crop=list,modelId=1111,version=1564481428.jpg",
278 - "type" : "MODEL"
279 - },
280 - "appearanceIds" :
281 - [
282 - "411",
283 - "645",
284 - "648",
285 - "649",
286 - "719",
287 - "1",
288 - "2",
289 - "366",
290 - "348",
291 - "387",
292 - "92",
293 - "39",
294 - "231",
295 - "317",
296 - "3",
297 - "29",
298 - "328",
299 - "339"
300 - ],
301 - "defaultAppearanceId" : "2"
198 +"sizeIds" :
199 +[
200 +"2",
201 +"3",
202 +"4",
203 +"5",
204 +"6",
205 +"38",
206 +"94",
207 +"102"
208 +],
209 +"images" :
210 +[
211 +{
212 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/1,width=650,height=650,appearanceId=411,crop=detail,modelId=85,version=1554885779/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
213 +"type" : "MODEL"
214 +},
215 +{
216 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/2,width=650,height=650,appearanceId=411,crop=detail,modelId=91,version=1554885805/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
217 +"type" : "MODEL"
218 +},
219 +{
220 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/compositions/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/1,width=650,height=650,appearanceId=411/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
221 +"type" : "DESIGN"
222 +},
223 +{
224 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/compositions/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/2,width=650,height=650,appearanceId=411/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
225 +"type" : "DESIGN"
226 +},
227 +{
228 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/3,width=650,height=650,appearanceId=411/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
229 +"type" : "PRODUCT"
230 +},
231 +{
232 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/4,width=650,height=650,appearanceId=411/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
233 +"type" : "PRODUCT"
234 +},
235 +{
236 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/1,width=650,height=650,appearanceId=411,crop=detail,modelId=1111,version=1554884899/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
237 +"type" : "ALTERNATIVE_MODEL"
302 302  }
239 +],
240 +"sellableId" : "74bYwmw5a3tXgyZpnw7j-812-7",
241 +"ideaId" : "5c7e78f95fd3e45786249fb0",
242 +"productTypeId" : "812",
243 +"price" :
244 +{
245 +"amount" : 21.99,
246 +"currencyId" : "1"
247 +},
248 +"name" : "Boss in black",
249 +"description" : "Be your own boss in black and printed by real people in black!",
250 +"tags" :
251 +[
252 +"Fanwear",
253 +"SpreadShop",
254 +"Awesome"
255 +],
256 +"previewImage" :
257 +{
258 +"url" : "https://image.spreadshirtmedia.net/image-server/v1/products/T812A1PA3811PT17X49Y84D142648902FS2951PA3813PT17X60Y17D142648934FS2706/views/1,width=500,height=500,appearanceId=1,crop=list,modelId=85,version=1554885779/be-your-own-boss-in-black-and-printed-by-real-people-in-black.jpg",
259 +"type" : "MODEL"
260 +},
261 +"appearanceIds" :
262 +[
263 +"411",
264 +"645",
265 +"649",
266 +"1",
267 +"366",
268 +"92",
269 +"39",
270 +"231",
271 +"317",
272 +"3",
273 +"29",
274 +"328"
275 +],
276 +"defaultAppearanceId" : "1"
277 +}
303 303  {{/code}}
304 304  
305 305  \\
... ... @@ -306,9 +306,8 @@
306 306  
307 307  Most of the fields are exactly the same as in the list resource and have the same semantics. Two additional fields are included:
308 308  
309 -(% class="wrapped" %)
310 310  |=(((
311 -Field
285 +Field name
312 312  )))|=(((
313 313  Meaning
314 314  )))
... ... @@ -315,7 +315,7 @@
315 315  |(((
316 316  sizeIds
317 317  )))|(((
318 -Describes the sizes available for purchase for the sellable in this appearance. For more information on sizes, check the product type resource [[here>>doc:ProductType]].
292 +Describes the sizes available for purchase for the sellable in this appearance. For more information on sizes, check the product type resource [[here>>doc:Inventory Resources]].
319 319  )))
320 320  |(((
321 321  images
... ... @@ -327,4 +327,46 @@
327 327  Implementation remarks: It is not feasible to import these detail resources into your own data base (because the number of entries can skyrocket quickly).
328 328  Instead, it is recommended to request the API dynamically in an ad-hoc manner once a customer visits a detail page.
329 329  
330 -\\
304 +== Basket resources ==
305 +
306 +The [[basket resources>>doc:Basket Resources]] generally still work as they used to. However, keep in mind that a sellable is a new domain entity and hence different from products and articles.
307 +To put a sellable into a basket, use this payload fragment instead:
308 +
309 +{{code language="xml" title="Payload Fragment"}}
310 +<element id="MLorqlGGrLhljORQ7old-1007-22" type="sprd:sellable">
311 +<properties>
312 +<property key="appearance">539</property>
313 +<property key="size">3</property>
314 +</properties>
315 +<shop id="100229382" href="https://api.spreadshirt.net/api/v1/shops/100229382"/>
316 +</element>
317 +{{/code}}
318 +
319 +
320 +Note that the **type** property needs a different constant now and a **shop** tag needs to be sent as well.
321 +
322 +== Legacy article mapping resource ==
323 +
324 +If your shop was subject to a migration from the old model (that was based on articles and was accessible through the User Area), you may still have deeplinks or internal data structures referencing these now-gone articles.
325 +To ease the transition phase, we provide the following resource that allows you to find the corresponding sellable your article was migrated to:
326 +
327 +{{code title="Request"}}
328 +GET {baseUrl}/api/v1/shops/{shopId}/sellables/findForArticle?articleId={articleId}
329 +
330 +{{/code}}
331 +
332 +
333 +The response contains the identifiers necessary to make the connection between old and new domain entities.
334 +
335 +{{code language="js" title="Response Payload"}}
336 +{
337 +"ideaId": "5d0a19935fd3e41d7dd6900f",
338 +"productTypeId": "725",
339 +"sellableId": "R43XoE5rBATzxQnRNykG-725-9"
340 +}
341 +{{/code}}
342 +
343 +== Code example ==
344 +
345 +There is an example integration of this API available [[here>>url:https://github.com/spreadshirt/shop-api-example-integration||shape="rect"]].
346 +It shows a draft of a shop system written in php that might be helpful to understand the (list-page -> detail-page -> add-to-basket) workflow.
Confluence.Code.ConfluencePageClass[0]
id
... ... @@ -1,1 +1,1 @@
1 -36732929
1 +28278802
url
... ... @@ -1,1 +1,1 @@
1 -https://developer.spreadshirt.net/wiki/spaces/API/pages/36732929/Sellables
1 +https://developer.spreadshirt.net/wiki/spaces/API/pages/28278802/Public Shop API