Contents

Grundläggande information

Vi har i dagsläget ca 35 olika företag som ligger och hämtar produktinformation och bilder från oss antingen via vår standard-Web Service eller skräddarsydda varianter. Oavsett om standardtjänsten räcker till eller ej, förslår vi att ni testar standardtjänsten först, för att få en inblick i hur det fungerar.

Grundprincipen för tjänsten är väldigt enkel. GTIN (EAN) är den unika nyckel som används för att slå upp produktinformation. Så ni skickar anrop till vår tjänst med en lista på de GTIN ni vill slå upp, och vi returnerar produktinformationen för produkterna som matchar.


Tillgång till tjänsten

Innan ni kan få ett eget konto med tillgång till tjänsten, behöver vi få reda på vilka ni är och vad ni har tänkt använda tjänsten till. Därefter måste ni skriva på ett avtal som reglerar hur tjänsten får användas m.m. När den biten är avklarad, kommer ni att få användaruppgifter som ni kan använda med tjänsten. Vill ni ha en specialanpassad variant, behöver vi även veta vilka funktioner ni behöver. De specialanpassade tjänsterna levereras normalt sett inom 3 arbetsdagar efter att vi fått all information vi behöver. Användaruppgifterna till standardtjänsten levereras oftast samma dag som vi får kontraktet.

Innan dess kan ni dock testa tjänsten fullt ut med ett testkonto vars uppgifter ni finner under rubriken "Test" nedan. Detta konto har tillgång till ett 80-tal produkter (mot normala ~30 000).


Tillgänglig information

Standard-tjänsten har två funktioner för att hämta ut produktinformation - dels en lite enklare funktion med en standard-uppsättning med produktinformation som passar de flesta. Dels en något mer avancerad funktion som låter er själva välja vilken information ni vill ha returnerad.

Standard-funktionen returnerar ett produktobjekt innehållande:

   GTIN
   Lev. Art. nr
   Bildlänk
   Leverantör
   Varumärke
   Produktens namn
   Vikt/Volym
   Innehållsförteckning
   Näringsvärden
   Produktmärkningar
   Allergiinformation


Den information ni kan välja fritt mellan i den avancerade funktionen, är:

   Bilder (Skickas i form av länkar med krypterade parametrar så ni kan publicera dem direkt i en image-taggar, eller ladda ner dem till en lokal cache. Ni kan begära att få ut länkar till flera olika storlekar/format i varje produktobjekt)
   Produktens namn
   Leverantör
   Varumärke
   Innehållsförteckning
   Näringsvärde
   Vikt/Volym
   Officiella Produktmärkningar (för närvarande ca 35 olika, exempelvis Svanen, Särnär glutenfri, Nyckelhålet, Krav o.s.v.)
   Ett 20-tal olika ID-nummer (Exempelvis GTIN, DUN, Lev. Art. Nr, ICA-nummer, COOP-nummer, Servera-nummer, o.s.v.)
   Bredd
   Höjd
   Djup
   Allergiinformation
   Hållbarhet
   Återvinning
   Förvaring
   Beskrivning
   Säljtext
   Meny-kategorikopplingar (för leverantörer)
   Anpassade fält (för leverantörer)


Tänk dock på att inte dra ut mer information än ni har behov av - framför allt inte om ni ska anropa tjänsten i realtid - för att anropen ska gå så snabbt och smidigt som möjligt.


SOAP / JSON / SSL

Vår Web Service hanterar såväl JSON post, som SOAP-anrop. Så som tjänsten anropas, kommer ni få svar. Om ni exempelvis anropar med JSON, får ni JSON tillbaka.

