Heat the olive oil in a large Dutch oven over medium heat.
Add the onion, carrots, and celery. Cook for 8 to 10 minutes, stirring occasionally, until softened and lightly golden.
Stir in the garlic, thyme, rosemary, smoked paprika, celery seed, and black pepper. Cook for 30 seconds until fragrant.
Pour in the chicken broth and add the ham bone, bay leaf, and 1½ cups of the diced ham.
Bring the soup to a gentle simmer. Partially cover and cook for 40 minutes to allow the ham bone to flavor the broth.
Add 2 cans of the beans and continue simmering for 20 minutes.
Using a potato masher, mash some of the beans directly in the pot until the broth becomes slightly creamy. Alternatively, blend about 1 cup of the soup and return it to the pot.
Stir in the remaining can of beans and simmer for another 10 minutes.
Remove the ham bone and bay leaf. Shred any meat from the bone and return it to the soup.
Stir in the remaining diced ham, apple cider vinegar, butter, and parsley.
Taste and adjust with salt and additional black pepper as needed.
Let the soup rest for 10 minutes before serving.