Skip to content
KETOFOCUS.

Sweater weather calls for keto comfort food. Get Cozy →

Keto Italian Wedding Soup

Keto Italian wedding soup with tender pork meatballs, spinach, and lupini bean orzo in a rich chicken broth — 8.3g net carbs and 41.5g protein per bowl. I make it at least twice a month.
  • 8.3gnet carbs
  • 41.5gprotein
  • 50minutes
  • 4servings

This post may contain affiliate links. See my disclosure policy.

I have been making Italian wedding soup for years. Before keto, it was one of my go-to comfort meals because it freezes well and the flavor actually gets better the next day. The problem was always the orzo adding 15 to 20g of carbs per serving. My boys will eat anything if there are meatballs involved, so this has been in steady rotation since I figured out the pasta swap.

Then I found lupini bean pasta. It looks like orzo once it cooks down in the broth, and the texture is close enough that my family did not notice the swap. One serving of lupini rice has only 1g net carbs compared to 20g+ for traditional orzo. I switched over completely from shirataki noodles for soups like this because the flavor and mouthfeel are so much closer to the real thing. Shirataki works in stir fry, but in broth it just floats there and never absorbs anything. Lupini softens the way pasta should.

A ladle holding a serving of italian wedding soup with meatballs, spinach, carrot and rice pasta.

What makes this recipe low carb?

Pork panko breadcrumbs. Instead of adding traditional breadcrumbs to the meatballs, I use ground pork rinds. They work as a binding agent with zero carbs and high protein. I tested almond flour in this recipe and the meatballs came out dense and gummy after simmering in broth for 10 minutes. Pork panko absorbs moisture without that problem.

Lower carb vegetables. Spinach and celery keep the carb count down. I add a small amount of onion and carrot for flavor and color. These are slightly higher in carbs, so you can reduce them if you are tracking closely.

Lupini bean pasta. My favorite pasta swap right now. The flavor and texture are closer to traditional noodles than anything else I have tried. Lupini rice is high protein and only 1 net carb per serving. Once it cooks in the broth, it looks exactly like orzo.

One thing I started doing with this soup (borrowed from my minestrone soup) is dropping a parmesan rind into the broth while it simmers. It melts slowly and adds this deep, savory richness that you cannot get from grated parmesan alone. Fish it out before serving. For a heartier Italian one-pot meal, my Italian beef stew reheats just as well.

If you like swapping lupini into other pasta dishes, my spaghetti uses the same approach with the noodle shape instead of rice.

A bowl of meatball soup with spinach and carrot next to parsley and salt.

Why is it called 'married soup'?

Most people assume this is a soup served at Italian weddings. It is not. The name comes from “minestra maritata,” which translates to “married soup” in Italian. The “marriage” refers to the combination of meat and greens in the broth, not an actual wedding celebration. The flavors from the meatballs, vegetables, and broth are said to be married together.

Traditional versions use small meatballs (sometimes called polpettine), escarole or spinach, and a small pasta like acini di pepe or orzo. I kept that same flavor profile but swapped the high-carb ingredients. The result tastes like the original with a fraction of the carbs. If you like Italian comfort food without the carbs, my baked ziti uses the same swap philosophy.

Tips for the best meatballs in soup

The meatball mixture uses a combination of ground pork and Italian sausage. The sausage adds seasoning so you do not have to measure out a dozen individual spices. Pork panko is the binding agent instead of breadcrumbs, and it works better than almond flour here because it absorbs moisture without making the meatballs dense. I tested both side by side and the almond flour batch fell apart in the broth after 10 minutes.

Roll the meatballs to about 1 inch. If they are too large, they take over the bowl and the broth-to-meatball ratio gets off. I usually get about 24 from one batch. Brown them in a hot pan first before adding to the broth. This creates a crust that holds their shape while simmering and adds depth to the flavor. My boys will eat soup as long as there is meat in it, and these keto meatballs are the reason they ask for this on cold nights.

How to store and meal prep this soup

