Heat olive oil in a large pot or Dutch oven over medium heat. Add chopped white onion and cook until softened, about 5-7 minutes.
Stir in minced garlic and tomato paste, cooking for another minute until fragrant.
Add ground beef and cook, breaking it apart with a spoon, until browned. Drain any excess fat.
Stir in chili powder, ground cumin, dried oregano, smoked paprika, and cayenne pepper (if using). Cook for 1-2 minutes, stirring constantly, until fragrant.
Add crushed tomatoes, kidney beans, pinto beans, beef broth, and bay leaf. Bring to a simmer.
Reduce heat to low, cover, and let it simmer for at least 30 minutes, or up to 2 hours for deeper flavor, stirring occasionally. Remove bay leaf before serving. Serve hot with your favorite toppings!