Show HN: CLI to order groceries via reverse-engineered REWE API (Haskell) (github.com)

181 points by wazHFsRy 3 days ago

I just had the best time learning about the REWE (German supermarket chain) API, how they use mTLS and what the workflows are. Also `mitmproxy2swagger`[1] is a great tool to create OpenAPI spec automatically.

And then 2026 feels like the perfect time writing Haskell. The code is handwritten, but whenever I got stuck with the build system or was just not getting the types right, I could fall back to ask AI to unblock me. It was never that smooth before.

Finally the best side projects are the ones you actually use and this one will be used for all my future grocery shopping.

[1]https://github.com/alufers/mitmproxy2swagger

aweiher 5 hours ago

I hope REWE is seeing this and offers an official MCP server. In the end we pay real money there. :D

I wrote a skill some time ago to support me with "agentic groceries" on my own - it's the future of shopping I would say.

My workflow:

- I paste in urls or text for receipts I will cook this week - agent extracts the ingredients, calculates cups to ml and such, replaces meat with vegi ingredients, replaces some other things I prefer always (often also creates a nice markdown receipe at this steo I can put into Obsidian) - check my list of favs, check search cache (so not every time the api is called, I'm a good netizen :D ) - ask me which items I have at home (no need to add to the basket) - search rewe api for multiple candidates and let me choose. - after each recipe I enter /new to start with fresh context - also I have a list of things I buy every week

I still put everything manually in the basket in the end, but this is not the thing which is time intensive.

wazHFsRy 5 hours ago

This is also my exact workflow here. Thank you. I'm adding things that should be in the basket via Siri to my Obsidian notes. I also add recipes to that list or anything else. Then Claude checks that list once I want to do the shopping, looks through my favorites, and fills the baskets with all the items needed. I also use Claude to list the most frequently bought items for a template that always gets filled in.

robonot 3 hours ago

Awesome. Are you exposing the api to Claude or just copy pasting the data for it to analyze? How are you feeding it the data?

wazHFsRy 3 hours ago

vessenes 3 hours ago

  > The suggestion engine (korb suggestion threshold) is re-implemented in Lean 4 with five mathematically proven properties: suggestions have positive frequency, are sorted descending, come from ordered and available products, exclude basket items, and respect the count limit.
This is amazing. I mean this literally in that I am amazed, but also figuratively in that I am delighted to watch the type-safe-mad build cool shit.

wazHFsRy 3 hours ago

Thank you. Though I have to say I'm really not an expert in that domain and just starting to explore it myself.

Bewelge 10 hours ago

Cool project, but have mixed feelings about publishing ever easier ways to access this API. They've locked down the API a while ago for a reason.

Also there already exists this reverse engineered project: https://github.com/ByteSizedMarius/rewerse-engineering/

I do have a suggestion for your app though: Have it compare your basket of goods across different markets in your region to show you the cheapest option. I'm pretty sure this possibility is actually one of the reasons they locked down the API.

I've used Data from REWE in the past and made a comparison between a couple of cities in Germany (I believe it was Frankfurt, cologne, Berlin, Munich and Hamburg). Hamburg was by far the most expensive, often as much as 10-20% more expensive.

randomNumber7 an hour ago

> I do have a suggestion for your app though: Have it compare your basket of goods across different markets in your region to show you the cheapest option.

This is a great idea. I just think the use case is not that big since REWE is the worst in the price/quality ration and just going to another shop would save you more.

wazHFsRy 8 hours ago

The existing project was a great inspiration and helped me figure out the mTLS stuff. I totally get your mixed feelings, though.

I really like your suggestion. I will put it in an issue and look into that. https://github.com/yannick-cw/korb/issues/4

Bewelge 8 hours ago

Just to be clear, my mixed feelings don't come from a moral standpoint. Just hoping they don't lock it down any further heh ;-)

abdusco 7 hours ago

> Compare process across different markets.

Check out smhaggle app on Android

https://play.google.com/store/apps/details?id=com.smhaggle.a...

Bewelge 5 hours ago

Oh nice, thank you. Will check it out later!

What I suspect though: They mainly show current discounts. The REWE API exposes those as a separate list for each market. There's around 3.5k markets and each can set their own discounts and has their own product catalogue with their own pricing.

So it would be 3.5k API calls to fetch all offers for all markets. Which is doable.

But fetching all products takes like 100 calls per market. It's quite a bit of data. And I think most supermarket don't publish their catalogue at all since they don't have delivery options.

aweiher 6 hours ago

2.8 rating in Play Store sounds bad

duskdozer 10 hours ago