Ni kan även anropa via SSL om ni vill (byt ut http:// mot https:// i URL:en).

Funktioner

   StringResult Get24hSecurityKey(string username, string password)
   ProductResult GetProductData(string[] gtinVec, ImageThumbFormat thumbFormat, ImageThumbSize thumbSize, string langTargetmarketLimit, string secKey)
   StringResult GetCustomProductDataFieldNames(string secKey)
   ArbitraryProductResult GetCustomProductData(string[] gtinVec, string[] requestedDataFields, string langTargetmarketLimit, string secKey)
   StringResult GetAllAvailableGTINs(string langTargetmarketLimit, string secKey)
   ChangedProductGTINResult GetChangedProductsGTINs(DateTime changedAfter, string secKey)


Returtyper

Tjänsten returnerar alltid ett objekt som innehåller tre variabler:

   XXXResult {
       bool Success;
       string ErrorMessage;
       XXX Data;
   }

Success berättar om anropet lyckades. Om Success==false, innehåller ErrorMessage ett felmeddelande som beskriver vad som gick fel. Data är en starkt typad variabel som innehåller den efterfrågade datan.

För mer detaljerad information om de olika returtyperna, se rubriken Returtyper längst ner


Autenticering

Get24hSecurityKey kontrollerar era användaruppgifter och returnerar en säkerhetsnyckel som är giltig i 24 timmar. Denna säkerhetsnyckel ska sedan skickas med i samtliga anrop till de andra funktionerna.

Varje gång funktionen anropas genereras en ny nyckel, som är giltig 24 timmar framöver. Så om ni hämtar ut en första nyckel 14:00 och en andra 19:00, kommer första vara giltig till 14:00 och andra nyckeln 19:00 dagen efter.

Vi rekommenderar att denna funktionen anropas via https. Resten kan ske genom http.

För att förhindra brute force-attacker och hålla loggarna något så när läsbara finns en begränsning på 50 nycklar per användare och dygn. Så nyckeln behöver lagras mellan anropen och återanvändas.

Nyckeln är egentligen giltig 24 timmar och 10 minuter. Så normalt sett behövs inga säkerhetsmarginaler på er sida, utan det fungerar i regel fint att hämta ut en gång var 24:e timme utan att behöva vara orolig för att tappa access i skarven.


Tillgängliga GTIN

GetAllAvailableGTINs returnerar en string-vektor med alla GTIN som ni har tillgång till i vår tjänst.


Ändrade/raderade produkter

GetChangedProductsGTINs returnerar en lista med GTIN på de produkter som ändrats eller raderats sedan datumet/tiden ni skickar med som inparameter, och vilken typ av ändring som utförts (Ny/Ändrad eller Raderad).

Om ni mellanlagrar informationen ni får av oss, måste denna funktionen anropas. Den ska i så fall anropas en gång var 10:e minut, för att hämta de senaste 10 minuternas ändringar. Den ska även anropas en gång / dygn och hämta ut senaste dygnets ändringar, så inga ändringar missas p.g.a. korta driftstopp eller liknande.

Så fort en produkt markeras som uppdaterad (TypeOfChange.Updated), måste ni hämta ut dess produktinformation och bilder på nytt.

Om den markeras som raderad (TypeOfChange.Deleted), måste ni ta bort produktinformation och bilder ni fått av oss för den raderade produkten.

För oss och våra varuproducenter är det av yttersta vikt att all information är korrekt och uppdaterad. Skulle ni välja att mellanlagra information och vi märker att datasynkroniseringen inte sköts som den ska, kommer ni först att få en varning. Om problemen fortsätter kommer vi att säga upp avtalet, och ni måste radera all information och alla bilder ni fått via vår tjänst.


GTIN

I anropen till GetProductData och GetCustomProductData skickar man in en string-vektor innehållande GTIN-nummer på de produkter man vill ha information om.

Endast GTIN innehållande 8 eller 13 tecken är giltiga. För varje inskickat GTIN returneras sedan ett objekt innehållande informationen om den matchande produkten. Hittas inte produkten får man ändå tillbaka ett objekt, så man kan vara säker på att GTIN:et i position 5 i vektorn, också ligger på position 5 i svars-vektorn. Alla returnerade objekt har en MatchFound-variabel som man kan kontrollera för att se huruvida den lyckades hitta det efterfrågade GTIN:et i vår databas eller ej.

Max antal GTIN man kan slå upp i varje anrop är 500, men om informationen ska skickas ut i realtid med minimala svarstider, bör man inte begära ut information om mer än 50-100 produkter per sidladdning.


Två olika funktioner för att dra ut produktinformation

För att så många som möjligt ska kunna använda standardtjänsten, finns där två olika funktioner för att dra ut produktinformation.


GetProductData

En enkel funktion där man bara skickar in sin lista på GTIN och vilken typ av bild man vill ha, så returneras produkt-objekt innehållande en standard-uppsättning med information som fungerar för de flesta:

   GTIN
   BildURL
   Leverantör
   Varumärke
   Produktnamn
   Vikt/Volym
   Lev. art. nr.
   Innehållsförteckning
   Näringsvärde
   Produktmärkningar
   Allergiinformation

Produktinformationen returneras i samma ordning som GTIN:en skickades in.


GetCustomProductData

Vill ni ha flera bildlänkar i varje anrop? Kanske vill ni ha färre informationfält för att få upp hastigheten på anropen, eller fler fält än standard-produkten har? Kanske vill få ut alla bilder kopplade till produkten, istället för bara primära?

Då är det GetCustomProductData ni ska anropa. Förutom listan med GTIN-nummer, skickar man här även in en lista på de informationfält man vill få ut. För att få reda på "namnen" på de fält som finns tillgängliga, anropar man GetCustomProductDataFieldNames.


Observera att om ni ska hämta hem information om 20 objekt, ska funktionen anropas EN gång med 20 GTIN, och inte 20 gånger med ett GTIN i taget. Det tar ca 17-18 gånger längre tid att anropa 20 gånger med ett GTIN i varje anrop, än ett anrop med 20 GTIN.

Bilder

Bilderna kan laddas ner i tre olika format:

   Jpeg
   Png, 24 bit (frilagda, transparenta)
   Tiff (inte rekommenderat för publicering på webben)

Dessutom finns ett antal olika storlekar att välja mellan:

   50 pixlar
   75 pixlar
   100 pixlar
   150 pixlar
   200 pixlar
   250 pixlar
   300 pixlar
   400 pixlar
   500 pixlar
   750 pixlar
   1000 pixlar *
   1500 pixlar *
   * Som standard är dessa två storlekar inte tillgängliga för vanliga Web Service-användare. Har ni behov av dessa storlekar är det dock bara att kontakta oss, så kan vi aktivera access till dem

Vid behov kan vi i en specialanpassning även aktivera exempelvis frilagd EPS i originalstorlek, frilagd originalbild m.m.


GetCustomProductData

I GetCustomProductData skickar man in en sträng som beskriver vilken typ av bild man vill ha, från ett antal fördefinierade möjligheter. Det går enligt formeln "Image_Format_Storlek". Format anges som Jpg, Png eller Tif. Storleken anges som px100, px200, px500. Så Image_Png_px400 hämtar alltså ut en länk till den primära produktbilden i Png-format och 400 pixlar i största ledden, och Image_Jpg_px100 ger en länk till en Jpeg-bild på 100 pixlar i största ledden.

Vill man ha flera olika storlekar eller format i varje anrop, går det bra. Det är bara att skicka in exempelvis både "Image_Png_px75" och "Image_Png_px300" till GetCustomProductData så får ni länkar till båda bildstorlekarna. Ni kan begära ut hur många olika format och storlekar ni vill i ett anrop.


Image & AllImages

I GetCustomProductData finns två olika sätt att hämta ut bilder. Image hämtar ut en bildlänk till den primära produktbilden.

Men produkter kan ha flera bilder kopplade till sig. Därför finns även AllImages

Så om man exempelvis skickar in AllImages_Jpg_px200, hämtar den ut samtliga bilder tillhörande produkten, med bildlänk och lite extra information om bilden (som bildens syfte, exempelvis ProductImage eller AssortmentImage), och ev. information om vinkel bilden är tagen ifrån, vilken primär sida som syns, om produkten är i eller utanför sin förpackning m.m.

ImagePurpose berättar vad det är för typ/syfte med bilden. Kan exempelvis vara ProductImage (Produktbild), SpaceImage_front (Spacebild, tagen rakt framifrån), EnvironmentImage (Miljöbild, oftast produkten snyggt upplagd). Nya bildtyper sen 2017-06-19 är dessutom Hero och Mobile. Den innehåller all data som tillsammans med GTIN behövs för att skapa ett GS1 file name enligt 2013 års standard:

ImageType A - StillShotSingleGTIN B - StillShotSingleGTINWithElements C - StillShotSingleGTINHiRes D - StillShotSingleGTINWithElementsHiRes Z - Undetermined

Facing 0 - NotApplicable 1 - Front 2 - Left 3 - Top 7 - Back 8 - Right 9 - Bottom

Angle C - Center L - Left R - Right N - NoPlunge

InOutPackage 0 - OutOfpackaging 1 - InPackaging A - Case B - Innerpack C - RawOrUncooked D - Prepared E - Plated F - Styled G - Staged H - Held J - Worn K - Used L - Family M - OpenCase

Mer information finns i klass- och datastrukturs-listningarna sist i dokumentet.

Menyträd

Leverantörer kan skapa menyträd/kategoriträd i OPV Online, och koppla produkter dit. Tjänsten har därför även ett antal funktioner som låter leverantörer hämta ut sina egna träd och dess kopplade produkter. Innan det är möjligt att hämta ut sitt/sina träd, måste ni kontakta oss (webmaster@opv.se) för att få det/de MenyId som ska skickas in till funktionerna.

Varje produkt kan kopplas till ett oändligt antal kategorier. Varje kategori kan ha ett oändligt antal underkategorier i en obegränsat djup struktur.

   MenuItemResult GetMenuTree(string language, string secKey)
   MenuItemResult GetMenuSubItems(long parentMenuItemId, string language, string secKey)
   ArbitraryProductResult GetMenuCustomProductData(long menuItemId, string[] requestedDataFields, string langTargetmarketLimit, string secKey)


GetMenuTree låter användaren hämta ut hela trädet på en gång.

GetMenuSubItems låter användaren hämta ut en nivå åt gången genom att begära ut alla underkategorier till en viss kategori.

GetMenuCustomProductData fungerar precis som GetCustomProductData, fast med den skillnaden att man begär ut alla produkter under en viss kategori istället för att söka via en lista med GTIN.


EU 1169/2011

I slutet av 2014 träder EU-reglering 1169/2011 i kraft. Det innebär bl.a. att alla som säljer matvaror, vare sig i butik eller online, måste ge kunden möjlighet att se viss grundläggande information. I butik löser sig detta automatiskt genom att de kan läsa på förpackningen. Men för E-handel innebär det att det tillkommer krav på att man måste kunna visa följande information om varje produkt:

1 a) Livsmedlets beteckning

