I suppose this can be about compressing the data your receive. Can HTTPoison decompress it on its own? I had a quick look at documentation and didn’t find anything about that. Have you tested your code with the Content-Type header only?
I think that issue could be about Poison.decode/1? Not sure if HTTPoison uncompresses the body. If not, you need to decompress it before you parse it, because ASCII 31 isn’t a valid string character. Not sure if this is the case.
The first 32 characters in the ASCII-table are unprintable control codes and are used to control peripherals such as printers. https://www.ascii-code.com/
Then you can’t use simple Poison.decode(body) since Poison expects string whereas what you pass in is its compressed version. Try to decompress it first, sth like :zlib.gunzip(body), however first you should probably check if the response includes the following header: Content-Encoding: gzip