>I do have a suggestion for your app though: Have it compare your basket of goods across different markets in your region to show you the cheapest option.

I'd settle for just being able to sort items by unit price... I'm sure this is a [regulation-]solved problem in Germany though

Bewelge 8 hours ago

> I'd settle for just being able to sort items by unit price

What do you mean? The official REWE app and website provide just that.

> I'm sure this is a [regulation-]solved problem in Germany though

Not sure what you mean by that.

tstenner 2 hours ago

gigatexal 8 hours ago

An aggregator like this that could surface the same good for the cheapest price all inclusive of delivery would be something I would pay for!

atollk 7 hours ago

As a SWE at Rewe (at a completely different department), I can say that I find this pretty cool. I wonder if this is going to be a wakeup to management to relax the API restrictions.

aweiher 5 hours ago

Please pitch internally for an official Rewe MCP server.

This is the future of doing groceries. Let us login with our credentials and let us do the search/filling the cart with agents.

Totally fine to do the payment only on the web, so everyone can be sure they only order what was wished, and not 300 avocados.

rvz 6 hours ago

You should tell them to charge for the API.

kleiba 7 hours ago

...or to tighten them.

wazHFsRy 7 hours ago

I mean, definitely leads to me buying more stuff on Rewe than before.

wazHFsRy 8 hours ago

I want to add something else to this. In the process of writing this, I also played with formal verification and formally verified the suggestion engine, which was a really nice side discovery.

The basic idea is to write a prove in Lean4 and then test both the production implementation (Haskell) and the Lean implementation against random inputs. Compare if the results are the same.

If that is the case -> you can be pretty sure the unproven production version is as correct as the proven lean version.

https://www.dev-log.me/formal_verification_in_any_language_f...

hk1337 7 hours ago

This reminds me of pizza party cli app way back late 90s or early 2000

karim79 3 hours ago

I want to use this but I literally have a Rewe 20 meters (at most) from the entrance to my building. Still I might give it a go considering all the positive comments in the thread.

splike 11 hours ago

That's funny, I've just built the same thing for Asda in the UK https://github.com/markDunne/asdabot

It can search for items, add them to the basket, picks a delivery slot and does the checkout.

With a little more scaffolding in markdown files, this now takes care of my weekly shopping.

Latitude7973 10 hours ago

Even a CLI interface would be better than the sorry excuse of Asda's website. I wonder if entrusting an LLM is worth the trade off with the tedium of online shopping.

ramon156 8 hours ago

Serious good use of an AI. Just let them do the grey area (like repeated purchase). I'd even let an algo pick better groceries for me. Cools tuff!

wazHFsRy 8 hours ago

Absolutely. For example, I want to ask it: Suggest me some vegetables I haven't ordered in recent weeks or stuff like this, and this is all possible.

dewey 4 hours ago

Ideally it should also look up if they are currently in season in your location, so many possibilities!

wazHFsRy 4 hours ago

aprilnya 7 hours ago

Could even ask it to find recipes and then have it buy the ingredients needed for them next time it's doing your shopping!

Dominik1001 12 hours ago

Very cool! Thanks for sharing, I’ll try it out.

Haskell is indeed an interesting choice. ;)

volume_tech 6 hours ago

the mTLS part is interesting. they're using it not for security in the traditional sense -- REWE knows what their own app is doing -- but as a fingerprinting mechanism. the client cert is how they distinguish their official app from third-party access. the weak point is that the cert has to live somewhere in the app binary, which is why mitmproxy can intercept it. it's less about encryption and more about making ToS enforcement slightly harder.

braedonwatkins 8 hours ago

I remember a friend and I in college were looking into ways to do this in the US but major grocery chains here are pretty sensitive about their product data being accessible by open APIs and web scraping...

It would have been a cool project!

danielszlaski 11 hours ago

I love the idea of a CLI for groceries. Do you have plans to support 're-order' scripts or meal-plan integration? I can imagine a workflow where a recipes.yaml file gets piped into your CLI to automatically fill the cart with everything needed for the week. Much faster than clicking through a mobile UI.

wazHFsRy 8 hours ago

Absolutely, that could just be a small script or something on top that calls the CLI tool

rmoriz 8 hours ago

Surprised how little the B2C and even B2B e-commerce segment is providing API access for automation and agentic coding. One could easily set up rate limits, fraud detection and KYC checks upfront initial access.

PurpleRamen 5 hours ago

Normal customers are not paying for APIs, so there is little value in offering them for free, especially when it can be harmful. B2B sometimes does pay for them, but not always is it obvious from the outside that they even exist. Much commerce is also on tight numbers and thus kinda secretive about their stuff.