1 b) Ingrediensförteckningen

1 c ) Ingredienser eller processhjälpmedel förtecknade i bilaga II eller som härrör från ett ämne eller en produkt som förtecknas i bilaga II som orsakar allergi eller intolerans och som används vid tillverkningen eller beredningen av ett livsmedel och finns kvar i den färdiga varan, om än i annan form.

1 d) Mängden av vissa ingredienser eller kategorier ingredienser.

1 e) Livsmedlets nettokvantitet

1 f) Datum för minsta hållbarhet eller sista förbrukningsdag (Gäller inte produktdata distribuerad till Distanshandel)

1 g) Särskilda villkor för förvaring och/eller användning

1 h) Namn på eller firmanamn för och adress till det livsmedelsföretag som avses i artikel 8.1

1 i) Uppgift om ursprungsland eller härkomstplats där så krävs enligt artikel 26

1 j) Bruksanvisning, om det utan en sådan skulle vara svårt att använda livsmedlet på rätt sätt

1 k) drycker som innehåller mer än 1,2 volymprocent alkohol, den faktiska alkoholhalten uttryckt i volym


All denna information kan ni få via vår Web Service genom att anropa GetCustomProductData och begära ut:

SupplierName (Leverantörens namn)

TrademarkName (Varumärke)

ProductName (Produktnamn)

