Going to the login page (via a GET request) causes the login page to load. It contains a passwordManagementForm, which has a hidden "execution" value (a large token) and a hidden "_eventId" value (set to "resetPassword") inside.
Clicking the Forgot Password button makes a POST call back to the same login page, but passes those two values along, which causes the Reset Password form to load. This form has a different "execution" value, and its "_eventId" is set to "findAccount".
Typing a username here and clicking the Submit button causes yet another POST call to the same login page to be made. This time, the new "execution", "_eventId", and "username" fields are passed along. This seems to be what causes the Reset Password email to be sent.
I could potentially have my application make all of these same calls, in the same order, passing the correct values at each step. In essence, the application would be mimicking a web browser. If this is the only approach, I can give it a try, but it feels like a bit of a hack to me. I was hoping for more of an API that my application could make a single call to.