API v1
Ett läs-API för svenska recept. Bas-URL https://receptapi.se/api/v1. Alla svar är JSON i UTF-8, CORS är påslaget för alla origin. Specifikationen finns som OpenAPI 3.1.
Kom igång
Utan nyckel får du 50 anrop per dag och IP-adress. Prova direkt:
curl -s "https://receptapi.se/api/v1/search?q=lax&limit=2"Vill du ha fler anrop skaffar du en nyckel på prissidan. Nyckeln visas en gång och lagras bara som hash hos oss.
Skaffa nyckel
På /priser väljer du nivå. Free ger en nyckel direkt mot e-postadress (en per adress). Indie, Pro och Business betalas med kort via Stripe; efter köpet landar du på /konto där nyckeln visas en enda gång. Prenumerationen löper månadsvis utan bindningstid. Om betalningen uteblir får nyckeln status past_due och svarar 401 tills den är reglerad; sägs prenumerationen upp stängs nyckeln av.
Autentisering
Skicka nyckeln i headern x-api-key. Nycklar börjar med rapi_.
curl -s -H "x-api-key: rapi_0123abcd…" "https://receptapi.se/api/v1/recipes?limit=5"Ogiltig eller inaktiverad nyckel ger 401. Utan header behandlas anropet som anonymt.
Gränser
| Nivå | Anrop/dag | Attribution |
|---|---|---|
| anonymous (ingen nyckel) | 50 per IP | Krävs |
| free | 100 | Krävs |
| indie | 10 000 | Nej |
| pro | 100 000 | Nej |
| business | Enligt avtal | Nej |
Gränsen nollställs vid midnatt UTC. Varje svar har x-receptapi-tier, x-ratelimit-limit och x-ratelimit-remaining. När gränsen är nådd svarar vi 429 med ett felmeddelande i error.
Svarsformat
Alla lyckade svar har formen { data, meta }. meta.attribution finns alltid med.
{
"data": [ … ],
"meta": {
"attribution": "Data från ReceptAPI – receptapi.se",
"total": 1043,
"limit": 48,
"offset": 0,
"tier": "free"
}
}{
"error": "Dagsgränsen (100 anrop) är nådd. Uppgradera på https://receptapi.se/priser.",
"meta": { "attribution": "Data från ReceptAPI – receptapi.se" }
}Endpoints
GET /recipes
Lista recept. Sorteras på titel.
| Parameter | Beskrivning |
|---|---|
q | Fritext i titel, beskrivning, taggar och ingrediensrader |
category | t.ex. huvudratt, efterratt, bakning |
tag | Exakt tagg, t.ex. vegetarisk |
ingredient | Ingrediens-slug, t.ex. kyckling |
limit | 1–100, standard 48 |
offset | Standard 0 |
{
"data": [
{
"slug": "kladdkaka",
"title": "Kladdkaka",
"description": "Seg chokladkaka med knäckig yta …",
"servings": 8,
"total_minutes": 35,
"difficulty": "latt",
"category": "efterratt",
"cuisine": "svensk",
"tags": ["choklad", "fika", "klassiker"],
"image_url": null,
"url": "https://receptapi.se/recept/kladdkaka",
"api_url": "https://receptapi.se/api/v1/recipes/kladdkaka",
"updated_at": "2026-10-15T18:00:00.000Z"
}
],
"meta": { "attribution": "Data från ReceptAPI – receptapi.se", "total": 112, "limit": 1, "offset": 0, "tier": "anonymous" }
}GET /recipes/{slug}
Ett recept i sin helhet: ingredienser med parsade mängder, steg, allergener och källa.
{
"data": {
"slug": "kladdkaka",
"title": "Kladdkaka",
"servings": 8,
"total_minutes": 35,
"active_minutes": 10,
"difficulty": "latt",
"category": "efterratt",
"tags": ["choklad", "fika"],
"allergens": ["agg", "gluten", "mjolk"],
"text_status": "rewritten",
"verified": false,
"nutrition": { "per": "portion", "kcal": 310 },
"source": { "name": "Köket", "url": "https://www.koket.se/…" },
"ingredients": [
{
"position": 0,
"raw_text": "100 g smör",
"amount": 100, "unit": "g", "note": null, "group": null,
"ingredient": { "slug": "smor", "name_sv": "Smör", "category": "mejeri", "allergens": ["mjolk"] }
},
{ "position": 1, "raw_text": "2 ägg", "amount": 2, "unit": "st", "note": null, "group": null,
"ingredient": { "slug": "agg", "name_sv": "Ägg", "category": "mejeri", "allergens": ["agg"] } }
],
"steps": [
{ "position": 0, "text": "Sätt ugnen på 175 °C.", "timer_seconds": null },
{ "position": 1, "text": "Grädda i mitten av ugnen.", "timer_seconds": 1200 }
],
"url": "https://receptapi.se/recept/kladdkaka"
},
"meta": { "attribution": "Data från ReceptAPI – receptapi.se", "source": { "name": "Köket", "url": "https://www.koket.se/…" }, "tier": "free" }
}GET /ingredients
Lista ingredienser. q matchar namn och alias. limit max 100.
{
"data": [
{
"slug": "vispgradde",
"name_sv": "Vispgrädde",
"category": "mejeri",
"allergens": ["mjolk"],
"default_unit": "dl",
"density_g_per_dl": 100,
"livsmedelsverket_id": null,
"url": "https://receptapi.se/ingredienser/vispgradde"
}
],
"meta": { "attribution": "Data från ReceptAPI – receptapi.se", "total": 3, "limit": 100, "offset": 0, "tier": "anonymous" }
}GET /ingredients/{slug}
En ingrediens med alias och antal recept den förekommer i (recipe_count).
GET /search?q=
Fritextsök över titlar, taggar och ingrediensrader. Samma svarsformat som /recipes. q är obligatorisk.
Portionsskalning
Multiplicera varje amount med önskat / servings. Rader med amount: null ("salt", "peppar") lämnas som de är. Använd density_g_per_dl på ingrediensen för att gå från volym till vikt.
const factor = 6 / recipe.servings;
const scaled = recipe.ingredients.map((i) => ({
...i,
amount: i.amount == null ? null : Math.round(i.amount * factor * 100) / 100,
}));Attribution
På nivåerna anonymous och free ska texten Data från ReceptAPI – receptapi.se visas synligt där datan används, med länk till https://receptapi.se eller till receptets url. Betalda nivåer är undantagna. Du får inte framställa datan som din egen, och du får inte ta bort källhänvisningen i source om du visar hela receptet.
Licens och villkor
- Recepttexter (beskrivningar, steg) är ReceptAPI:s egna omskrivningar och får användas enligt din nivå.
- Ingredienser, mängder och tider är faktauppgifter extraherade från publika källor; källan anges per recept.
- Bilder från källorna ingår inte och får inte hämtas via oss.
- Massnedladdning eller replikering av hela banken kräver datalicens.
- Vi kan ändra gränser och format med 30 dagars varsel; brytande ändringar får ny versionsprefix (
/v2). - AI-agenter och crawlers får använda gratisnivån med attribution. Se llms.txt.
Frågor om villkor och avtal: hej@receptapi.se.