WeightVolume (Nettovikt/volym)

Content (Ingrediensförteckning)

Nutrition (Näringsvärden)

CompanyAddress (Leverantörens kontaktuppgifter)

Storage (Förvarings-instruktioner)

Manual (Instruktioner för användande)

Origin (Ursprung)

PercentageOfAlcoholByVolume (Volymprocent alkohol)


[allergen]

En annan nyhet i och med EU 1169/2011 är att allergener ska märkas ut i fet stil i alla ingrediensförteckningar. Därför kommer allergener att märkas ut med en [allergen][/allergen]-tagg. Dessa kör man lämpligtvis en replace på till ett lämpligt stylat HTML-element för att få fet stil i texten.

Exempel:

Vatten, [allergen]mjöl[/allergen], jäst, [allergen]mjölkpulver[/allergen], salt

ska skrivas ut som

Vatten, mjöl, jäst, mjölkpulver, salt

Test

Det är kanske lite svårt att sätta sig in i exakt hur det fungerar m.h.a. denna beskrivningen. Dessutom brukar där ofta vara frågetecken kring prestanda, tillförlitlighet o.s.v. Så för att underlätta för er och ge er möjlighet att tjänsten i förväg, har vi skapat ett test-konto som ni kan använda fritt med standardtjänsten. Denna ger er tillgång till ett 80-tal olika slumpvis utvalda produkter, från ett antal olika tillverkare och kategorier.

