ReceptAPI

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
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
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/dagAttribution
anonymous (ingen nyckel)50 per IPKrävs
free100Krävs
indie10 000Nej
pro100 000Nej
businessEnligt avtalNej

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.

200 OK
{
  "data": [ … ],
  "meta": {
    "attribution": "Data från ReceptAPI – receptapi.se",
    "total": 1043,
    "limit": 48,
    "offset": 0,
    "tier": "free"
  }
}
429 Too Many Requests
{
  "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.

ParameterBeskrivning
qFritext i titel, beskrivning, taggar och ingrediensrader
categoryt.ex. huvudratt, efterratt, bakning
tagExakt tagg, t.ex. vegetarisk
ingredientIngrediens-slug, t.ex. kyckling
limit1–100, standard 48
offsetStandard 0
GET /recipes?category=efterratt&limit=1
{
  "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.

GET /recipes/kladdkaka
{
  "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.

GET /ingredients?q=grädde
{
  "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.

TypeScript
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.