Compare electricity tariffs for a postcode and yearly consumption.
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.
- Site
- CHECK24, Germany
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- fb433f73c20a…
Requests
sent from your browser, in order- 1GETenergie.check24.de/common/ajax/postal_code?extended&shortCity&zipcodePostcode to place name(s). Skipped when params.city is given.
- 2GETenergie.check24.de/api/reload-result.data?_routes&city&customerType&deviceOutput&partnerId&productId&sortField&sortOrder&totalConsumption&zipCodeReact Router single-fetch loader; the whole list (~200 tariffs, ~880 KB) comes as one turbo-stream.
Parameters
from your agentcitystringOnly needed when a postcode covers several places; otherwise looked up
consumption_kwhintegerrequiredYearly consumption in kWh, e.g. 2500 (2 people)
exclude_dynamicbooleanDrop dynamic/flex tariffs whose price follows the exchange price = false
green_onlybooleanOnly 100 % renewable (Ökostrom) tariffs = false
limitenum 5 | 10 | 25 = 10
sortenumprice = CHECK24's price ranking (year-1 price incl. bonuses); popularity = CHECK24's default "price" | "popularity" = "price"
zip_codestringrequiredGerman postcode, e.g. '10178'
Returns
to your agentcitystring
consumption_kwhinteger
local_default_tariffobjectThe local basic supplier tariff (Grundversorgung) CHECK24 compares against
other_placesstring[]Other places for this postcode; rerun with params.city to pick one
results_urlstringThis comparison on CHECK24, to switch
summarystringCHECK24's headline, HTML removed
tariffsobject[]annual_cost_eur, badges, base_price_eur_month, bonus_eur, dynamic, first_year_cost_eur, green, later_from, later_monthly_eur, min_term, position, price_guarantee, provider, rating, rating_count, renewable_share, score, shown_basis, shown_monthly_eur, tariff, working_price_ct_kwh
totalintegerTariffs matching the filters, before limit
zip_codestring
Where it can send
- energie.check24.de
Anything else is blocked by the extension.
Reads from your session
Nothing. Your browser attaches the site's cookies by itself.
Used only in requests to the addresses on the left. Never sent to wield.run or your agent.
Checks
a run passes when- 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=')
Raw recipe
Served as canonical JSON from /api/v1/recipes/check24.de/compare-electricity, so its sha256 matches the ETag and the index.
Check it yourself
curl -s https://wield.run/api/v1/recipes/check24.de/compare-electricity | shasum -a 256 # fb433f73c20aeeee15c0a33541d743221d901c71b0d8ada06737001a81c0ba76
check24.de/compare-electricity.json, v1
{ "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-07T12:05: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 }