Web Servicen hittar ni här:

http://api.opv.se/WS/General/v176/ProductService.asmx

Den kan anropas med såväl SOAP som JSON


Användaruppgifterna som ni ska använda till Get24hSecurityKey-funktionen, är:

Användarnamn: WebService_TrialAccount

Lösenord: NtcNOMZ8z0?_f2


Det är den skarpa tjänsten ni testar, men med ett begränsat användarkonto. När ni får de riktiga användaruppgifterna räcker det endast med att byta ut användarnamn och lösenord, så ska allt fungera precis som tidigare - men med tillgång till betydligt fler produkter.

Här kan ni ladda ner ett program för att testa så Web Servicen fungerar som den ska: http://api.opv.se/WS/General/v174/WebServiceTester.zip* Filen innehåller såväl källkod (skriven i C#), som det kompilerade programmet (i bin\release-mappen).
*) Obs gammal version. Uppdatering kommer snart!


För att få ut en lista på de GTIN som ni har tillgång till i testversionen, kör igång programmet och klicka på "Get all GTINs"-knappen.

Om ni anropar tjänsten varje gång ni får en begäran, så kom ihåg att det är otroligt viktigt att ni anropar tjänsten en gång / sidvisning. Om ni ska visa en lista med 30 produkter, ska ni göra ett anrop till GetProductListData med 30 GTIN-nummer. Inte 30 anrop med ett GTIN i varje. Om ett anrop med ett GTIN exempelvis tar 70 ms, och ett med 50 GTIN tar 150 ms, så är det ju inte så svårt att räkna ut att det får ganska stora konsekvenser om man anropar med ett GTIN åt gången med 30 produkter (ca 2,1 sekund istället för 0,15s).

Anrop

SOAP

Web Servicen beskriver själv hur man anropar med SOAP. Gå till Web Servicen i en vanlig webbläsare, och klicka på de olika metoderna så får ni upp en listning av hur anropen ska se ut och vad ni kommer få tillbaka. Där har ni även en länk som ger er tjänstens WSDL-specifikation.

JSON

Ni anropar tjänstens olika funktioner genom: http://api.opv.se/WS/General/v176/ProductService.asmx/{funktionsnamn}

Exempelvis:

http://api.opv.se/WS/General/v176/ProductService.asmx/Get24hSecurityKey

I anropet ska dataType sättas till "json" och contentType till "application/json; charset=utf-8".

Funktionsanropets parametrar skickas med som ett JSON-objekt, exempelvis {"username": "blabla", "password": "mySecret"}

Tänk på att responsen av säkerhetsskäl alltid är inkapslad i ett yttre "d"-objekt.


JSON kodexempel:

   $.ajax(
   {
           type: "POST",
           dataType: "json",
           contentType: 'application/json; charset=utf-8',
           url: "http://api.opv.se/WS/General/v176/ProductService.asmx/GetCustomProductData",
           data: "{ 'gtinVec': [ '5701211106172', '6411200106685' ], 'requestedDataFields': [ 'SupplierName', 'TrademarkName', 'ProductName', 'WeightVolume', 'Image_Jpg_px200', 'CustomFields' ], 'langTargetmarketLimit': 'sv-SE', 'secKey': '"+ secKey +"' }",
           success: function (r) {
           if (r == null || r.d == null) {
               alert('Unknown error');
           }
           else if (!r.d.Success) {
               alert(r.d.ErrorMessage);
           }
           else {
               var data = r.d;
        // Start processing the data
           }
       }
   });

OBS: I detta exemplet används Javascript (och jQuery) för att illustrera ett anrop till tjänsten. Men p.g.a. cross site scripting-begränsningar, är ett direkt anrop via Javascript ingen bra idé.

Om ni vill anropa tjänsten med Javascript, behöver ni göra en "proxy" i er backend som vidarebefodrar anropen till vår Web Service och returnerar svaret till er frontend.

Anropsdata

Möjliga fält begära ut via GetCustomProductData

Fält Datatyp Information
AllergyInfo AllergyInfo[] Returnerar information om allergener i produkten.

Contains 0: Nej, 1: Spår, 2: Ja.

Tänk på att allergener i och med EU 1169/2011 också kommer vara utmärkta i innehållsförteckningen. Det är där kunden i första hand bör leta. Dessa tabellerna är mer till för att göra det sökbart.