Store the soup and lupini rice separately. The lupini rice absorbs broth if it sits overnight, and it gets soft. I learned this the hard way after my first batch. Keep leftover rice in a sealed container in the fridge and add it to each bowl when you reheat.

The soup base (broth, meatballs, vegetables) keeps in the fridge for up to 5 days. It also freezes well for up to 3 months. To reheat from frozen, thaw overnight in the fridge and warm on the stove over medium heat. The meatballs actually taste better the next day because they absorb more flavor from the broth. This is one of the best keto soups for meal prep because the base holds up so well. If you are looking for other soups that freeze well, my turkey soup and chicken and rice soup are solid options.

What is lupini bean pasta?

Lupini beans are a legume that is naturally high in protein and very low in digestible carbs. When processed into pasta shapes, they hold their structure in hot liquid better than most low-carb pasta alternatives I have tried. One serving of lupini rice has about 1g net carbs and 11g protein. Regular orzo has around 20g of carbs per serving.

The brand I use most often is LIVIVA (sold on Amazon and some grocery stores). They make several shapes including rice (orzo), penne, and spaghetti. For this soup, the rice shape works best because it mimics the look of orzo. If you cannot find lupini pasta, cauliflower rice or hearts of palm rice are decent substitutes, though the texture is different. I also use lupini penne in my chicken noodle skillet for another way to use it.

How to Make Keto Italian Wedding Soup

Start by mixing the meatball ingredients: ground pork, Italian sausage, pork panko, parmesan, egg, and Italian seasoning. Roll them small, about 1 inch across. I have made these bigger and the ratio of broth to meatball gets off. Smaller ones give you more per spoonful and cook faster.

Brown the meatballs in a hot skillet until they have a crust on the outside. They do not need to be cooked all the way through since they finish in the broth. Remove them and saute celery, carrot, onion, and garlic in the same pan. The fond from the meatballs adds a layer of flavor to the vegetables.

Add chicken broth and bring to a boil, then reduce to a simmer. If you have a parmesan rind, drop it in now. Drop the meatballs back in and cook for about 15 minutes until they are fully cooked through. Add the lupini rice during the last 5 minutes so it softens without getting mushy.

Stir in fresh spinach right at the end. It wilts in about 30 seconds. Season with salt and pepper, and finish with a squeeze of lemon juice if you want a little brightness. If you want to make a larger batch of meatballs on their own, my skillet meatballs recipe covers that.

Discover more keto recipes on our channel Hundreds of keto recipe videos, with step by step instructions and the tips that make keto easy.
KetoFocus
The recipe

Keto Italian Wedding Soup

Print Pin
Prep 20 min Cook 30 min Total 50 min Serves 4

Ingredients

Servings 4

Keto Meatballs Ingredients

Keto Italian Wedding Soup Base Ingredients

