Import asincron de produse
Adresa URL a serviciului Webservice : https://sws.spartoo.ro/mp/xml_import_products_async.phpAcest serviciu web ar trebui să fie utilizat în același mod ca și xml_import_products
Singura diferență față de acest serviciu web este că acesta integrează produsele în mod asincron.
Atunci când solicitați acest serviciu web, acesta trimite o adresă URL.
Dacă solicitați aceasta adresa URL, veți obține statutul integrării fișierului.
Funcționare
Importul asincron funcționează în doi pași:
- Trimiterea fluxului: apelați serviciul web cu parametrul xml. Fluxul este pus în coadă și serviciul web răspunde imediat cu un URL (eticheta url) care conține identificatorul importului dvs. (parametrul export).
- Monitorizarea și recuperarea rezultatului: apelați serviciul web cu parametrul export până când obțineți rezultatul procesării (consultați lista stărilor de mai jos).
Fluxul poate fi trimis în format XML brut sau comprimat în format ZIP: formatul ZIP este detectat automat.
Lista de parametri
Parametrii de la acest serviciu web trebuie obligatoriu să fie transmis în POST| Paramètre | Descriere |
|---|---|
| partener | Trebuie să conțină identificatorul vostru unic : |
| xml | Șir de caracter XML care conține lista elementelor care trebuie create sau actualizate |
Parametrii opționali care pot fi transmiși în POST
| Paramètre | Descriere |
|---|---|
| force_description | Setați 1 dacă doriți să forțați actualizarea des descrierilor produse: ștergeți descrierile existente, editați descrierea unui produs din stoc zero, etc. |
| force_overwrite | Setați1 dacă doriți să corectați erorile de integrare legate de o scădere semnificativă a prețurilor |
| async | Setați la 1 dacă doriți să utilizați metoda asynchrone | asynchrone
| Parametru | Etapă | Descriere |
|---|---|---|
| xml | 1 | Conținutul fluxului de produse (XML brut sau ZIP). Consultați formatele de mai jos. |
| export | 2 | Identificator import, returnat la etapa 1 în URL-ul de răspuns. |
Format parametru xml
Câmpurile de text trebuie să fie protejate de balize CDATA dacă conține caractere speciale care ar putea face XML invalid.
Format mono country
<root> <products> <product> <reference_partenaire>string</reference_partenaire> <product_name>string</product_name> <manufacturers_name>string</manufacturers_name> <product_sex>char</product_sex> <product_price>float</product_price> <product_quantity>int</product_quantity> <color_id>int</color_id> <product_style>int</product_style> <product_description>string</product_description> <product_color>string</product_color> <heel_height>float</heel_height> <country_origin>int</country_origin> <code_hs>int</code_hs> <size_list> <size> <size_name>string</size_name> <size_quantity>int</size_quantity> <size_reference>string</size_reference> <ean>string</ean> <code_hs>int</code_hs> <product_price>float</product_price> <discount> <startdate>timestamp</startdate> <stopdate>timestamp</stopdate> <price_discount>float</price_discount> <rate>int</rate> <sales/> </discount> </size> <!-- ... Mai multe balize "size" posibile ... --> </size_list> <product_composition>int</product_composition> <voering_composition>int</voering_composition> <first_composition>int</first_composition> <zool_composition>int</zool_composition> <photos> <url1>url</url1> <url2>url</url2> <url3>url</url3> <url4>url</url4> <url5>url</url5> <url6>url</url6> <url7>url</url7> <url8>url</url8> </photos> <discount> <startdate>timestamp</startdate> <stopdate>timestamp</stopdate> <price_discount>float</price_discount> <rate>int</rate> <sales>0/1</sales> </discount> <extra_infos> <info> <id>int</id> <value>float</value> </info> <!-- ... Mai multe balize "info" posibile ... --> </extra_infos> <selections> <selection>int</selection> <!-- ... Mai multe balize "selection" posibile ... --> </selections> </product> <!-- ... Mai multe balize "product" posibile ... --> </products> </root>
Format multi-țară
<root> <products> <product> <reference_partenaire>string</reference_partenaire> <manufacturers_name>string</manufacturers_name> <product_sex>char</product_sex> <product_quantity>int</product_quantity> <color_id>int</color_id> <product_style>int</product_style> <heel_height>float</heel_height> <country_origin>int</country_origin> <code_hs>int</code_hs> <languages> <language> <code>string</code> <product_name>string</product_name> <product_description>string</product_description> <product_color>string</product_color> <product_price>float</product_price> <discount> <startdate>timestamp</startdate> <stopdate>timestamp</stopdate> <price_discount>float</price_discount> <rate>int</rate> <sales /> </discount> </language> <!-- ... Mai multe balize "language" posibile ... --> </languages> <size_list> <size> <size_name>string</size_name> <size_quantity>int</size_quantity> <size_reference>string</size_reference> <ean>string</ean> <code_hs>int</code_hs> <languages> <language> <code>string</code> <product_price>float</product_price> <discount> <startdate>timestamp</startdate> <stopdate>timestamp</stopdate> <price_discount>float</price_discount> <rate>int</rate> <sales/> </discount> </language> <!-- ... Mai multe balize "language" posibile ... --> </languages> </size> <!-- ... Mai multe balize "size" posibile ... --> </size_list> <product_composition>int</product_composition> <voering_composition>int</voering_composition> <first_composition>int</first_composition> <zool_composition>int</zool_composition> <photos> <url1>url</url1> <url2>url</url2> <url3>url</url3> <url4>url</url4> <url5>url</url5> <url6>url</url6> <url7>url</url7> <url8>url</url8> </photos> <extra_infos> <info> <id>int</id> <value>float</value> </info> <!-- ... Mai multe balize "info" posibile ... --> </extra_infos> <selections> <selection>int</selection> <!-- ... Mai multe balize "selection" posibile ... --> </selections> </product> <!-- ... Mai multe balize "product" posibile ... --> </products> </root>
Descrierea câmpurilor XML de intrare
| Balise | Descriere | Obligattoriu |
|---|---|---|
| reference_partenaire |
Codul de identificare al produsului furnizorului. Acesta este codul SKU care identifică un produs al unui brand într-o anumită culoare Codul de identificare al produsului poate conține doar caractere alfanumerice, precum și caracterele - (tiret) _ (tiret bas) et . (point). |
Oui |
| product_name |
Numele modeluui INu trebuie să conțină categoria, culoarea sau marca produsului De asemenea, nu trebuie să conțină caractere sau elemente html |
Nu |
| manufacturers_name | Numele brandului produsuluit | Oui |
| code_idu | Code IDU de la produs (vezi legea AGEC) | Non |
| product_sex |
Sex produs > Vezi valorile posibile |
Oui |
| product_price | Prețul produsului în euro (nu este obligatoriu pentru prețurile pe mărimi) | Oui / Non |
| color_id |
Culoare destinată filtrelor din meniuri Dacă nu este specificată, produsul nu va apărea în rezultatele căutării dacă un client utilizează un filtru după culoare > Vezi valorile posibile |
Nu |
| product_style |
Categoria produsului > Vezi valorile posibile |
Oui |
| product_description |
Descrierea produsului permite adăugarea unui număr cât mai mare de informații despre produse, care pot ajuta clientul să ia decizia de achiziție. Une bonne description produit est détaillée et spécifique pour chaque produit. În acest scop, ea poate conține denumirea modelului, marca, culoarea, stilul produsului, materialul etc. Il n'est pas possible d'y insérer de l'HTML, à l’exception du saut à la ligne: , " ", ainsi que , "", "" et . JavaScript nu este permis. Aceasta va fi vizibilă doar pe pagina produsului. Numărul maxim de caractere este de 65 000. |
Nu |
| product_color | Câmp de text liber pentru culoare. Apare pe fișa produsului. | Nu |
| product_quantity |
Stocul total al unui produs Se ignoră dacă se detectează una sau mai multe etichete size_quantity pentru produs. Pentru produsele cu mărime unică, este obligatorie prezența unei etichete product_quantity dacă baliza size_quantity nu este specificată.. |
Nu |
| size |
Liste des tailles et leur stock. Facultatif pour les produits sans tailles ( Sacs / Accessoires ). Obligatoire Sinon. |
Oui / Non |
| size_name |
Nom de la taille > Voir les valeurs possibles |
Oui |
| size_quantity | Pentru fiecare mărime, trebuie specificat stocul disponibil. Pentru a dezactiva un produs, trebuie să setați stocul la 0. Când stocul ajunge la 0, produsul este dezactivat și nu mai apare pe Spartoo. |
Oui |
| size_reference |
Referința produsului în funcție de mărime. Acest câmp este destinat exclusiv includerii în fișierele de export ale comenzilor sau retururilor.. O bună practică este generarea acestei referințe prin concatenarea câmpurilor reference_partenaire și size_name ” folosind o liniuță de jos "_". |
Nu |
| ean | EAN de la produs la mărime Obligatoriu pentru prestarea serviciilor logistice |
Non / Oui |
| foto |
Lista fotografiilor și adresele URL ale acestora. Este obligatorie cel puțin o fotografie. Vă recomandăm să aveți cel puțin 3 fotografii. Putem include maximum 8 fotografii Fotografia va fi încărcată o singură dată, apoi va fi stocată pe serverele noastre, după ce va fi redimensionată la dimensiunile Spartoo. Fotografiile trebuie să fie în format jpg, pătrate și să aibă cel puțin 500x500 pixeli. Dacă au dimensiuni mai mari sau egale cu 800x800 pixeli, pe site va fi posibilă mărirea imaginii. |
Oui |
| url1, url2 ... url8 |
Linkuri către fotografii Trebuie să ne furnizați un link către fiecare fotografie. Numele fișierului trebuie să conțină numai caractere alfanumerice, precum și caracterele „-” (liniuță), „_” (liniuță de subliniere) și „.” (punct). Spațiile, precum și literele accentuate (de exemplu, é, à și ñ) nu sunt permise. |
Oui |
| country_origin |
Țara de origine a produsului > Vezi valorile posibile |
Non |
| code_hs | Codul vamal al produsului | Nu |
| heel_height | Înălțimea tocului în centimetri (cm). Valabil numai pentru încălțămintea de damă. Trebuie să folosiți un punct pentru a separa unitatea de zecimale (de exemplu: 1,5). | No |
| product_composition |
Compoziția tălpii produsului. Numai pentru încălțăminte și genți > Vezi valorile posibile |
Non |
| voering_composition |
Compoziția căptușelii produsului. Valabil numai pentru încălțăminte și genți > Vezi valorile posibile |
Non |
| first_composition |
Compoziția tălpii interioare a produsului. Numai pentru încălțăminte > Vezi valorile posibile |
Non |
| zool_composition |
Compoziția tălpii exterioare a produsului. Numai pentru încălțăminte > Voir les valeurs possibles |
Non |
| discount |
Permite aplicarea unei promoții la produs sau la o mărime. Campul rate din campul discount se referă la reducerea procentuală a prețului față de valoarea de referință product_price. Campul price_discount du champ discount se referă la prețul redus al produsului. Procentul de reducere afișat va fi calculat. Dacă ambele câmpuri sunt prezente, câmpul price_discount are prioritate față de câmpul rate. Dacă reducerea este aplicată imediat, nu este necesar să se precizeze câmpul startdate. Dacăcampul stopdate dacă nu se specifică altfel, promoția va avea o durată implicită de o lună. Daca baliza sales este specificat, promoția va fi una de lichidare de stoc. În caz contrar, va fi o promoție clasică. Setarea acestui parametru permite afișarea produselor pe pagina de lichidare de stoc în perioadele de lichidare de stoc. (1 corespunde unei categorii de lichidare de stoc, iar 0 unei categorii de reduceri obișnuite) |
Non |
| extra_infos |
Permet de spécifier des informations complémentaires dépendantes du type de produit. Chaque information est constitué d'un id ( > Voir les valeurs ) et d'une valeur sous forme numérique. |
Non |
| languages |
Permite gestionarea distribuției în mai multe țări și specificarea datelor traduse, precum și a prețurilor
diferite în funcție de țară (denumirea produsului, descrierea, prețul de bază, culoarea, codul IDU și promoția)). Fiecare bloc conține una sau mai multe etichete language caracterizate printr-un code de țară/limbă obligatorie (ex: FR, IT, DE, etc.). Gestionarea în funcție de mărime : Această etichetă poate fi adăugată și sub fiecare etichetă size pour appliquer des prix et des promotions spécifiques par taille et par pays. Reguli esențiale de comportament : • Stocuri globale : Nu este posibil să se gestioneze cantități diferite pentru fiecare țară. Stocul (cantitatea) rămâne strict global la nivel de dimensiune. • Dezactivarea produsului pe țări : Dacă o țară/limbă este eliminată din bloc languages la nivelul produsului (de exemplu: eticheta FR este prezentă, dar eticheta IT lipsește), produsul va fi dezactivat automat (retras) pentru această țară. • Retragerea unei țări de pe o mărime: Dacă o țară este exclusă din bloc languages la nivelul unei mărimi (de exemplu, mărimea 42), dar acea țară rămâne activă la nivelul general al produsului, mărimea 42 nu va fi dezactivată pentru aceasta țara, Ea va rămâne disponibilă la vânzare, dar nu va mai avea prețul specific pentru mărimea respectivă și se va alinia automat, în mod implicit (fallback), la prețul general al produsuluit (product_price) definit pentru această țară. Pentru a dezactiva complet o mărime, trebuie să setați stocul total al acesteia la 0. |
Non |
Exemplu de parametru xml
<root> <products> <product> <reference_partenaire>98</reference_partenaire> <product_name><![CDATA[ALL STAR HI]]></product_name> <manufacturers_name><![CDATA[Converse]]></manufacturers_name> <product_sex>M</product_sex> <product_price>64.99</product_price> <product_quantity>5</product_quantity> <color_id>8</color_id> <product_style>10010</product_style> <product_description><![CDATA[Mitic printre mitici, Chuck Taylor All Star de Converse un must have indispensabil. În versiunea tip gheată și cu partea exterioară confecționată din pânză și imprimeuri clasice, el va rămâne întodeaune un must have atemporal și trendy ! ]]></product_description> <product_color><![CDATA[Roșu]]></product_color> <country_origin>73</country_origin> <code_hs>64059090</code_hs> <size_list> <size> <size_name>38</size_name> <size_quantity>4</size_quantity> <size_reference>98_38</size_reference> <ean>123456789011></ean> </size> <size> <size_name>39</size_name> <size_quantity>1</size_quantity> <size_reference>98_39</size_reference> <ean>123456789012></ean> </size> </size_list> <product_composition>4</product_composition> <photos> <url1>https://imgext.spartoo.com/photos/98/98/98_350_A.jpg</url1> <url2>https://imgext.spartoo.com/photos/98/98/98_350_B.jpg</url2> <url3>https://imgext.spartoo.com/photos/98/98/98_350_C.jpg</url3> <url4>https://imgext.spartoo.com/photos/98/98/98_350_D.jpg</url4> <url5>https://imgext.spartoo.com/photos/98/98/98_350_E.jpg</url5> <url6>https://imgext.spartoo.com/photos/98/98/98_350_F.jpg</url6> <url7>https://imgext.spartoo.com/photos/98/98/98_350_G.jpg</url7> <url8>https://imgext.spartoo.com/photos/98/98/98_350_H.jpg</url8> </photos> <discount> <startdate>1199170800</startdate> <stopdate>1204354800</stopdate> <rate>20</rate> </discount> </product> </products> </root>
Transfer de flux prin fișier
De asemenea, este posibil să transferați fluxul (XML sau ZIP) printr-un fișier. Pentru a face acest lucru, corpul cererii trebuie să conțină numai fișierul.
Parametrii diverși (precum« partener », « force_description », « force_overwrite », …) trebuie transmise obligatoriu în GET.
Prețuri și discounturi în funcție de mărime
Balizele de preț și reducere în funcție de mărime au fost introduse pentru a permite o diferențiere precisă a prețurilor în cadrul aceluiași produs.Ele nu trebuie utilizate decât în cazul în care o mărime are un preț diferit de prețul general al produsului.
Prețul stabilit la nivel de produs constituie referința principală. Etichetele specifice unei mărimi au rolul de a suprataxa acest preț numai atunci când este necesară o excepție (de exemplu: mărimi speciale, costuri suplimentare pentru materiale, sfârșitul unei serii parțiale etc.).
Este strict interzisă utilizarea balizelor de preț sau de reducere pe mărimi atunci când toate mărimile au același preț ca produsul principal. În acest caz, prețul trebuie definit numai la nivel global al produsului.
Format multi-țară
În formatul multi-țară, etichetaAceasta este cea care stabilește țările în care produsul este comercializat, precum și denumirea, descrierea și prețul său de referință (product_price) pentru fiecare țară. Acest preț trebuie să fie strict pozitiv.
Etichetele
Dacă eticheta
Răspuns pasul 1: trimiterea fluxului
Formatul XML returnat
<root> <url>string</url> <errors>int</errors> </root>
Exemplu:
<root> <url><![CDATA[https://sws.spartoo.com/mp/xml_import_products_async.php?partenaire=XXXX&export=123456]]></url> <errors>1</errors> </root>
Lista codurilor de eroare ale serviciului web
| Cod | Descriere |
|---|---|
| 1 | Nici o eroare de parametru |
| -1 | Parametrul partenaire nu este trecut în parametru sau este gol |
| -2 | Parametrul partenerului nu există |
| -11 | Parametrul xml nu este trecut în parametru sau este gol |
| -15 | Eroare de sintaxă XML, verificați fișierul dvs XML |
| -428 | Contul dvs a fost dezactivat. Nu mai puteți efectua solicitări către serviciile web |
| -429 | Ați efectuat prea multe solicitări către serviciile web peste limita la oră |
Descrierea câmpurilor răspunsului XML
Acest serviciu web returnează URL-ul care trebuie apelat pentru a prelua rezultatul integrării fluxului. În cazul în care s-a produs o eroare, aceasta va fi afișată într-o baliză STATUS. În caz contrar, serviciul web va returna un flux xml care conține rezultatul integrării..
Acest flux xml va avea același format ca și serviciul web xml_import_products Mai jos este lista de statusuri returnate de webservice :
| Status id | Status |
|---|---|
| 1 | Fișier care nu a fost încă tratat |
| 2 | Nu s-a găsit nici o diferență în fișierul transferat |
| 3 | Mai multe rezultate disponibile |
| 4 | Eroare de transfer de fișiere |
Răspunsul etapei 2: monitorizarea procesării
Atâta timp cât procesarea nu este finalizată, serviciul web returnează un status:
<root> <status_id>int</status_id> <status>string</status> <errors>int</errors> </root>
| status_id | status | Semnificație |
|---|---|---|
| 1 | Not Update Yet | Fluxul așteaptă procesare sau este în curs de procesare. Încercați mai târziu. |
| 2 | No change found in file transfered. | Procesare finalizată: nicio modificare detectată în flux. |
| 3 | Result not available anymore | Fluxul a fost procesat, dar fișierul cu rezultate nu mai este disponibil. |
| 4 | Error on file transfert | Fluxul nu a putut fi citit: trimiteți-l din nou. |
| 4 | Skipped cause newer file found | Flux ignorat deoarece a fost trimis un flux mai recent. |
Când procesarea este finalizată, serviciul web returnează direct fișierul de rezultate: are același format ca rezultatul importului clasic (vezi mai jos).
Formatul rezultatului
<root> <products> <product> <reference_partenaire>string</reference_partenaire> <status>string</status> <action>string</action> <errors> <error> <id>int</id> <description>string</description> <level>string</level> </error> <!-- ... Mai multe balize "error" posibile ... --> </errors> </product> <!-- ... Mai multe balize "product" posibile ... --> </products> <errors>int</errors> </root>
| Balise | Descriere |
|---|---|
| reference_partenaire | Identificator produs vânzător |
| status | OK dacă produsul a fost inserat în baza de date KO dacă produsul nu a fost inserat |
| acțiune |
Lista acțiunilor posibile :
|
| errors |
Lista erorilor de prelucrare :
|
Lista codurilor de eroare a produsului
| Cod | Level | Descriere |
|---|---|---|
| 1 | Fatal | Referința partenerului nu este suficient de lungă |
| 2 | Fatal | Referința vânzător nu este validă, aceasta poate conține numai caractere alfanumerice |
| 3 | Warning | Numele produsului nu este specificat |
| 4 | Fatal | Brandul nu este specificat |
| 5 | Fatal | Stilul nu este valid, singurele valori posibile sunt: : H, F, M, K, G, B |
| 6 | Fatal | Prețul trebuie să fie un număr |
| 7 | Fatal | Prețul este negativ sau nu este indicat |
| 8 | Warning | Prețul pare foarte mare ( > 5000 Lei ) |
| 195 | Fatal | Noul preț nu poate conține mai mult de xxx cifre |
| 81 | Fatal | Prețul nu poate fi mai mare de 800 de lei |
| 9 | Fatal | Cantitatea trebuie să fie un număr întreg |
| 10 | Fatal | Cantitatea trebuie să fie pozitivă |
| 11 | Warning | Culoarea xxx nu există :produsul nu va fi disponibil utilizânf filtrele de culoare |
| 13 | Fatal | Categoria xxx nu există |
| 16 | Warning | Nici o listă de mărimi : utilizare mărime unică |
| 17 | Warning | Compoziția este specificată, dar nu este validă |
| 18 | Fatal | Fotografia 1 este obligatorie |
| 19 | Warning | Rata de discount a promoției trebuie să fie cuprinsă între 0 și 100, dacă nu promoția nu va fi luată în considerare |
| 20 | Warning | Mărimea xxx nu există |
| 200 | Warning | Mărimea xxx nu există pentru brandul xxx. |
| 201 | Fatal | Codul EAN este obligatoriu |
| 202 | Fatal | Codul EAN xxx de la referința xxx de mărime xxx este deja utilizat de către ref: xxx. |
| 205 | Fatal | Referința partenerului este prea lungă |
| 23 | Warning | Fotografia xxx este mai mică decât 350x350 : ea va avea o calitate inferioară pe site |
| 24 | Warning | Fotografia xxx este mai mică decât 350x350 : aceasta nu va fi afișată pe site |
| 25 | Fatal | Taille xxx : |
| 26 | Fatal | Nu există stoc: produsul nu va fi conceput |
| 27 | Fatal | Nu se poate accesa la fotografia 1( url xxx ) |
| 28 | Warning | Nu se poate accesa la fotografia xxx ( url xxx ) |
| 30 | Fatal | Cantitatea mărimii xxx este prea mare (Cantitate max : xxx) |
| 33 | Fatal | Un produs de genul xxx nu poate aparține categoriei xxx |
| 34 | Fatal | Cuvântul xxx este în blacklist și nu trebuie să apară în denumirea sau descrierea produsului. |
| 35 | Fatal | Numele produsului este prea lung, trebuie să conțină doar numele modelului. Eroare (erori) la țara (țări): xxx |
| 341 | Fatal | Termenul xxx este în blacklist și nu trebuie să apară în descrierea produsului |
| 36 | Fatal | Imposibil de a importa produsul: produsul are deja o duplicare mărime / culoare. |
| 37 | Fatal | Acest produs nu conține nicio informație lingvistică pentru un site activ. |
| 32 | Fatal | Nici o informație de localizare pentru acest produs pentru această țară. |
| 38 | Fatal | Mărimea xxx poate fi setată o singură dată pentru referința xxx |
| 39 | Warning | Referința partenerului este prezentă de mai multe ori în flux, duplicatele au fost ignorate |
| 451 | Fatal | Fara preț pentru marime xxx din tara xxx. (necesar pentru o reducere) |
| 452 | Warning | Data de încheiere a reducerii a fost depășită pentru mărimi xxx din țară xxx. |
| 453 | Fatal | "rată" (xxx) invalid pentru mărime xxx din țară xxx. |
| 454 | Fatal | "rată" (xxx) > 85% pentru mărime xxx din țară xxx. |
| 455 | Warning | Mărimea xxxare un preț într-o o țară (xxx)nu este definit pentru produs . |
| 456 | Warning | Mărimea xxx are un preț pe xxx identic cu prețul total din această țară . |
| 194 | Fatal | Căderea noului preț nu poate fi mai mare decât xxx% |
Exemple de returnări XML
Exemplu de răspuns la un apel de serviciu web KO :
<root> <products></products> <errors>-1</errors> </root>
Exemplu de răspuns la un apel de serviciu web OK :
<root> <products> <product> <reference_partenaire>EEAJBCC</reference_partenaire> <status>KO</status> <action>not created</action> <errors> <error> <id>14</id> <description></description> <level>warning</level> </error> <error> <id>4</id> <description>Brandul nu este specificat</description> <level>fatal</level> </error> </errors> </product> <product> <reference_partenaire>KJHGFDS</reference_partenaire> <status>OK</status> <action>created</action> </product> </products> <errors>1</errors> </root>
Fișiere XSD
Fișier XSD Multinațional
Saitoo Marketplace