AssortmentName String Det sortiment som produkten tillhör, enligt OPV:s egna klassificering (enklaste sättet att se tillgängliga alternativ, är att logga in på mediabanken.se med demokontot, och titta i menyn till vänster)
AxfoodNr String Axfoods artikelnummer på produkten
BergendahlNr String Bergendahls artikelnummer på produkten
Brand BrandInfo Ett BrandInfo-objekt innehållande namn och id på produktens varumärke
ChangedDate DateTime Datumet då produktens information senast blev modifierad
CompanyAddress CompanyAddress Leverantörens adressuppgifter (Namn, gatuadress, postnummer och stad).
Content String Produktens ingrediensförteckning

Kommer inom kort börja innehålla [allergen][/allergen]-taggar runt allergener. Dessa ska fetmarkeras så de är lätta att hitta.

I framtiden är det möjligt att [allergen]-taggen kommer att innehålla attribut som exempelvis berättar vilken typ av allergen det handlar om (exempelvis genom [allergen allergenId="5" allergenName="Mjölk"]), så det är rekommenderat att koden för att ersätta allergen-taggen med något som ger fet stil, körs med ett reguljärt uttryck. Kanske något i stil med RegEx.Replace(content, "\[allergen.*?\]", " ")

Cooking String Tillagnings-instruktioner
COOPNr String COOPs artikelnummer på produkten
CustomFields CustomFields[] Returnerar en array av leverantörens anpassade fält som namn - värde par. (Endast leverantörer kan hämta hem dessa, i alla andra fall är detta fältet tomt eller null.) En produkt kan ha ett eller flera anpassade fält associerat med den. Det är ej garanterat att ett specifikt fält finns associerat med en viss produkt, utan detta måste klienten alltid kontrollera.
Depth Double Produktens djup i mm

Finns en helt regelverk bara för att bestämma vad som är en produkts framsida, vilket i sin tur bestämmer vad som är höjd, bredd och djup. Men generellt sett kan man säga att framsidan är den där största loggan och produktnamnet finns

Description String Beskrivning av produkten
Durability String Information om produktens hållbarhet
GTIN String Produktens GTIN-nummer. Kan vara på 8, 13 eller 14 tecken
Height Double Produktens höjd i mm

Finns en helt regelverk bara för att bestämma vad som är en produkts framsida, vilket i sin tur bestämmer vad som är höjd, bredd och djup. Men generellt sett kan man säga att framsidan är den där största loggan och produktnamnet finns

ICANr String ICAs artikelnummer på produkten
LaunchDate DateTime Datum då produkten lanserades
Manual String Instruktioner för hur produkten ska användas
Markings MarkInfo[] Officiella produktmärkningar, som Svanen, Nyckelhålet, Fairtrade m.m.

1 Bra Miljöval/Falken 2 Svanen 3 KRAV-märkt 4 Nyckelhålet 5 Särnär naturligt glutenfri 6 Särnär fri från Gluten 7 Särnär fri från Laktos 8 Särnär Laktosreducerad 9 Särnär fri från Soja 10 Särnär Ärtproteinfri 11 Särnär fri från Mjölkprotein 12 Särnär fri från Ägg 13 Sockerfri 14 Särnär 15 Osötat 16 Svenskt sigill 17 Organic 18 EU-blomman 19 Särnär fri från Jordnötter 21 Särnär fri från Fisk 22 Särnär fri från Nöt/Mandel 23 Fairtrade 24 GMO märkt 25 Godk. av Astma & Allergif. 26 Särnär fri från Mjölk 27 Särnär proteinreducerad 28 Särnär laktasenzym 29 Särnär proteinfri 30 Särnär fenylalaninfattig 31 EU-logotype för ekologiska produkter 32 MSC-märkt fisk 33 Steril 34 Höggradigt ren 36 Svensk fågel 37 Smakstyrka 1 38 Smakstyrka 2 39 Smakstyrka 3 40 Smakstyrka 4 41 Smakstyrka 5 42 Smakstyrka 6 43 Smakstyrka 7 44 Smakstyrka 8 45 Smakstyrka 9 46 Smakstyrka 10 47 Smakstyrka 11 48 UTZ-Certified 49 Rainforest Alliance 50 Animal Welfare Approved 51 FSC 52 Svenskt kött 53 Utan tillsatt socker 54 Lågt sockerinnehåll 55 Äkta vara

