The tricky was parsing the state data out of the form and the mimicking the behavour of __doPostBack function before sending the request. In my case, it also seemed to be necessary to send additional HTTP headers to make the server behave as expected. I’m not sure which ones were ultimately necessary, but I just copied the headers from Chrome dev tool and added them to each request.