How many transients is too many transients

It depends if you add an expiration time. If you do not add an expiration time then autoload will be yes. This means the option that stores this transient will be loaded on every request even if it’s not used. With large numbers of transients this poses an issue purely in terms of memory.

I would recommend installing an external object cache if you haven’t, as it will make transients both more efficient, and significantly faster ( as well as most of WordPress ).

If not, then a dedicated table may be better given the length of time your transients will stick around, but a large number of transients shouldn’t cause major issues if they have expiration dates.

It may actually be more efficient to implement caching on the API with the expensive endpoints rather than in the consuming WordPress install. You should contact their maintainers.