Step by Step Instructions

  1. Meatball mixture

    Add all ingredients for the meatballs to a large bowl and mix until combined.

    For this step

    • 1/2 lb ground beef (93/7)
    • 1/2 lb ground Italian sausage
    • 1/2 cup pork panko
    • 1 large egg
    • 1/3 cup grated parmesan cheese
    • 3 cloves garlic, minced
    • 2 tablespoons finely chopped parsley
    • 1 teaspoon dried oregano
    • 1 teaspoon salt
    • 1/2 teaspoon black pepper
    A large glass bowl filled with meatball mixture ingredients like egg, parmesan cheese and beef.
  2. Form small meatballs

    Form small meatballs by scooping up 1 heaping teaspoon of the mixture and rolling it in a ball that is about ¾-1-inch in diameter. Repeat with remaining mixture. This should make around 75-80 meatballs.

    Raw meatballs on a parchment-lined baking sheet beside a teaspoon of meatball mixture.
  3. Cook the meatballs

    Pour olive oil into a large pot or Dutch oven. Heat over medium heat. When oil is hot, fry the meatballs in batches, turning to brown all sides, about 3-4 minutes per batch. Transfer to a paper towel-lined plate and repeat with remaining meatballs.

    For this step

    • 3 tablespoons olive oil
    Small meatballs seared in a Dutch oven.
  4. Cook the veggies

    To the Dutch oven, add the onion, carrot and celery. Cook, stirring occasionally, until the vegetables are slightly tender. Add the garlic, salt and pepper. Stir and cook until fragrant, about 1 minute.

    For this step

    • 1/2 medium yellow onion, chopped
    • 1 carrot, sliced
    • 3 stalks celery, sliced
    • 3 cloves garlic, minced
    • 1/2 teaspoon salt
    • 1/2 teaspoon pepper
    Carrots, celery and onion cooked in a Dutch oven.
  5. Make it a soup

    Return the meatballs to the pot and add broth. Bring to a simmer over medium-high heat. Stir in lupini rice, lower the heat to a simmer and let cook for 6-8 minutes or until rice is tender.

    For this step

    • 8 cups chicken broth
    • 1 cup lupini rice
    A Dutch oven with soup next to a bowl of lupini pasta rice.
  6. Marry the spinach with the meatballs

    Turn off the heat and stir in the spinach until wilted. Taste and season with salt and pepper if needed.

    For this step

    • 3 cups baby spinach leaves
    Spinach leaves wilting in a soup filled Dutch oven.

Nutrition

Per serving: 1 bowl

Calories
474
Fat
29.8g
Protein
41.5g
Total carbs
17.9g
Net carbs
8.3g

Nutrition is an estimate calculated from the ingredients listed. Brands vary, so check labels if you track closely.

Frequently Asked Questions

Can I use escarole instead of spinach?

I use escarole in my minestrone and it works there because it simmers for a long time and breaks down. In this recipe, I prefer spinach because it wilts in 30 seconds and keeps a cleaner texture in the broth. If you want to use escarole, chop it fine and add it about 5 minutes before the end instead of 30 seconds. The stems take longer than spinach leaves. I have made it both ways and my family prefers the spinach version, but escarole gives you a more traditional Italian flavor.

Can I make this in the Instant Pot or slow cooker?

I have made this both ways. For the Instant Pot, brown the meatballs using the saute function, add the broth and vegetables, and pressure cook on high for 8 minutes with a quick release. Add the lupini rice and spinach after releasing pressure and let them sit in the hot broth for 5 minutes. For the slow cooker, brown the meatballs on the stove first (you still need that crust), then add everything except the lupini rice and spinach. Cook on low for 4 to 5 hours. Stir in the rice and spinach during the last 10 minutes. The stovetop version gives you better meatball texture, but the slow cooker is what I use when I want it ready at dinner without babysitting a pot.

What can I serve with this soup?

I almost always serve this with bread for dipping because the broth is too good to leave in the bowl. Keto rolls or a slice of garlic bread work well. A simple side salad with an Italian vinaigrette rounds it out if you want a bigger meal. When I am meal prepping, I just eat the soup on its own since the meatballs and lupini rice make it filling enough. My usual serving is a big bowl with two rolls on the side.

Can I add an egg to the broth for extra richness?

I do this sometimes. It is called stracciatella, where you drizzle beaten egg into the simmering broth and stir gently so it forms thin ribbons. It adds protein and a silky texture. I beat one or two eggs with a tablespoon of grated parmesan, then pour it in a thin stream while stirring the broth in one direction. The trick is keeping the broth at a gentle simmer, not a rolling boil, or the egg breaks into tiny bits instead of ribbons. My kids think it looks cool, and it adds about 6g of protein per serving.

I can't have pork. What can I substitute?

I have made this with ground chicken and turkey sausage and it works well. Replace the pork sausage with ground chicken or turkey sausage, and use all ground beef for the meatball mixture. For the pork panko, substitute 1/4 cup almond flour or add an extra 1/4 cup of grated parmesan as a binder. The meatballs will be slightly less crispy on the outside but they hold together in the broth. I prefer the parmesan swap over almond flour here because almond flour gets gummy in liquid.

