Rinse and sort pinto beans. Soak in plenty of water for 8–12 hours or overnight. Drain and rinse before cooking.
Heat oil or bacon fat in a large heavy-bottomed pot over medium heat. Add diced onion and cook 6–8 minutes until soft and lightly golden. Add garlic and cook 30 seconds until fragrant.
Stir in cumin, smoked paprika, and chili powder. Toast the spices for 30–45 seconds to release aroma.
Add soaked beans, ham hocks, and bay leaf. Stir to coat the beans in the seasoned base.
Pour in stock or water until beans are covered by about 2 inches. Bring to a gentle boil, then reduce to a low simmer. Cover partially and cook for 2½–3 hours, stirring occasionally.
Add more liquid as needed to keep beans submerged. Beans are done when fully tender and creamy inside.
Remove ham hocks, shred the meat, discard bones and excess fat. Return meat to the pot.
Season with salt, black pepper, and apple cider vinegar. Simmer uncovered 10–15 minutes to slightly thicken the broth.
Rest off heat for 15 minutes before serving for best texture and flavor.