
Jakarta-Betawi coconut beef soup — beef brisket and offal (tripe, intestine, lung optional) simmered in a creamy broth thickened with coconut milk and cow's milk, spiced with cinnamon, cardamom, cloves, and lemongrass. Served over rice with tomato, scallion, fried shallots, emping crackers, and a wedge of lime. Jakarta's signature soup, distinguished from other Indonesian soto by its creamy-rich coconut-milk broth and Arab-influenced cardamom-clove spicing.
Soto Betawi developed in 19th-century Batavia (colonial Jakarta) as a fusion of Indigenous Sundanese-Javanese soto tradition + Arab/Indian milk-based curries + Dutch-influenced cream usage. The Betawi (native Jakartan) Muslim community added the Middle-Eastern-style spicing (cardamom, cloves, cinnamon). The dish became famous citywide in the 20th century — 'Soto Betawi H. Husein' (the legendary Manggarai, South Jakarta vendor) is the most iconic and is credited with standardizing the modern recipe. Distinguished from Soto Madura/Soto Padang by its richness; Soto Betawi is the heaviest of all Indonesian sotos. Modern adaptations sometimes omit offal for international tourists, but the canonical version uses 'jeroan' (beef offal mix) for the deepest flavor.
Soto Betawi is the velvet curtain of Indonesian soups — the broth is creamy, sweet from coconut, with Middle-Eastern spice notes (cardamom, cinnamon, clove) you don't find elsewhere in Indonesian cooking. Take a spoonful: the texture is silky, the flavor layered. Then a piece of meltingly-tender beef brisket. Then a piece of tendon — jelly-soft from the long cook. Then a chunk of tripe (if you've kept it) — surprisingly mild and absorbent of the broth. The diced tomato adds acid; emping cracker adds salty-crunch. A squeeze of lime, a spoon of sambal, and the dish swings from rich-comfort to bright-spicy. The breakfast Jakartans wait in line for.
Three flavor cultures meet in soto Betawi: (1) Indonesian aromatic base (shallot + garlic + galangal + lemongrass), (2) Middle Eastern warm spices (cardamom + cloves + cinnamon — Indian-Arab influence via centuries of trade), (3) European-influenced dairy enrichment (cow's milk added with coconut milk — unique to Betawi version). The 90-min beef simmer extracts collagen; the coconut milk + dairy mix creates body without breaking (coconut fat stabilizes the milk emulsion). Adding dairy at LOW heat (not boiling) prevents curdling. The cardamom + clove must be added with the sauté so they bloom in oil before adding water.
Variations
Pak H. Husein style (canonical, with full offal mix); modern simplified (just brisket + coconut milk for tourists); 'Soto Betawi Susu' (extra-creamy, with more milk, modern variation); 'Soto Tangkar' (Betawi cousin — drier, with beef ribs, less broth); vegetarian impossibility, but a fish version using firm white fish + coconut milk approximates the texture (called 'soto ikan Betawi').
On the Palate
Where Soto Betawi sits in the Indonesian flavor cloud
Ingredients
Serves 6How it's made
8 steps · 50 min active + 2 hours 10 min waiting
- 195 min
Boil beef: in a stockpot combine 600g beef brisket + 200g beef tendon + 200g beef tripe (cleaned, optional) + 2L water + 1 tsp salt. Bring to boil; reduce; simmer 90 min until tender. Skim foam.
- 25 min
Make spice paste: in a blender combine 8 shallots + 6 garlic cloves + 4 candlenuts + 3cm fresh ginger + 2cm fresh turmeric + 1 tsp ground coriander + 1 tsp ground cumin. Blend with 3 tbsp water.
- 310 min
Sauté the spice paste in 3 tbsp coconut oil 8 min until fragrant and oil separates. Add 4 cardamom pods (crushed) + 4 cloves + 1 cinnamon stick + 3 kaffir lime leaves + 2 stalks lemongrass (smashed) + 1 star anise. Stir 2 min more.
Watch outFry the paste until the oil visibly splits back out and the raw-shallot smell is gone — that's the signal the base is cooked.
- 432 min
Add the spice mixture to the beef pot. Continue simmering 30 min — broth will deepen in flavor.
- 522 min
Add 400ml coconut milk (full-fat) + 200ml whole milk + 1 tbsp palm sugar + 1 tsp white pepper + adjust salt. Stir gently. Simmer (do not boil) 20 min more.
Watch outAdd the dairy only once the pot is off a hard boil; watch the surface tremble, never bubble, or it breaks.
- 616 min
Optional: add 100g potato cubes (peeled, 2cm); simmer 15 min until tender.
- 75 min
Remove beef + tripe + tendon; slice/chop into bite-sized pieces. Return to broth.
- 85 min
Serve: ladle broth + meat over a bowl of steamed white rice. Top with 1 chopped tomato + 1 tbsp fried shallots + 1 tbsp chopped scallion + 1 tbsp emping (melinjo crackers, crumbled) + lime wedge. Offer sambal + acar (pickled vegetables) on the side.





