Primat

Matpris-API för Sverige

Ett REST-API över dagliga matpriser i svenska dagligvarubutiker. Primat samlar varje dag in de priser kedjorna själva publicerar per butik: ICA, Coop, Willys, Hemköp, Lidl och City Gross. Ordinarie priser, kampanjer och medlemspriser, EAN-kopplade, med daglig historik sedan december 2025.

1 258 butiker
190 134 produkter
139 236 225 prisändringar
6 kedjor

Prova direkt Kom igång Autentisering Endpoints Svarsformat Nivåer & gränser Felkoder Täckning

Prova direkt, utan konto

Kör en riktig sökning mot livedata. Ingen registrering, ingen nyckel:

curl "https://primat.nu/api/v1/demo/products?q=banan"

Demot ger upp till 3 träffar med aktuella priser inkl. kampanj- och medlemspriser och är begränsat till 30 anrop per dygn. En gratisnyckel ger alla träffar och 60 anrop/min; prishistorik ingår i betalnivåerna.

Skapa gratis API-nyckel

Kom igång

  1. Testa demot ovan så du ser dataformatet.
  2. Logga in på /data och skapa en API-nyckel (gratisnivån räcker för att komma igång).
  3. Skicka nyckeln som Authorization: Bearer eller X-API-Key:
curl -H "Authorization: Bearer DIN_API_NYCKEL" \
  "https://primat.nu/api/v1/products?q=banan"

Bas-URL: https://primat.nu/api/v1. Alla svar är JSON. API:t är avsett för läsning (GET).

Autentisering

Alla endpoints utom demot och /api/v1-katalogen kräver en API-nyckel. Skicka den på ett av två sätt:

Authorization: Bearer DIN_API_NYCKEL
X-API-Key: DIN_API_NYCKEL

Nycklar skapas och roteras på /data. En felaktig eller saknad nyckel ger 401.

Endpoints

EndpointBeskrivning
GET /api/v1 Katalog över API:t (ingen nyckel krävs).
GET /api/v1/demo/products?q=banan Sök utan nyckel. Upp till 3 aktuella träffar, hastighetsbegränsat per dygn.
GET /api/v1/me Kontot och nivån som hör till nyckeln.
GET /api/v1/stores Alla butiker med kedja, id, namn och datatillgänglighet.
GET /api/v1/products?q=banan&s=ica:1003385&limit=100 Sök aktuella produkter. q = sökterm, s = en eller flera butiker som kedja:butiksid (upprepa parametern), limit upp till 200 (Gratis) eller 1000 (betalnivå). API:et paginerar inte (offset/page ger 400) — behöver du hela katalogen ingår bulk-export i Byrå-nivån.
GET /api/v1/products/{chain}/{store_id}/{product_id}?history=1 En produkt i en butik. history=1 ger daglig basprishistorik (betalnivå; Pro 12 mån, Byrå full).
GET /api/v1/deals?s=coop:012345&lookback_days=7 Aktuella prissänkningar. limit, lookback_days.
GET /api/v1/cheap?s=willys:123&limit=50 Billigaste produkter efter jämförpris.

Svarsformat

Sök- och produktsvar har formen { "data": [...], "count": N }. Varje produktobjekt ser ut så här (fält bakom betalnivå är markerade):

{
  "chain": "coop",
  "store_id": "015700",
  "product_id": "2317401100009",
  "name": "Banan Styck",
  "brand": null,
  "category": "Frukt & Grönsaker > Frukt & bär > Banan",
  "amount": 180.0,
  "unit": "g",
  "package": "180 g",
  "available": true,
  "prices": {
    "regular": 3.57,
    "effective": 3.40,
    "comparison": { "price": 18.89, "unit": "kg" },
    "member": 3.20,
    "multiprice": { "price": 3.00, "quantity": 3 }
  },
  "urls": {
    "primat": "https://primat.nu/vara/coop/015700/2317401100009",
    "source": "https://www.coop.se/..."
  }
}

Prisfälten

FältBetydelse
regularPriset i butiken just nu, för alla kunder. När kedjan kör en kampanj som gäller alla speglas kampanjpriset här. Kräver aldrig medlemskap.
memberPris med kedjans medlemskort (Stammis, Coop-medlem, Willys Plus m.fl.). Sätts bara när butiken faktiskt kör ett medlemspris på varan — för de allra flesta varor är fältet null. Det är alltså inte en parallell prislista utan en kampanjsignal.
multipriceFlerköpspris som gäller alla ("2 för 42 kr"): pris per styck och antal som krävs.
member_multipriceFlerköpspris som kräver medlemskap.
effectiveLägsta av fälten ovan — inklusive medlems- och flerköpspriser. Skiljer din tjänst på medlemmar och icke-medlemmar ska du inte använda effective som pris för icke-medlemmar; räkna i stället själv utifrån regular och multiprice.
comparisonJämförpris per kg/l/st, beräknat på effective.
availableOm varan fanns i butikens sortiment vid senaste hämtningen.

Alla aktuella prisfält ingår i gratisnivån; historik och prisserier kräver betalnivå.

Nivåer & gränser

NivåHastighetRader/dygnHistorikBulk-exportPris
Gratis60 anrop/min50 0000 kr
Pro600 anrop/minobegränsat12 månader1 995 kr/mån
Byrå3 000 anrop/minobegränsatfull7 495 kr/mån

Priser ex moms. Fullständig jämförelse och Enterprise-nivå på /data. Överskriden hastighet ger 429 med Retry-After. Historik klipps automatiskt till din nivå. Genom att använda API:et godkänner du villkoren.

Felkoder

KodBetyder
400Felaktig förfrågan, t.ex. saknad sökterm (query_required) eller pagineringsparametrar (pagination_not_supported).
401Saknad eller ogiltig API-nyckel (invalid_api_key).
403Funktionen kräver en högre nivå (upgrade_required).
404Produkten hittades inte.
429Hastighetsgräns eller dygnsbudget nådd (rate_limited / daily_row_budget_exceeded / demo_limit_reached).

Felsvar har formen { "detail": { "error": "...", "message": "..." } }.

Täckning

1 258 butiker med aktuella priser hos ICA, Coop, Willys, Hemköp, Lidl och City Gross, 190 134 produkter och 139 236 225 registrerade prisändringar, dagligen sedan december 2025. Coop, Willys, Hemköp och City Gross är EAN-kopplade; ICA identifieras via kedjans produkt-id (probabilistisk EAN-matchning finns på begäran). Lagringen är en ändringslogg: en rad skrivs när ett prisfält ändras, och frånvaro av rad betyder oförändrat pris, inte utebliven mätning.

Butikslistan i /api/v1/stores innehåller hela butiksregistret, även butiker med "available": false. Det är butiker som inte publicerar sina priser på kedjans egen webbplats — då kan vi inte hämta dem, och produktanrop mot en sådan butik ger tomma svar. Filtrera på available när du väljer butiker.

Kom igång – skapa API-nyckel