MenuConnections MenuItem[] För leverantörer som hämtar ut menyträd från oss. Returnerar en lista på alla de menykategorier som produkten är ansluten till.
Nutrition String Produktens näringsvärdes-deklaration
NutritionSeparated Array med NutrientQuantitySeparated Produktens näringsvärdes-deklaration, separerad så varje rad returneras med namn, mängd och enhet
Först delas varje rad upp i en "Nutrient" och en "Quantity" (d.v.s. "Protein 12,7g" delas upp till Nutrient: "Protein", Quantity: "12,7g"). Dessa värdena är lämpliga att använda om ni bara ska skriva ut informationen i en tabell.
Men Quantity separeras även till en mängd och en enhet, som läggs under "QuantitySeparated". Så i detta exemplet returneras:
{ Nutrient: "Protein", Quantity: "12,7g", QuantitySeparated: { Amount: 12.7, Unit: "g" } }
QuantitySeparated är lämplig att använda om ni ska utföra olika former av beräkningar på näringsvärdena.
Origin String Information om produktens ursprung
PercentageOfAlcoholByVolume String Produktens alkoholhalt i volymprocent
ProductId Long OPVs Id på produkten
ProductName String Produktens namn
Recycling String Instruktioner för återvinning
Saletext String Leverantörens säljtext
Storage String Förvarings-instruktioner
SuppArtNr String Leverantörens artikelnummer
SupplierName String Leverantörens namn (kan också hämtas via CompanyAddress)
BrandName TrademarkName String Produktens varumärke
WeightVolume String Produktens vikt / volym
Width Double Produktens bredd i mm

Finns en helt regelverk bara för att bestämma vad som är en produkts framsida, vilket i sin tur bestämmer vad som är höjd, bredd och djup. Men generellt sett kan man säga att framsidan är den där största loggan och produktnamnet finns

Image_[Format]_[Size] String En länk till den primära bilden, i det begärda formatet och storleken

För mer information, se sektionen med rubriken "Bilder"

AllImages_[Format]_[Size] OPVImage[] Returnerar alla tillgängliga bilder kopplade till produkten.

För mer information, se sektionen med rubriken "Bilder"

Returtyper

Result-klasser

   class OperationResult
   {
       bool Success
       string ErrorMessage
   }
   public class ProductResult : OperationResult
   {
       Product[] Data
   }
   public class ArbitraryProductResult : OperationResult
   {
       ArbitraryProduct[] Data
   }
   public class ChangedProductGTINResult : OperationResult
   {
       ChangedProductGTIN[] Data
   }
   public class StringResult : OperationResult
   {
       string Data
   }
   public class StringVecResult : OperationResult
   {
       public string[] Data;
   }
   public class MenuItemResult : OperationResult
   {
       MenuItem[] Data
   }


Klasser i result-klasserna

   public class Product
   {
       bool MatchFound      // Huruvida en match för GTIN hittades eller ej
       string GTIN
       string ImageURL
       string Supplier
       string Trademark
       string Name
       string WeightVolume
       string SuppArtNo
       string Content
       string Nutrition
       MarkInfo[] Markings
       AllergyInfo[] Allergies
       Company Company
   }
   class ArbitraryProduct
   {
       bool MatchFound      // Huruvida en match för GTIN hittades eller ej
       string GTIN
       NameValue[] Data
       class NameValue
       {
           string Name      // Det efterfrågade kolumn-namnet
           object Value     // Värdet. Kan vara av varierande typ. Se nedan
       }
   }
   class ChangedProductGTIN
   {
       public string GTIN;
       public ChangeType TypeOfChange;
   }
   enum ChangeType
   {
       Updated,    // Produktens information och bilder ska laddas ner på nytt
       Deleted     // Den information och de bilder som levererats av oss ska raderas även hos er
   }

