You can start with one Experience Fragment Template and call it as CaaS API template. It will have a single container where authors can drop the components and refer content fragments. You will have to do a discovery exercise to find out how many content fragment models you need to create. As the content fragment models will be derived from the different CaaS use cases in your project.
Regarding your second question regarding using Sling models. Yes that will work as well but you should also think about using the content in wider set of applications and how you will manage it. Lets say you have a carousel component and it has a sling model exporter. And you get a use case to expose its content to an external application.
Would you expose the JSON of the carousel directly from the created page in your website? You will probably create a new experience fragment with carousel dropped in it and then share that experience fragment JSON to external application. The reason you will do it this way is because this way the end consumers like website page can have their own separate life cycles or they are decoupled from each other. It can happen that the website page is unpublished as it is not required any more on the website but the external application still wants to consume the content.
You can consider experience fragment template as an orchestration layer using which can produce different JSON outputs for different consuming applications. Suppose another application wants to consume the same carousel content but along with the carousel copy it may require another set of fields may be from another component or content fragment. In this case you can easily build a new experience fragment and create a dedicated API endpoint URL for the consuming application without affecting other applications which are only consuming the carousel copy.
Also, now suppose there is another component in your website which requires same content copy on the carousel. But that is a different component? Now how will you share the content copy and manage it in one single place. Here the content fragments can come into play as you can manage the content copy in a central content fragment and expose it to carousel component as well as another component which requires the same content.