Soups & Stews
This bakso soup recipe delivers the perfect balance of crispy meatballs and aromatic broth that makes every spoonful unforgettable. The secret lies in steaming the meatballs just enough to lock in juiciness while creating that signature crackly exterior—no frying required.
I developed this version after years of perfecting the texture, ensuring the meatballs stay tender inside while achieving that addictive crunch. The broth builds flavor through slow-simmered aromatics like lemongrass, galangal, and turmeric, creating a golden, spiced liquid that's rich without being heavy.
Traditional Indonesian techniques meet modern shortcuts here: you can make the meatballs from scratch or use store-bought ones for convenience. Either way, the result is restaurant-quality soup that tastes like street food at its best.
What makes this recipe special is how the components come together—crispy meatballs floating in fragrant broth, topped with fried shallots and fresh herbs. The contrast of textures and flavors creates a dish that's both comforting and exciting.
It's the kind of soup that disappears quickly, leaving everyone asking for seconds. Perfect for weeknight dinners or weekend gatherings, this bakso soup brings a taste of Indonesia to your kitchen with minimal effort.
The instructions are straightforward, but the result is anything but ordinary—this is the kind of meal that makes cooking worthwhile.
Ingredients for bakso soup
Crispy meatballs and aromatic broth—this is where the magic happens in every spoonful.
| Ingredient | Amount | Notes |
|---|---|---|
| Ground Beef (80% lean) 🥩 | 1 lb | Finely ground for meatballs |
| Eggs 🥚 | 1 whole | Room temperature for binding |
| Shallots 🧅 | 3 whole | Finely minced for meatballs |
| Galangal Root 🌿 | ½ cup | Grated, fresh preferred |
| Turmeric Root 🌿 | ¼ cup | Grated, fresh preferred |
| Lemongrass 🌿 | 2 whole | White part only, bruised |
| Chicken Broth 💧 | 6 cups | Low-sodium preferred |
| Coconut Milk 🥥 | 1 can | Full-fat for richness |
| Soy Sauce 🍶 | 2 tbsp | Dark soy for color |
| Cornstarch 🌾 | 2 tbsp | For crispy exterior |
| Vegetable Oil 🫒 | ½ cup | For frying shallots |
| Fresh Cilantro 🌿 | ¼ cup | Chopped for garnish |
| Salt 🧂 | 1 tsp | Adjust to taste |
| Black Pepper 🌶️ | ½ tsp | Freshly ground |
The galangal and turmeric roots are absolute game-changers here—find them at an Asian market or well-stocked grocery store. If you can't locate fresh galangal, substitute ginger at half the amount, but the flavor won't be identical. For the meatballs, 80% lean ground beef gives that perfect balance of tenderness and richness. I always grab the finest grind at the butcher counter if possible—it makes a noticeable difference in texture. The lemongrass should be vibrant and fragrant; if it smells musty, it's past its prime. For the broth, low-sodium chicken broth keeps the flavors pure while letting the spices shine through.
No galangal? Ginger plus a pinch of cardamom can mimic some of its earthy notes. Running short on time? Store-bought bakso meatballs work perfectly—they're pre-seasoned and save hours. The coconut milk should be full-fat for that luxurious mouthfeel, but if you're watching calories, light coconut milk with an extra tablespoon of cornstarch helps maintain the creaminess. For the shallots, Trader Joe's frozen shallots are a lifesaver—they're pre-minced and ready to fry in seconds. Fresh cilantro is ideal, but dried cilantro at one-third the amount works in a pinch, though it lacks that bright freshness.
The meatballs keep beautifully in the fridge for 3 days, and the broth reheats like a dream—just bring it to a simmer and let the flavors meld again. For make-ahead prep, steam the meatballs ahead of time and store them separately; they crisp up perfectly when reheated in hot broth. The fried shallots stay crisp for 2 days if stored in an airtight container, but honestly, they're best used fresh. Freeze the broth without the meatballs for up to 3 months—just thaw and reheat before adding the meatballs.
Why You'll Love This Recipe
- No Fuss Mixing: I swear by the egg trick—just whisk, drop, and stir. No rolling or shaping, just blending the beef and egg until it’s ready to poach. The galangal and turmeric do all the heavy lifting for flavor, so I don’t even bother measuring precisely.
- Umami Bomb: That crispy exterior from the poaching? Absolute magic. The ground beef absorbs the shallots and galangal like a sponge, then the broth turns into this warm, aromatic hug—especially when you crack open a fresh lime on top. Honestly, I’ve made simpler soups that didn’t hit like this.
- Leftover Goldmine: This soup tastes better the next day. I’ll make a big batch on Sunday, and by Wednesday, the meatballs have softened just enough to melt in your mouth. Freeze half the broth too—just reheat and add fresh bakso when you’re ready.
- Pocketbook Hero: Ground beef and eggs? Check. Galangal and turmeric? Often cheaper than pre-made spice blends. I’ve fed four people for under $10, and no one complains about seconds. (Yes, even on a Tuesday night.)
Step-by-step instructions for bakso soup
Here's how to craft bakso soup with irresistibly crispy meatballs and aromatic broth that sings with spice.
Prepare the Meatball Mixture
In a large bowl, combine the 1 lb ground beef (80% lean) with the 1 whole egg and 1 tsp salt. Using your hands, mix gently until just combined—overworking develops gluten and makes the meatballs tough. In a separate small bowl, whisk together 2 tbsp cornstarch with 2 tbsp soy sauce and 0.5 tsp black pepper. Pour this mixture over the beef and fold until evenly distributed. The cornstarch creates that signature crispy exterior we're after.
Next, add the 3 whole shallots (finely minced) and 0.25 cup turmeric root (grated). The turmeric gives bakso its distinctive golden hue and subtle earthy flavor. Mix everything until you have a cohesive, slightly sticky dough. If it feels too dry, add 1 tsp water at a time until it holds together when pressed. Cover and refrigerate for 30 minutes—this resting period ensures the meatballs stay intact during frying.
Fry the Meatballs to Golden Perfection
Heat 0.5 cup vegetable oil in a deep skillet over medium-high heat until it shimmers but doesn't smoke. Roll the chilled meatball mixture into 1-inch spheres (about 16 meatballs total) and carefully drop them into the hot oil. Fry in batches to avoid overcrowding—this prevents the oil temperature from dropping too much. Cook for 4-5 minutes until the meatballs are deep golden brown and floating at the surface.
Here's the thing—don't rush this step. You'll know they're ready when the exterior is crispy and the internal temperature reaches 160°F. Remove the meatballs with a slotted spoon and drain on paper towels. Keep them warm in a 200°F oven while you prepare the broth. If the meatballs lose their crispiness later, simply return them to the oven for 2-3 minutes to restore that satisfying crunch.
Build the Aromatic Broth
In the same skillet (no need to clean it—the browned bits add flavor), add 0.5 cup vegetable oil and heat over medium heat. Add the 2 whole lemongrass (bruised white parts only) and 0.5 cup galangal root (grated). Sauté for 3-4 minutes until fragrant—you should smell that bright, citrusy aroma. Add 6 cups chicken broth and bring to a gentle simmer. Stir in the 1 can coconut milk and let the mixture cook uncovered for 10 minutes to allow the flavors to meld.
Season with an additional 0.5 tsp salt if needed (taste as you go—low-sodium broth means you might need to adjust). The broth should be rich but not overly salty. Keep it at a gentle simmer—boiling can break the coconut milk's delicate emulsion. Here's a pro tip: If the broth looks too thin, mix 1 tbsp cornstarch with 2 tbsp water, stir it into the broth, and simmer for another 2 minutes until slightly thickened.
Assemble and Garnish
Return the crispy meatballs to the simmering broth and let them warm through for 5 minutes. The residual heat will slightly soften the exterior while keeping the centers tender. Ladle the soup into bowls, making sure each serving gets 4 meatballs. Garnish each bowl with 1 tbsp chopped fresh cilantro—this adds a fresh, herbal contrast to the rich, spiced broth.
Serve immediately with steamed jasmine rice or crusty bread to soak up every last drop of that fragrant broth. The contrast between the crispy meatballs and the velvety coconut broth is what makes bakso soup truly special. And if you're feeling adventurous, top each bowl with a drizzle of sriracha or a sprinkle of crushed peanuts for an extra layer of texture and heat.
Pro Tips For Making Bakso Soup
- CHILL THE GROUND BEEF: I learned this the hard way—skipping this step means greasy, uneven meatballs. Pop the ground beef in the fridge for 30 minutes before shaping; it firms up just enough to hold together when you press it into balls, and the fat renders cleaner during frying.
- GRATE GALANGAL FRESH: Store-bought paste is convenient, but nothing beats the bright, peppery kick of freshly grated galangal. Use a microplane or the coarse side of a box grater—about 2 inches of root per bowl of broth—and add it to the simmering broth last to avoid bitterness. (Yes, even if you’re impatient like me.)
- DON’T OVERMIX THE BAKSO DOUGH: I used to knead the egg-beef mixture like dough for dumplings, thinking more mixing = better texture. Wrong. Gently fold the egg and ground beef together just until combined—overworking makes the meatballs dense and chewy. A few streaks of egg are fine; don’t turn it into scrambled eggs.
- SIMMER THE BROTH LOW AND LONG: High heat = cloudy, bitter broth. After the initial boil to extract flavors from shallots and spices, drop the heat to a bare simmer (tiny bubbles, not rolling) and let it cook uncovered for 20 minutes. This evaporates excess water and deepens the aroma—no skimming needed if you start with clean ingredients.
Creative variations of this dish
Street Food Style
Transform your bakso soup into a vibrant street food experience by serving it in steaming hot bowls with a side of crispy rice crackers or sambal for dipping.
I like to arrange the soup in terracotta bowls and garnish with extra fried shallots and lime wedges for that authentic Indonesian street vendor look. Add a small bowl of sweet soy sauce on the side so everyone can adjust the flavor to their taste. 🌶️
Vegetarian Twist
Swap the ground beef for a mushroom and tofu mix—use 8 oz finely chopped shiitake mushrooms and 1 block extra-firm tofu (crumbled) to mimic the meaty texture. Boost the umami with 1 tbsp soy sauce and 1 tsp miso paste in the meatball mixture.
The broth remains the same, but the meatballs get a satisfying chewiness. This version is perfect for vegetarian friends who still crave that bakso experience.
Spicy Kick
For heat lovers, stir 1 tbsp sambal olek (chili paste) or 1 tsp chili flakes into the broth while simmering. I also add 1 sliced bird's eye chili to the broth for a slow-release burn.
Garnish with extra fresh cilantro and a lime wedge to balance the heat. Serve with crushed peanuts on top for a sweet-spicy crunch that's irresistible. 🔥
Creamy Coconut Boost
Make the broth even richer by adding ½ cup coconut cream (the thick part from a can of coconut milk) to the simmering broth. This creates a velvety texture that feels luxurious. For extra depth, stir in 1 tsp pandan extract or 1 pandan leaf (bruised) while simmering.
The result is a lighter but more aromatic version that's perfect for those who love coconut flavors.
Quick Weeknight Hack
Save time by using pre-made meatballs (look for Indonesian bakso in the frozen section of Asian markets) and instant miso paste to boost the broth's depth. Simmer 1 packet miso paste with the broth for 5 minutes to add that umami punch.
This version takes under 30 minutes and still delivers that bakso magic without the fuss. Perfect for busy weeknights! ⏰
Herb-Infused Garnish
Elevate the presentation with a herb garnish blend—mix 1 tbsp chopped cilantro, 1 tsp chopped Thai basil, and ½ tsp chopped mint. Sprinkle this fresh mix over the soup just before serving.
The basil adds a bright, anise-like note, while the mint keeps it fresh. For an extra touch, drizzle with a few drops of chili oil for a smoky finish. 🌿
Nutrition facts
Frequently asked questions
Can I make bakso meatballs without cornstarch?
You can substitute cornstarch with 2 tbsp all-purpose flour or 1 tbsp potato starch for crispiness. The cornstarch creates that signature crackly texture, but these alternatives work in a pinch. Just be prepared for slightly less crunch. For extra crispiness, dip the formed meatballs in beaten egg before frying.
How do I make the broth clearer (like traditional Indonesian bakso)?
For a clearer broth, strain out the galangal and lemongrass after simmering by pressing them through a fine-mesh sieve. Use 6 cups plain chicken broth instead of coconut milk, and simmer with just 1 tsp soy sauce and ½ tsp turmeric for color. The key is simmering gently to avoid cloudiness—never boil vigorously.
Why did my meatballs turn out greasy instead of crispy?
Greasy meatballs usually happen from overcrowding the pan or frying at too low a temperature. Use medium-high heat and fry in batches—never more than 8 meatballs at a time. Also, ensure your oil is hot enough (350°F) before adding the meatballs. If they absorb too much oil, pat them dry before frying and use 1 extra tbsp cornstarch in the mixture.
Can I make bakso soup ahead of time?
Prepare the meatballs and broth separately up to 2 days ahead. Store meatballs in an airtight container in the fridge, and keep broth refrigerated in a sealed container. Reheat the broth gently, then warm the meatballs in the hot broth for 5 minutes before serving. For extra crispiness, refresh the meatballs in a dry skillet for 1 minute before adding them back to the soup.
What's the best way to store leftover bakso?
Store leftovers in an airtight container in the fridge for up to 3 days. Reheat gently on the stove with a splash of water to prevent drying. For longer storage, freeze the broth (without meatballs) for up to 3 months. To serve, thaw the broth and reheat with fresh meatballs—this preserves the crispy texture better than freezing the meatballs directly.
