Encontrado Swagger que, com alguns pequenos ajustes, faz tudo o que eu quero, incluindo envio de arquivos e cabeçalhos personalizados.
A única coisa que eu tive que consertar foi um pequeno bug no qual campos POST opcionais eram enviados com o valor "undefined" em vez de serem omitidos inteiramente (ou serem enviados como strings vazias).