Let's count? I am including pokemon such as Charmander, Chimchar etc, which joined ash of their own will without battle as CAUGHT.
List of Ash's Pokemon.
Kanto and Orange Islands
- Pikachu - Given. Not caught.
- Caterpie - Caught. Released as a Butterfree.
- Pidgeotto - Caught. Left in the wild as a Pidgeot
- Bulbasaur - Caught.
- Charmander - Caught. Joined Ash of his own will. Left to train. Rejoined and with Oak now.
- Squirtle - Caught. Released back to the Squirtle Squad.
- Krabby- Caught. With Prof. Oak as a Kingler
- Raticate - Traded for Butterfree. Got back
- Haunter - Joined Ash for fun. Left for Sabrina.
- Primeape - Caught. Left for Fighting trainer.
- Muk - Caught in the power plant.
- Tauros - Caught in Safari Zone.
- Lapras - Caught. Released with family.
- Snorlax - Caught on Orange Island.
- Heracross - Caught.
- Chikorita - Caught. With Oak as a Bayleef
- Cyndaquil - Caught. With Oak as a Quilava
- Totodile - Caught
- Shiny Noctowl - Caught
- Beedrill - Caught in Bug Catching Contest. Released to Casey.
- Phanpy - Hatched.. With Oak as a Donphan
- Larvitar - Hatched. Released
Hoenn and Battle Frontier
- Tailow - Caught. With Oak as a Swellow
- Treecko - Caught. With Oak as Sceptile
- Corphish - Caught
- Torkoal - Caught
- Snorunt - Caught. With Oak as a Glailie
- Aipom - Caught. Traded to Dawn
- Starly - Caught. With Oak as a Staraptor
- Turtwig - Caught. With Oak as a Torterra
- Chimchar - Caught. With Oak as an Infernape. Left Paul to join Ash, like Charmander
- Buizel - Traded. From Dawn
- Gligar - Caught. With Oak as a Gliscor
- Gible - Caught
- Pidove - Caught. With Oak as a Unfezant
- Sewaddle - Caught. With Oak as a Leavanny
- Roggenrola - Caught. With Oak as a Boldore
- Palpitoad - Caught. With Oak
- Scraggy- hatched. With Oak
- Oshawott - Given by Juniper. With Oak
- Tepig - Another fire starter left by a trainer. Caught. With Oak as a Pignite.
- Snivy - Caught! With Oak
- Krokorok - Caught. With Oak as a Krookodile
- Froakie - Caught. Released. With Squishy and Z2
- Fletchling - Caught. With Oak as a Talonflame
- Goomy - Caught. Left in the Wetlands
- Noibat - Hatched. With Oak as a Noivern
- Hawlucha - Caught. With Oak
- Rowlet - Caught! Ash has caught his first pokemon in Alola.
- Rockruff - Caught! With Ash as Lycanroc
- Litten - Caught! With Ash.
- Poipole - Caught! With Ash.
Tl;Dr Ash has got 52 unique pokemon species. He got 2 (Pikachu, Oshawott), Traded for 2 (Raticate, Buizel), hatched 4 (Larvitar, Phanpy, Scraggy and Noibat). Also Haunter just travelled with him so not counted as catching.
Thus Ash has CAUGHT [52-(2+2+4+1) = ]43 unique species.
Edit: As requested by OP removed a quote referencing the number of pokemon dexed by Ash. Dexed pokemon are a larger set of pokemon, which include hatched, evolved and owned in any other way (Gift/Trade etc.).
Also, couldn't resist.