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.
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-nyckelKom igång
- Testa demot ovan så du ser dataformatet.
- Logga in på /data och skapa en API-nyckel (gratisnivån räcker för att komma igång).
- Skicka nyckeln som
Authorization: BearerellerX-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
| Endpoint | Beskrivning |
|---|---|
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ält | Betydelse |
|---|---|
regular | Priset 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. |
member | Pris 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. |
multiprice | Flerköpspris som gäller alla ("2 för 42 kr"): pris per styck och antal som krävs. |
member_multiprice | Flerköpspris som kräver medlemskap. |
effective | Lä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. |
comparison | Jämförpris per kg/l/st, beräknat på
effective. |
available | Om 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å | Hastighet | Rader/dygn | Historik | Bulk-export | Pris |
|---|---|---|---|---|---|
| Gratis | 60 anrop/min | 50 000 | – | – | 0 kr |
| Pro | 600 anrop/min | obegränsat | 12 månader | – | 1 995 kr/mån |
| Byrå | 3 000 anrop/min | obegränsat | full | ✓ | 7 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
| Kod | Betyder |
|---|---|
400 | Felaktig förfrågan, t.ex. saknad sökterm (query_required) eller pagineringsparametrar (pagination_not_supported). |
401 | Saknad eller ogiltig API-nyckel (invalid_api_key). |
403 | Funktionen kräver en högre nivå (upgrade_required). |
404 | Produkten hittades inte. |
429 | Hastighetsgrä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.