One issue that I have is that it’s not easy to distinguish the limited C API from the “regular” C API. In Python 3.12, many private functions are accessible in the regular C API, whereas they are not part of the limited C API.
Do you use the internal C API on purpose, or by mistake? It’s not always obvious.
That’s why I’m working on cleaning the C API to try to more clearly separate the “clean API” aka “Limited C API” (without implementation details, portable, stable) and the “dirty API” aka “regular C API” or “internal C API” (internal C API with implementation details, structure members, private functions, no backward compatibility).
The separation between the “regular API” and the “internal C API” is blurry in CPython (code of stdlib extensions). Sometimes you can get some internal C API from a header file without knowing that it’s an internal C API.