{"description":"Runs CHECK24's electricity (Strom) comparison for a German postcode and annual kWh. Per tariff: provider, monthly price as CHECK24 shows it, the price after the bonus period, working price, base price, bonuses, a bonus-free annual cost computed from base and working price, minimum term, price guarantee, green power, dynamic tariff flag and ratings. Also returns a link to the same comparison on CHECK24.","effect":"read","id":"check24.de/compare-electricity","keywords":["check24","strom","stromvergleich","stromtarif","stromanbieter wechseln","ökostrom","energie","tarifvergleich","electricity","electricity tariff","energy comparison","power provider","switch provider"],"output":{"schema":{"properties":{"city":{"type":"string"},"consumption_kwh":{"type":"integer"},"local_default_tariff":{"description":"The local basic supplier tariff (Grundversorgung) CHECK24 compares against","type":["object","null"]},"other_places":{"description":"Other places for this postcode; rerun with params.city to pick one","items":{"type":"string"},"type":"array"},"results_url":{"description":"This comparison on CHECK24, to switch","format":"uri","type":"string"},"summary":{"description":"CHECK24's headline, HTML removed","type":["string","null"]},"tariffs":{"items":{"properties":{"annual_cost_eur":{"description":"12 × base price + working price × consumption, no bonuses","type":"number"},"badges":{"items":{"type":"string"},"type":"array"},"base_price_eur_month":{"type":"number"},"bonus_eur":{"description":"Sum of one-off bonuses (0 if none)","type":"number"},"dynamic":{"type":"boolean"},"first_year_cost_eur":{"description":"annual_cost_eur minus bonuses","type":"number"},"green":{"description":"CHECK24 Ökostrom label or 100 % renewable share","type":"boolean"},"later_from":{"type":["string","null"]},"later_monthly_eur":{"description":"Monthly price after the bonus period (or estimated from month 2 for dynamic tariffs)","type":["number","null"]},"min_term":{"description":"e.g. '12 Monate', 'bis 31.12.2027'","type":["string","null"]},"position":{"type":"integer"},"price_guarantee":{"type":["string","null"]},"provider":{"type":"string"},"rating":{"type":["number","null"]},"rating_count":{"type":["integer","null"]},"renewable_share":{"type":["string","null"]},"score":{"description":"CHECK24 Tarifbewertung, 0-10","type":["number","null"]},"shown_basis":{"description":"'Ø pro Monat' = average month in year 1 incl. bonuses; 'im 1. Monat' = first month only (dynamic tariffs)","type":"string"},"shown_monthly_eur":{"description":"Monthly price as CHECK24 shows it; see shown_basis","type":"number"},"tariff":{"type":"string"},"working_price_ct_kwh":{"type":"number"}},"type":"object"},"type":"array"},"total":{"description":"Tariffs matching the filters, before limit","type":"integer"},"zip_code":{"type":"string"}},"required":["zip_code","city","consumption_kwh","tariffs"],"type":"object"},"value":"let $t = steps.tariffs, $kwh = params.consumption_kwh, $green = params.green_only, $nodyn = params.exclude_dynamic in let $m = $t.list[?(!$green || green) && (!$nodyn || !dynamic)] in {zip_code: params.zip_code, city: params.city || steps.place.city, other_places: steps.place.cities[1:] || `[]`, consumption_kwh: $kwh, summary: $t.summary && replace(replace($t.summary, '<b>', ''), '</b>', '') || `null`, results_url: join('', ['https://energie.check24.de/ergebnis/strom/?calculationParameterId=', $t.calculation_id || '', '&pid=24']), local_default_tariff: $t.reference, total: length($m), tariffs: ((params.limit == `5` && $m[:5]) || (params.limit == `25` && $m[:25]) || $m[:10])[].merge(@, {annual_cost_eur: floor((base_price_eur_month * `12` + working_price_ct_kwh * $kwh / `100`) * `100` + `0.5`) / `100`, first_year_cost_eur: floor((base_price_eur_month * `12` + working_price_ct_kwh * $kwh / `100` - bonus_eur) * `100` + `0.5`) / `100`})}"},"params":{"additionalProperties":false,"properties":{"city":{"description":"Only needed when a postcode covers several places; otherwise looked up","maxLength":80,"type":"string"},"consumption_kwh":{"description":"Yearly consumption in kWh, e.g. 2500 (2 people)","maximum":100000,"minimum":100,"type":"integer"},"exclude_dynamic":{"default":false,"description":"Drop dynamic/flex tariffs whose price follows the exchange price","type":"boolean"},"green_only":{"default":false,"description":"Only 100 % renewable (Ökostrom) tariffs","type":"boolean"},"limit":{"default":10,"enum":[5,10,25],"type":"integer"},"sort":{"default":"price","description":"price = CHECK24's price ranking (year-1 price incl. bonuses); popularity = CHECK24's default","enum":["price","popularity"],"type":"string"},"zip_code":{"description":"German postcode, e.g. '10178'","pattern":"^[0-9]{5}$","type":"string"}},"required":["zip_code","consumption_kwh"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"spikes/check24.md. One GET to the React Router single-fetch loader returns all ~200 tariffs as turbo-stream (parse: turbo_stream). No cookies, tokens or custom headers; credentials omit so a logged-in user's CHECK24 activity history is not touched. Price ranking is pure price order (no ad insertion; 'Bestseller' and Premium24 are badges). 'price' mixes bases: year-1 average incl. bonuses for fixed tariffs, first month for dynamic ones, so the recipe adds a bonus-free annual_cost_eur. ecoType is not a query filter (ignored server-side), hence green_only filters client-side. The _routes value is a build artifact and may change.","recorded_at":"2026-11-07T11:57:00+01:00","recorded_by":"C4"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"DE","id":"check24.de","language":"de","name":"CHECK24","origin":"https://energie.check24.de","origins":["https://energie.check24.de"]},"steps":[{"description":"Postcode to place name(s). Skipped when params.city is given.","expect":{"assert":"length(keys(body)) > `0`","content_type":"json","status":[200]},"extract":{"json":{"cities":"keys(@)","city":"keys(@)[0]"}},"id":"place","request":{"credentials":"omit","headers":{"Accept":"application/json"},"method":"GET","query":{"extended":"yes","shortCity":"yes","zipcode":"{{params.zip_code}}"},"url":"https://energie.check24.de/common/ajax/postal_code"},"when":"!(params.city)"},{"description":"React Router single-fetch loader; the whole list (~200 tariffs, ~880 KB) comes as one turbo-stream.","expect":{"assert":"values(body)[0].data.result.tariffList != null","status":[200]},"extract":{"json":{"calculation_id":"values(@)[0].data.result.calculationParameter.calculationParameterId","echo_kwh":"values(@)[0].data.result.calculationParameter.totalConsumption","echo_zip":"values(@)[0].data.result.calculationParameter.zipCode","list":"values(@)[0].data.result.tariffList[].{position: position, provider: provider.name, tariff: name, shown_monthly_eur: price, shown_basis: priceText, later_monthly_eur: priceAnnotation.note.value != `null` && priceAnnotation.note.value / `100` || `null`, later_from: priceAnnotation.note.prefix && trim(replace(priceAnnotation.note.prefix, ':', '')) || `null`, working_price_ct_kwh: unitWorkingFeeModel.unitFee, base_price_eur_month: unitWorkingFeeModel.basePrice, bonus_eur: sumBonus && to_number(replace(replace(sumBonus, '.', ''), ',', '.')) || `0`, green: eco.eco == `true` || starts_with(eco.percentageText || '', '100'), renewable_share: eco.percentageText || `null`, dynamic: isFlex == `true`, min_term: (tariffHints[?type=='clock'].text | [0]) && trim(split((tariffHints[?type=='clock'].text | [0]), ':')[1]) || `null`, price_guarantee: (tariffHints[?type=='lock'].text | [0]) || `null`, rating: evaluation.rating || `null`, rating_count: evaluation.count || `null`, score: tariffScore.scoreFormatted && to_number(replace(replace(replace(tariffScore.scoreFormatted, '<b>', ''), '</b>', ''), ',', '.')) || `null`, badges: chips[].text}","reference":"values(@)[0].data.result.referenceTariff.{provider: providerName, tariff: tariffName, monthly_eur: price}","summary":"values(@)[0].data.result.tariffCountText"}},"id":"tariffs","parse":"turbo_stream","request":{"credentials":"omit","method":"GET","query":{"_routes":"pages/Result/features/ReloadResult/services/resultApiLoader","city":"{{params.city}}{{steps.place.city}}","customerType":"private","deviceOutput":"desktop","partnerId":"24","productId":"1","sortField":"{{params.sort}}","sortOrder":"asc","totalConsumption":"{{params.consumption_kwh}}","zipCode":"{{params.zip_code}}"},"url":"https://energie.check24.de/api/reload-result.data"}}],"task":"Compare electricity tariffs for a postcode and yearly consumption","tos":{"notes":"CHECK24's terms prohibit automated data extraction. One user-initiated comparison at a time from the user's browser (2 requests). Each call creates a server-side calculation; never pass overwrite=true. Switching providers stays on CHECK24 via results_url.","reviewed":false},"verify":{"checks":["length(output.tariffs) > `0`","output.city == 'Berlin'","output.total > `50`","output.tariffs[0].working_price_ct_kwh > `10`","output.tariffs[0].annual_cost_eur > `300`","output.tariffs[0].shown_monthly_eur > `0`","contains(output.results_url, 'calculationParameterId=')"],"example_params":{"consumption_kwh":2500,"zip_code":"10178"},"max_ms":6000},"version":1}