I can't find lupini pasta. What can I use instead?

Cauliflower rice is the closest texture match for the orzo shape. Hearts of palm rice works well too. I have also used shirataki rice (rinse it well first to remove the packaging smell), but I find it does not absorb flavor the way lupini does. You can also skip the pasta entirely. The soup is filling on its own with the meatballs and vegetables. Each substitution changes the carb count slightly, so recalculate if you are tracking closely.

Can I freeze this soup?

I freeze batches of this regularly. Store the broth, meatballs, and vegetables together in an airtight container for up to 3 months. Keep the lupini rice separate because it absorbs liquid and turns soft if frozen in the soup. When ready to eat, thaw overnight in the fridge, reheat on the stove, and add fresh lupini rice. I also freeze extra uncooked meatballs on a parchment-lined sheet pan. Once frozen, I transfer them to a bag and drop them directly into simmering broth from frozen (add about 5 extra minutes of cook time).

Where do the 8.3g net carbs come from?

The carbs come mainly from the vegetables. Onion, carrot, celery, and garlic contribute about 4 to 5g together. The lupini rice adds about 1g, and the remaining carbs come from the egg, parmesan, and seasonings in the meatballs. Spinach adds less than 1g. When I want to lower the count, I reduce the carrot and onion amounts, which drops it by about 1 to 2g per serving without losing much flavor.

Browse by ingredient
Similar recipes

People who cooked Keto Italian Wedding Soup also made

Reviews

Tap to rate

4.8 from 29 ratings, 14 written

Made this recipe?

Replying to Annie Lampella

Your rating

Priya Lee

forty-one grams of protein in soup, does the lupini orzo reheat okay?

Reply

Annie Lampella

The protein caught me off guard too when I first built the macros. The orzo reheats fine, Priya, just add a splash of broth since it soaks some up overnight.

Reply

Tanya

is it ok to sub regular panko for the pork panko?? I can’t find it at my store.

Reply

Annie Lampella

Tanya, it’ll hold the meatballs together but regular panko bumps the carbs up. I’d use almond flour instead, 1/4 cup does the same job without changing the numbers.

Reply

Sasha

Silkier broth with a parmesan rind in it.

Reply

Annie Lampella

I do this in my minestrone every time. The parmesan in the meatballs already pulls a lot into the broth as they cook, but the rind takes it somewhere else. Adding it to this one next batch.

Reply

Fatima

Half a teaspoon of fennel seeds in the meatball mix and this soup suddenly tastes like it came from an actual trattoria. Sounds redundant with Italian sausage already in there but fennel pushes everything forward differently than just using more sausage. Also, don’t skip browning the meatballs even when you’re in a rush. The fond that builds up in the Dutch oven goes straight into the broth and that’s where the depth comes from. I added a squeeze of lemon at the very end, just half of one, and it lifted the whole bowl, which sounds wrong for a heavy soup but really works. On my second batch I bumped the fennel to a full teaspoon and added a tiny bit of lemon zest to the meatball mix itself. Can’t go back to the plain version now.

Reply

Annie Lampella

Lemon zest inside the meatball is the one I’m most curious to try. Makes sense it’d carry differently than just a squeeze at the end.

Reply

Fatima

It changes the meatball itself, not just the broth. The zest kind of blooms in the fat while they brown and you get this citrus thing underneath all the sausage and herb.

Reply

Heidi Q.

Every Friday of my childhood meant Italian wedding soup from a corner spot that closed years ago. Four years keto and I figured that taste was gone for good. The sausage-beef meatballs are what got me. Something about how they hold together in the broth.

Reply

Annie Lampella

That corner spot is gone but the soup isn’t. I use pork panko and that’s what keeps the meatballs together in the broth.

Reply

Tiffany

Made this in June because my kids specifically asked for the ‘little meatball soup’ and I couldn’t say no even with the heat. My husband, who normally won’t touch anything broth-based, finished his bowl and stood over the pot quietly deciding whether there was enough left to take more. The lupini orzo was new for me and I wasn’t sure about it, but it holds its texture in broth better than regular pasta ever does.

