I thought the HTTP-layer cacheability of GET requests was one of the features of a properly working web API!
My thoughts exactly. If caching breaks my API, then I probably have a design flaw.
I do agree it’s a bit hard to follow how all the caching semantics work out in practice, especially once you start stacking various headers together in one response.
Mark Nottingham (chair of the IETF HTTP working group) has a decent informational guide to HTTP caching for web developers.
Jack Archibald (Chrome developer advocate) has a good collection of best practices for difference scenarios.