Indonesian Cuisine
Soto Betawi
Jakarta's creamy beef and offal soup simmered in coconut milk and fresh milk with lemongrass, galangal, and candlenuts, served with fried potatoes and emping crackers
Soto betawi is the signature soup of Jakarta, named after the Betawi people, the indigenous ethnic group of the city. It is unlike most other Indonesian soto, which tend toward clear, turmeric-tinted broths. Here the broth is pale and creamy, enriched with both coconut milk and fresh cow's milk, a combination that gives it a richness that sits somewhere between a Southeast Asian curry and a European cream soup. The effect is gentle and rounded rather than heavy, because the aromatics do their work: lemongrass, galangal, kaffir lime leaves, and a spice paste built on candlenuts and shallots keep the richness in check.
The use of fresh milk alongside coconut milk points to the multicultural history of Betawi cuisine. Historians note that soto betawi also traditionally calls for ghee (minyak samin), reflecting Arab and Indian Muslim influence on Jakarta's food culture, which developed at the crossroads of the spice trade. Offal, specifically honeycomb tripe, is as traditional as the beef itself. The tripe adds a second texture to the bowl, soft and slightly chewy against the tender shank, and it absorbs the creamy broth beautifully.
Soto betawi belongs to a broad family of spice-paste-driven meat soups found across Indonesia and Southeast Asia. It shares a table with Rawon, the jet-black beef soup of East Java, and Soto Ayam, the turmeric chicken broth found everywhere from Surabaya to Solo. Further afield, it echoes the slow-simmered patience of Pho Bo and the herbal peppery warmth of Bak Kut Teh. For those who enjoy rich, spiced broths built on lamb rather than beef, Sup Kambing is a natural companion, and the deep, aromatic beef stew Bo Kho from Vietnam works the same slow magic with a different set of spices.
At a Glance
Yield
8 servings
Prep
30 minutes
Cook
2 hours 30 minutes
Total
3 hours
Difficulty
Medium
Ingredients
- 3½ ozshallots (about 6 to 8 medium), peeled and roughly chopped
- 4 clovesgarlic, peeled and roughly chopped
- 5candlenuts (kemiri), roughly chopped (or substitute macadamia nuts)
- —2.5 cm fresh ginger, peeled and chopped
- 5 cmfresh galangal, peeled and chopped
- 2¼ lbbeef shank (daging sengkel), in one or two large pieces
- 1 lbhoneycomb tripe (babat sapi), cleaned and rinsed
- 5 stalkslemongrass, bruised with the back of a knife and tied into knots
- 3Indonesian bay leaves (daun salam), or substitute regular bay leaves
- 5kaffir lime leaves, central vein removed, leaves torn
- 1 qtfresh whole milk
- 1 qtwater
- 2⅛ cupcoconut milk
- 1 tbspneutral oil (such as vegetable or coconut oil)
- 2½ tspsalt (about 1 tablespoon), adjusted to taste
- 2⅛ tspwhite pepper (about 1 teaspoon)
- 2medium potatoes (about 300 g), peeled, cut into 1 cm cubes, and deep-fried until golden
- 2medium tomatoes, cut into 1 cm cubes
- 2scallions, thinly sliced
- 1 ozfried shallots (bawang goreng)
- —Emping crackers (melinjo crackers)
- 3limes, cut into wedges
- —Kecap manis (sweet soy sauce)
- —Steamed white rice
- —Acar (Indonesian pickle), optional
Method
- 1
Bring a large pot of water to a boil and blanch the beef shank and honeycomb tripe for 3 to 4 minutes. Grey foam and impurities will rise to the surface. Drain, rinse both under cool water, and set aside. This step gives you a cleaner broth from the start.
- 2
Combine all spice paste ingredients in a blender or food processor: the shallots, garlic, candlenuts, ginger, and galangal. Add 30 to 45 ml of water to help the blades catch. Blend to a smooth paste, scraping down the sides as needed. The paste should be pale and fragrant, with no large chunks remaining.
- 3
Heat the oil in a large heavy-bottomed pot or Dutch oven over medium heat. Add the spice paste and fry, stirring constantly to prevent sticking, until the raw, sharp smell fades and the paste turns golden and aromatic, about 5 to 7 minutes. You will notice the oil beginning to separate from the solids. The kitchen should smell of roasted candlenuts and ginger.
- 4
Add the blanched beef shank, tripe, lemongrass knots, and Indonesian bay leaves to the pot. Pour in the fresh milk and water. Stir to combine. Raise the heat to medium-high and bring to a boil, then immediately reduce to a low, gentle simmer. Cover with the lid slightly ajar and cook for about 2 hours, checking occasionally. The beef is ready when it yields easily to a fork, and the tripe should be tender with a slight chew.
- 5
Remove the beef and tripe from the broth and transfer to a cutting board. Let them cool until comfortable to handle, about 10 minutes. Cut the beef into 1.5 cm cubes and the tripe into bite-sized pieces, roughly the same size.
- 6
If you prefer a cleaner-looking broth, strain the soup through a fine mesh strainer, pressing gently on the solids, then return the strained liquid to the pot. This is optional but gives a smoother result.
- 7
Return the cubed beef and tripe to the pot. Pour in the coconut milk. Add the salt and white pepper. Bring back to a gentle simmer over medium-low heat and cook for another 20 to 30 minutes, stirring occasionally so the coconut milk does not scorch on the bottom. The broth should be creamy and pale, with a subtle sweetness from the milk and coconut.
- 8
Turn off the heat. Remove and discard the lemongrass stalks and bay leaves. Stir in the torn kaffir lime leaves. Taste and adjust salt if needed. The broth should be rich but not heavy, with a clear lemongrass and galangal fragrance behind the creaminess.
- 9
Ladle the soup into deep bowls, making sure each serving gets a generous mix of beef and tripe. Top with fried potato cubes, diced tomato, sliced scallions, and a scattering of fried shallots. Tuck a few emping crackers alongside. Serve with lime wedges, kecap manis, steamed rice, and acar on the table for each person to season as they like. A squeeze of lime and a drizzle of kecap manis over the top is traditional and transforms the bowl.
Key Ingredient Benefits
Honeycomb tripe (babat sapi): The lining of the second stomach chamber of cattle, named for its distinctive honeycomb pattern. Tripe is traditional in soto betawi and adds a unique chewy-tender texture. It is high in protein and collagen while being relatively low in fat. Tripe requires thorough cleaning before cooking. Most tripe sold at butcher shops and Asian grocery stores has been pre-cleaned and partially cooked (blanched or bleached), which shortens the cooking time considerably. If using unprocessed tripe, soak in salted water and scrub well before blanching.
Candlenuts (kemiri): A staple thickener in Indonesian spice pastes. These waxy, cream-colored nuts add body and a subtle, slightly bitter richness. They are mildly toxic when raw due to saponins and phorbol esters, so they must always be cooked. Macadamia nuts are the closest substitute, providing similar fat content and texture. Raw cashews also work in a pinch, though the flavor is sweeter.
Indonesian bay leaves (daun salam): These are not the same as European bay laurel. Daun salam (Syzygium polyanthum) has a milder, more subtle flavor with faint cinnamon-like notes. If unavailable, regular bay leaves can be used, but reduce the quantity by one leaf as they are more assertive. Some cooks add a small piece of cinnamon stick to approximate the daun salam character.
Emping crackers: Crackers made from flattened melinjo (Gnetum gnemon) seeds. They have a distinctive slightly bitter, nutty flavor that pairs particularly well with rich, creamy soups like soto betawi. If unavailable, prawn crackers (kerupuk udang) make a reasonable substitute, though they lack the characteristic bitterness.
Kecap manis: Indonesian sweet soy sauce, thick and syrupy with palm sugar. Adding a drizzle at the table is traditional and introduces a sweet-salty counterpoint that balances the rich broth and the acidity of the lime.
Why This Works
The dual-milk broth is what sets soto betawi apart from every other Indonesian soto. Fresh cow's milk provides lactose, proteins (casein and whey), and milkfat, which together create a smooth, rounded body. Coconut milk adds its own fat profile, rich in lauric acid and other medium-chain triglycerides, along with a gentle sweetness. When the two are combined and simmered, they create a broth with more textural complexity than either could alone. The fresh milk provides lightness; the coconut milk provides richness and a faintly sweet, tropical undertone.
Frying the spice paste before building the soup is the same foundational technique used in Rawon and nearly every other Indonesian bumbu-based dish. The heat drives off moisture from the shallots and garlic, triggering Maillard browning and caramelization that develop savory, sweet depth. The candlenuts, high in oil, toast gently during this step and release their fat into the paste, helping to carry the flavor compounds of the ginger and galangal into the broth more efficiently.
Adding the kaffir lime leaves at the end, after the heat is off, preserves their volatile aromatic compounds. The essential oils in kaffir lime leaves are delicate and dissipate quickly with prolonged cooking. Stirring them in at the final stage means their bright, citrusy fragrance hits you the moment the bowl is served, providing a top note that lifts the richness of the broth.
Blanching the beef and tripe before the main cook removes surface proteins and blood that would otherwise cloud the broth and contribute off-flavors. This is a standard technique in Chinese and Southeast Asian soup-making, and it is especially important here where the broth's pale, clean color is part of the dish's identity.
Substitutions & Variations
Tripe: If tripe is not to your taste or unavailable, replace it with an equal weight of additional beef shank or with beef tendon. Tendon provides a similarly gelatinous texture and absorbs the broth well, though it may require an extra 30 minutes of simmering.
Beef cut: Shank is ideal because it becomes tender while retaining structure, and its connective tissue enriches the broth with gelatin. Brisket, chuck, or short ribs all work. Oxtail makes a luxurious variation but needs closer to 3 hours of cooking.
Fresh milk: Full-fat milk is traditional. You can use evaporated milk (susu kental) diluted with an equal part of water for a slightly richer, more caramelized flavor, which some Jakarta warung prefer. Do not use skim milk, as the fat is essential to the broth's body.
Coconut milk: Full-fat canned coconut milk works well. Shake the can before opening. For a lighter version, reduce the coconut milk to 250 ml and increase the water by the same amount.
Pressure cooker method: After frying the spice paste and combining all soup ingredients (except coconut milk), cook on high pressure for 30 minutes with natural release. Remove the meat, cut into cubes, return to the pot, add coconut milk, and simmer uncovered for 15 minutes.
Slow cooker method: Fry the spice paste on the stove, then transfer everything (except coconut milk) to a slow cooker. Cook on low for 6 to 8 hours. Add coconut milk in the last 30 minutes and switch to high.
Without offal (soto betawi daging): Use 1.5 kg of beef shank alone. The soup will still be rich and satisfying, just without the textural contrast of tripe.
Richer version: Some Betawi cooks add 15 ml of ghee (minyak samin) when frying the spice paste. This nods to the Arab-influenced roots of the dish and adds another layer of richness.
Serving Suggestions
Soto betawi is always served with steamed white rice, either in the same bowl with the broth ladled over, or on a separate plate for dipping. The fried potato cubes are essential, adding golden crunch that softens slowly in the creamy broth. Emping crackers provide a contrasting bitter note that cuts through the richness. A squeeze of lime and a drizzle of kecap manis at the table are not garnishes so much as the final seasoning, and each person adjusts both to their preference.
For a fuller Jakarta-style spread, serve soto betawi alongside Nasi Uduk, the coconut rice that is itself a Betawi staple. The two belong together on the same table. Acar, the quick Indonesian pickle of cucumber, carrot, and shallot in sweet vinegar, adds a sharp, refreshing counterpoint. Sambal, whether a simple crushed chili sambal or a more complex sambal terasi, is welcome for those who want heat.
Soto betawi also fits naturally into a broader Indonesian soup spread. Set it beside Rawon for a dramatic contrast of light and dark, creamy and earthy. Or pair it with Sayur Asem, the tart tamarind vegetable soup, for a balance of richness and brightness.
Storage & Reheating
Broth and meat: Store in an airtight container in the refrigerator for up to 3 days. The coconut milk in the broth means it does not keep quite as long as clear-broth soups. The fat will solidify on the surface when chilled; this is normal and will melt back into the broth when reheated. Warm gently over medium-low heat, stirring occasionally. Do not boil vigorously, as this can cause the coconut milk to separate and the broth to look grainy.
Freezing: The soup freezes well for up to 2 months. Cool completely, then transfer to freezer-safe containers with 2 cm of headspace. Thaw overnight in the refrigerator. When reheating from frozen, warm slowly over low heat, stirring frequently, to prevent the milk and coconut from breaking.
Garnishes: Fried potatoes, tomatoes, scallions, and fried shallots should all be prepared fresh each time you serve. Fried potatoes lose their crunch within an hour. Fried shallots can be stored in an airtight container at room temperature for up to 3 days but are best fresh. Emping crackers keep in a sealed bag at room temperature for several weeks.
Rice: Store and reheat rice separately. Refrigerated cooked rice keeps for up to 2 days. Sprinkle with a little water, cover, and microwave in 30-second intervals, or re-steam for 5 minutes.
Batch cooking: Soto betawi is well suited to making ahead. The flavor deepens overnight. Prepare a double batch of the broth and meat, freeze in portions, and fry the potatoes and prepare the fresh garnishes only when ready to serve.
Nutrition Facts
Calories: 630kcal (32%)|Total Carbohydrates: 15g (5%)|Protein: 33g (66%)|Total Fat: 43g (55%)|Saturated Fat: 19g (95%)|Cholesterol: 120mg (40%)|Sodium: 750mg (33%)|Dietary Fiber: 1g (4%)|Total Sugars: 6g
You Might Also Like
Ratings & Comments
Ratings & Comments
Ratings
Share your thoughts on this recipe.
Sign in to rate and comment