Reply

Annie Lampella

The lupini orzo was the piece I had to get right. Regular pasta turns into soft noodles after 30 minutes in hot broth, and I wasn’t doing that to this soup. The husband hovering over the pot is the best review.

Reply

Casey

Used frozen chopped spinach instead of fresh (squeezed it out well first) and honestly it worked better. Distributed more evenly through the broth, no big wilted clumps.

Reply

Annie Lampella

Squeezing it out first is the whole trick. I’m doing frozen next batch.

Reply

Angela

The lupini orzo fooled me completely, but I’d roll the meatballs a little smaller next time, mine kept breaking apart when I went to ladle servings.

Reply

Annie Lampella

Yeah smaller helps a lot. I keep mine around 3/4 inch. Bigger than that and the pork panko can only do so much once they’ve been simmering a while.

Reply

Tyler

Small cookie scoop for the meatballs is such a good call, same size means they all finish at the same time and it cut my prep in half.

Reply

Annie Lampella

I use the medium scoop and it’s the one tool I genuinely don’t mention enough in the post. Rolling by hand you always end up with a few stragglers that overcook.

Reply

Yuki

Made this twice now and the broth is genuinely what keeps pulling me back, that richness from the parmesan and sausage fat mixing in together. The lupini orzo was a better stand-in than I expected (I went in skeptical after one bad experience with lupini pasta) and it actually holds up without going mushy. My one note: the meatball mixture as written leaned a little bland on its own. After the second batch I doubled the oregano and added a pinch of red pepper flakes, and the difference was noticeable. Nothing that stopped me from finishing the bowl the first time, but worth tweaking if you want some heat under it. Going into the regular rotation regardless.

Reply

Annie Lampella

Red pepper flakes in the meat mix rather than just relying on the broth makes sense. The base is mild on purpose since the broth carries most of the flavor, but if you want heat from inside the meatball that’s actually the smarter move. Noting this for the headnotes.

Reply

Dana

The lupini bean orzo almost talked me out of making this (keto pasta substitutes haven’t been kind to me) but it held its texture in the broth way better than expected. Rest of the soup came together fast in my Dutch oven. Already doubling the meatball batch next time.

Reply

Annie Lampella

Most keto pasta does deserve that side-eye. The lupini rice took me by surprise too when I first tested it. And yes, double the meatballs every time, I keep a batch in the freezer.

Reply

Amber

My son ate every meatball first, then drank the broth straight from the bowl. That’s the review.

Reply

Annie Lampella

Ha. That’s the correct order. The Italian sausage in the meatballs makes the broth ridiculous.

Reply

Jordan

This is probably my eighth time making it, and I think I finally figured out the meatball thing. I was rolling them too loose at first and they’d start to fall apart in the broth. Once I started packing them a little tighter, they hold up the whole way through reheating, which matters because I always make a full pot and eat it over a few days. The lupini bean orzo is still the part that surprises me every time, the texture in soup is so much closer to real orzo than I expected. Reheated a bowl this morning after a cold night and the broth had thickened up overnight in a way that made it feel even richer. This one is staying in my winter rotation for the rest of the season.

Reply

Annie Lampella

The overnight broth is the best part. I save a bowl just for the next morning. Tight pack is right, loose ones start going before the second reheat.

Reply

Hannah F.

Threw a parmesan rind in while it simmered, pulled it out at the end, and the soup was so much richer I almost don’t want to make it without one now.

Reply

Annie Lampella

Parmesan rind is one of those things that sounds fussy but isn’t. I throw one in my minestrone all the time and totally forgot to mention it here. Now I can’t skip it.

Reply

Eva

One of the best soup! Our whole family loved it!!

Reply

Annie Lampella

The meatballs are what my boys ask about. They’ll eat soup if there’s meat in it.

Reply

Keep going

More Dinner Recipes

See all 172 Dinner recipes

Get new recipes from Annie

One email a week. Unsubscribe whenever you like.