Obrigado, isso resolveu! Não, como a documentação da API não listava archetype como obrigatório (nem mesmo “obrigatório para mensagens privadas” da mesma forma que target_usernames) e não dizia nada sobre sua finalidade, eu não mexia nele.
De qualquer forma, isso agora funciona. Para referência de quem encontrar o mesmo problema (especialmente ao usar POST), os elementos do corpo codificados em JSON na minha requisição funcional são:
| key | value |
|---|---|
| raw | o texto bruto da mensagem |
| title | o título da mensagem/thread |
| target_usernames | lista de nomes de usuário separada por vírgulas |
| archetype | a string literal private_message |
Isso é enviado como corpo de um POST para /posts.json com os campos de cabeçalho personalizados:
| key | value |
|---|---|
| Content-Type | application/json; charset=UTF-8 |
| Api-Key | dados da chave |
| Api-Username | o nome de usuário |