wazHFsRy 8 hours ago

Yeah, absolutely. I think internally, everyone is cooking up some gigantic commerce. This is just bringing it to myself a bit earlier.

Bewelge 8 hours ago

B2B: Look at chefkoch.de They do use the REWE API, and I'm guessing not without their knowledge

B2C: Is it really surprising that a busines has no interest in providing more price transparency to their customers?

rmoriz 8 hours ago

When Amazon launches an API everyone cries. Same story over and over. Even better example: TakeAway-Group. The perfect MITM.

Bewelge 8 hours ago

traceroute66 7 hours ago

> B2C: Is it really surprising that a busines has no interest in providing more price transparency to their customers?

Might I suggest you remove your tin-foil hat and consider that:

   - 99% of REWE customers almost certainly have no clue what an API is
   - 99% of the remaining 1% know what an API is, but their day-job involves messing with APIs, so they don't want to spend their weekend-time messing with the REWE API, they just want to do their shopping at REWE.
   - The final 0.1% are those who come on HN and pretend its all some sort of big conspiracy to minimise transparency by $evil_corp. :)
If you think about it, imagine if REWE officially exposed an API B2C. This would mean they are obligated to provide support.

Do you really want the price of your shopping to increase because REWE now needs to find money to pay for a helpdesk for the millions of B2C API users ?

Businesses and services differentiating between B2C and B2B is nothing new, that is why the two different terminologies exist !

What next, you don't want to fill up your car at the petrol station (B2C) but you want to be permitted to buy a barrel crude oil direct from the drill and refine it yourself (B2B) ?

Bewelge 6 hours ago

son3tt 10 hours ago

Really cool, but this is also how you end with 300 avocados and 500 L of detergent.

stavros 9 hours ago

Well of course, how else am I going to make my Tideamole?

wklm 12 hours ago

Nice! Do you know if the Austrian billa (REWE's subsidiary) is using the same api?

elAhmo 8 hours ago

This could be helpful: https://heisse-preise.io

fractallyte 12 hours ago

My friend works at Billa AT; I could ask her – but that would be cheating ;-)

stavros 9 hours ago

What's the point of this comment!

kls0e 11 hours ago

this feels a bit like Sandra Bullock ordering pizza in „The Net“, impressive

a012 9 hours ago

It’s one step closer to have an agent to go shopping for my recipes or dinner, but hopefully unlike the Son of Anton

wazHFsRy 8 hours ago

I am using it exactly like this. I tell Claude: "Add all things for this recipe to the basket."

ramonga 11 hours ago

Funny enough I was looking at rewe network requests for a personal app that suggests weekly meals and automatically orders the ingredients for you

wazHFsRy 8 hours ago

Just pipe the items through this CLI, and you can save a ton of work :)

picografix 10 hours ago

tell us more about it

kylex-ken 4 hours ago

supper cool, would be great if you can onboard different services.

sgbeal an hour ago

> supper cool

Pun presumably intended?

zephyrwhimsy 7 hours ago

Evaluation in LLM applications is still an unsolved problem. Most teams rely on vibes-based assessment. Rigorous evaluation frameworks that correlate with real-world performance remain elusive.

sigr_ 11 hours ago

Really cool to see things still being built in Haskell! How do you find using it compared to some of the newer languages that have more modern tooling?

Did you implement your own OAUTH2 flow in haskell for this?

wazHFsRy 8 hours ago

For me, Haskell is the language of 2026. Having an agent available if you get stuck with some weird type error is a blessing. It also helps with the tooling. Though the modern tooling with cabal is pretty good.

yakshaving_jgt 10 hours ago

Does Haskell not have modern tooling? What would be considered modern in this context?

sigr_ 5 hours ago

it does through cabal and stack but its not as streamlined, quick, and versatile as tooling for languages like Golang or Rust imo.

I'm a huge fan of Haskell and I'm really exploring it as my primary language now that AI has gotten so huge, not just because it makes it easier but also because I can really lock down what I allow code to do (through pure functions, type checking etc) and so I feel a lot more confident in AI generated code

yakshaving_jgt 5 hours ago

tietjens 11 hours ago

Love this! Super cool.

rvz 10 hours ago

> Finally the best side projects are the ones you actually use and this one will be used for all my future grocery shopping.

Until it breaks in a few weeks.

wazHFsRy 8 hours ago

I mean, fixing small issues is not a big deal – during my ordering sessions, if something comes up, I actually just let Claude create an issue for it, and then when I have time, I create a fix.

rvz 7 hours ago

Well you don't control the API so it will still break.