Soto Betawi (Jakarta coconut beef soup)

A rich, fragrant Jakartan soto where beef simmers in an aromatic broth infused with warm spices, coconut milk, and milk. Served with tomato, lime, fried shallots, and emping crackers, it is creamy, fresh, and deeply comforting.

Ingredients

  • 700 g beef stew meat such as chuck roast or chuck shoulder
  • 1.5 l water
  • 400 ml coconut milk
  • 300 ml whole milk
  • 180 g homemade Betawi spice paste
  • 6 pieces shallots
  • 4 cloves garlic
  • 35 g unsalted macadamia nuts
  • 20 g fresh ginger
  • 20 g fresh or frozen galangal
  • 10 g fresh turmeric or ground turmeric
  • 2 tsp ground coriander
  • 1 tsp ground cumin
  • 1 tsp ground white pepper
  • 4 tbsp neutral oil
  • 2 sprigs lemongrass
  • 3 leaves Indonesian bay leaves (daun salam) or bay leaves
  • 3 leaves makrut lime leaves
  • 1 piece cinnamon stick
  • 4 pieces whole cloves
  • 3 pieces green cardamom pods
  • 1 pinch ground nutmeg
  • to taste fine salt
  • 1 tsp granulated sugar
  • 500 g potatoes
  • 2 pieces ripe tomatoes
  • 2 pieces scallions
  • 30 g Asian fried shallots
  • 40 g melinjo emping crackers
  • 2 pieces limes
  • 4 tsp sambal oelek

Method

  1. Cut the beef into large, uniform pieces, cover with cold water in a stockpot, and bring gently to a simmer; skim the surface until the liquid is clear and smells clean.
  2. Add the bruised lemongrass, Indonesian bay leaves, makrut lime leaves, cinnamon stick, cloves, and cardamom pods; simmer over low heat until the beef yields slightly to the tip of a knife.
  3. Meanwhile, boil the potatoes whole or in large chunks until tender, then let cool slightly before cutting into bite-sized pieces for serving.
  4. Saute the homemade Betawi spice paste in neutral oil over medium heat, stirring until it darkens slightly, turns glossy, and releases a mellow aroma of toasted nuts, shallots, and spices.
  5. Stir the sauteed paste into the pot and continue simmering until the broth is deeply fragrant and the beef is melt-in-your-mouth tender yet intact.
  6. Remove the beef and slice into bite-sized pieces, then strain the broth if a cleaner soup is preferred; return the meat to the pot with the seasoned broth.
  7. Stir in the coconut milk and whole milk, then heat through without letting it boil vigorously; the broth should turn ivory, velvety, and lightly coat the back of a spoon.
  8. Season with salt, sugar, and ground nutmeg, adjusting until balanced, savory, gently sweet, and spiced, then keep warm over a very gentle simmer.
  9. Divide the potatoes and beef among serving bowls, ladle the piping-hot creamy broth over top, and garnish with tomato, scallions, fried shallots, emping, lime wedges, and sambal oelek right before serving.

Nutrition

Per serving

Energy
509.4 kcal
Protein
25.92 g
Carbohydrate
39.2 g
Fat
30.51 g
Fibre
11.21 g
Calcium
112.39 mg
Iron
4.29 mg
Magnesium
56.88 mg
Indicative, non-medical nutrition estimate; values depend on brands, actual weights, and whether ingredients are raw or cooked.