I’ve tried a very simplified version of it, which works:
Poison.decode!(json_string, as: %{ "page" => %Page{} })
(With the Page module defined as you defined it above, and with json_string being the json string of your data.)
This should work for you too. I suggest you proceed from there, and see at what point that EncoderError creeps in. (For instance, quite possibly you have a typo somewhere.)


