ArbitraryProduct.Data.Value kan vara olika datatyper beroende av vad som efterfrågats. Om det inte är listat nedan, är det en string som returneras:

   productid            long
   allergyinfo          AllergyInfo[]
   markings             MarkInfo[]
   width                double
   height               double
   depth                double
   launchdate           nullable DateTime
   changeddate          DateTime
   company              Company      //CompanyAddress är inte längre direkt tillgänglig som den var i version 1.7.0 utan finns numer i Company 
   AllImages            OPVImage[]
   NutritionSeparated   NutrientQuantitySeparated[]
   CustomFields			CustomField[]
   class AllergyInfo
   {
       int SubstanceId
       string SubstanceName           // Substansens namn, exempelvis "Gluten" eller "Lupin"
       ContainsAllergenic Contains    // En enum som visar huruvida den innehåller det eller ej (No = 0, Possible = 1, Yes = 2). Possible är vad vi brukar kalla för "Spår"
       string Remark                  // Kommentar från leverantören för ytterligare information
   }
   class MarkInfo
   {
       int MarkId                     // OPVs id på märkningen
       string MarkName                // Märkningens namn
   }
   class CompanyAddress
   {
       string Name
       string Address
       string Zip
       string City
   }
   class Company
   {
       string GLN
       CompanyAddress CompanyAddress  
   }
   class NutrientQuantitySeparated
   {
       string Nutrient
       string Quantity
       string Comment
       AmountAndUnit SeparatedQuantity
   }

   class AmountAndUnit
   {
       double Amount
       string Unit
   }

    
   class BrandInfo
   {
        long BrandId
        string BrandName
   }

   class CustomField
   {
	   string Name;
	   string Value;
   }


Klasser som retuneras när man begär ut AllImages från GetCustomProductData.

Bokstäverna inom parentes i listningarna för GDSN-klasserna är de som värdet ska översättas till om man vill generera ett GS1 file name enligt 2013 års standard

   class OPVImage
   {
       public string OPVNo = "";            // OPVs interna bild-ID. Antagligen inget ni behöver bry er om
       public DBImageType ImagePurpose;     // Typ av bild. Exempelvis Produktbild, miljöbild (där produkten fotograferas i en snygg miljö), sortimentsbild (bild på ett antal produkter ur samma serie) m.m.)
       public string ImageURL = "";         // Bildens URL
       public GDSNImageType? ImageType = null;   // Mediatyp
       public GDSNImageFacing? Facing = null;    // Vilken sida som primärt visas
       public GDSNImageAngle? Angle = null;      // Om den är fotograferad från höger, vänster eller rakt framifrån
       public GDSNInOutPackage? InOutPackage = null;   // Om produkten är fotograferad i eller utanför sin förpackning
   }
   enum short DBImageType {
       ProductImage
       SpaceImage_front
       SpaceImage_top
       AssortmentImage
       EnvironmentImage
       SpaceImage_DF
       Video
       Audio
       Document
       SpaceImage_Side
       Hero
       Mobile
   }
   enum GDSNImageType {
       StillShotSingleGTIN (A)
       StillShotSingleGTINWithElements (B)
       StillShotSingleGTINHiRes (C)
       StillShotSingleGTINWithElementsHiRes (D)
       Undetermined (Z)
   }
   enum GDSNImageFacing {
       NotApplicable (0)
       Front (1)
       Left (2)
       Top (3)
       Back (7)
       Right (8)
       Bottom (9)
   }
   enum GDSNImageAngle {
       Center (C)
       Left (L)
       Right (R)
       NoPlunge (N)
   }
   enum GDSNInOutPackge {
       OutOfpackaging (0)
       InPackaging (1)
       Case_ (A)
       Innerpack (B)
       RawOrUncooked (C)
       Prepared (D)
       Plated (E)
       Styled (F)
       Staged (G)
       Held (H)
       Worn (J)
       Used (K)
       Family (L)
       OpenCase (M)
   }

MenuItemResults Data-variabel är av typen MenuItem[]. Varje MenuItem har tre variabler. Ett MenuItemId som är ett unikt ID på varje kategori i trädet (används när man ska anropa GetMenuCustomProductData), en Name-variabel som innehåller kategorins namn, och en Children-variabel av typen MenuItem[] som innehåller alla dess underkategorier. Varje MenuItem i Children har i sin tur Children-variabler som låter er traversera ner i strukturen.

   class MenuItem {
       long MenuItemId
       string Name
       long ParentId
       MenuItem[] Children
   }

Observera att Children alltid är null när man anropar GetMenuSubItems, då den funktionen endast hämtar en nivå i taget.

Historik (sen v174)

Det lever många parallella versioner av webservicen sida vid sida. När en ny feature läggs till, ökas versionsnumret ett steg och blir tillgängligt vid sidan av de andra, allt för att störa befintliga lösningar minimalt. Det är frivilligt att uppgradera version men det rekommenderas.

Version Beskrivning
v175 Nytt stöd för Mobile/Hero -bilder i webservicen samt i Online.
v176 Stöd för att hämta anpassade fält (för leverantörer) tillagt.