Salut, je ne suis pas un pro, mais voici mon avis.
Déjà as-tu essayé en faisant plutôt :
API_func( (const char*) buffer );
Ensuite, je pense que la fonction s'attends juste à une chaine de caractère, le const étant la pour dire qu'elle ne la modifiera pas. Tu peux surement lui envoyer un char* déclaré sur la stack (pas en allocation dynamique, donc sans malloc)
Et pour être précis dans la description, voilà ce que je pense qu'il se passe dans ton cast, comme tu l'a écris.
0. char* buffer = malloc(100); Tu as un pointeur sur une adresse mémoire, cette adresse et ses 99 prochains octets sont réservés pour ton utilisation.
1. &buffer, c'est l'adresse de la variable te servant de pointeur, donc l'adresse de ta variable déclarée statiquement (pas dynamiquement, juste l'adresse de "buffer", et pas de ce que pointe "buffer")
2. (const char**) (&buffer), tu dis que &buffer est un pointeur pointant sur un pointeur de const char. Ce qui est vrai, mais redondant, d'où la restructuration que je te propose plus haut.