For example a lot of C libs will have an API along these lines:
typedef void* my_api_t;
int create_api (my_api_t* api); // almost certainly allocates
typedef struct {
// yada yada yada
} api_result_t;
int get_result(my_api_t api, api_result_t* result); // does this allocate? I have no idea
I think every function that might block/allocate should be stupid obvious in the documentation and function naming convention, especially if you're distributing closed source libs with opaque types.