The word is older than the dish most people picture: chupe comes from Quechua chupi, simply “soup” — which tells you people were eating a version of this long before milk and cheese arrived to change it. A chupe is a whole category rather than one recipe: a milk-based chowder held together with rice or potato and finished with egg and cheese, and every coast and valley in Peru has its own. Chupe de pescado shares its name and general technique with chupe de camarones — a milk-based chowder thickened with rice and finished with egg and cheese — but built on fish instead of the more expensive Arequipeño river shrimp, making it a more accessible, everyday version of the same comforting idea. It's coastal home cooking through and through, made with whatever fresh fish is on hand rather than anything specific to a single region.
The dish is lighter than its shrimp counterpart but follows the same essential logic: potato and rice for body, milk for richness, ají amarillo for color and warmth, egg and queso fresco stirred in at the end — the crumbly white cheese that softens into the broth instead of melting into strings.
Junín is hours from the ocean and high in the Andes, so the fish in my mother's chupe was never sea fish — it was trucha, river trout, pulled out of the cold water near us and cooked exactly the way somebody on the coast would cook a cojinova. That's the honest highland version of this recipe, and it works. The technique never cared where the fish came from.
Rice cooks directly in the broth
As with several Peruvian soups, the rice goes straight into the simmering broth rather than being cooked separately, releasing starch that thickens the chowder naturally into its characteristic body. Give it the full simmer time before adding the more delicate ingredients.
The rice isn't a garnish floating in this soup. It's part of what turns broth into chowder.
Add the fish and milk near the end, gently
Milk can curdle if boiled too hard, and fish overcooks fast — both go in only once the rice and potato have already done most of their cooking, and the heat comes down to a gentle simmer from that point on. Rushing this stage risks both a broken, grainy broth and dry, overcooked fish.
Which fish to use
The honest answer is whatever came off the boat that morning, which is exactly how it gets cooked on the Peruvian coast. But the choice is not completely open: this soup simmers, and a delicate fish will fall apart into threads before it reaches the table.
What works is a firm white fish in thick pieces — cod, hake, haddock, halibut, monkfish, or the bonito and cojinova we would use here. Cut it into chunks rather than fillets, so each piece survives the last five minutes in the pot. What does not work is anything thin and flaky, or anything oily and strong enough to take over the milk.
Frozen fish is fine, and better than tired fresh fish. Thaw it fully and pat it dry first, or it will water down the broth just as you have finished building it.
The egg and the cheese at the end
These two go in last and they are what turn a fish soup into a chupe. Neither is complicated, and both are easy to get wrong by rushing.
The egg can go in two ways. Cracked whole into the simmering pot and left alone, it poaches and each bowl gets one — that is the version most homes make. Beaten and stirred in slowly, it threads through the broth instead. Either is correct; what is not correct is a hard boil afterward, which turns the egg rubbery and breaks the milk at the same time.
The cheese is queso fresco, cubed and dropped in off the heat. It is meant to soften and hold its shape, not melt into strings — that is why a stretchy cheese is the wrong choice here. Mexican queso fresco is the same idea; a firm feta rinsed under cold water works if you cannot find it.
The recipe
Ingredients
- 600g firm white fish, cut into chunks
- 1/3 cup rice
- 1 onion, diced · 3 garlic cloves, minced
- 2 tbsp ají amarillo paste
- 2 potatoes, cubed
- 5 cups fish broth or water
- 1 cup milk
- 2 eggs
- 100g queso fresco, cubed
- 1/2 cup peas
- 2 tbsp oil · salt · pepper · chopped cilantro, to finish
Method
- Build the base. Cook onion and garlic, stir in ají amarillo paste.
- Simmer rice and potato in broth 15 minutes until tender.
- Add milk, peas and fish, simmering gently 6-8 minutes.
- Finish with poached or stirred-in egg, cheese and cilantro.
Troubleshooting, from experience
Milk curdled. Boiled too hard once added. Keep it at a gentle simmer from that point on.
Fish came out dry. Overcooked. Add it last and pull the pot from heat as soon as it's just cooked.
Chowder too thin. Not enough rice, or it didn't simmer long enough to release starch. Give it the full 15 minutes before adding the rest.
What to serve it with
Chupe de pescado is a full meal in the bowl, needing nothing more than a wedge of lime.
Questions people ask
Why did my broth turn grainy? The milk boiled. Once the milk goes in, the pot should never come back to a rolling boil — a gentle simmer is all it needs, and it is all the fish needs too. If it has already broken, it will still taste fine; it just will not look the way it should.
What fish should I use? A firm white fish in thick chunks: cod, hake, haddock, halibut, monkfish. Cut it into pieces rather than laying in fillets, so each one survives the last five minutes. Avoid anything thin and flaky, or anything oily enough to take over the milk.
Can I use frozen fish? Yes, and frozen is better than tired fresh. Thaw it fully and pat it genuinely dry — wet fish waters down a broth you just spent half an hour building.
What is the difference between chupe and a chowder? Very little in method and a lot in seasoning. The word chupe comes from Quechua chupi, simply soup, and the family predates the milk and cheese that now define it. What makes it Peruvian is the ají amarillo, the potato and rice together for body, and the egg and fresh cheese at the end.

Did you cook this?
Tell me how it went — including what did not work. I read every one, and with your permission I will put it on this page, with your first name, for whoever comes next.