You can read more about conversations in the Conversations Overview. To answer your specific questions:
Who the call was from, and to (related, whether the call was inbound to or outbound)
Look at the participants. Each participant will have sessions that indicate participation in a conversation. The purpose
property tells you what the participant is (customer, user, agent, ivr, etc.). The direction
property on the session tells you if the direction of that call. For example, a participant with purpose==customer
and a session with direction==inbound
tells you that an external caller called in. The session also contains properties for the ANI and DNIS.
Who answered/placed the call
This is determined by inspecting the participants and the properties mentioned above.
The reason for the call (IVR selection)
There isn't anything OOTB on the conversation that will tell you anything about what happened in the IVR. However, you can use Architect's Set Participant Data action to set some value on the participant that you can derive some meaning from later.
Call duration, with breakdown if there are some phases that the call passes through
Call duration is derived from looking at the segment start and end times for each participant. The "phases" of the call can also be determined by looking at the participants (ivr, queues, agents, etc.).
Some information about how the call concluded – wrap up codes and notes
The agent participant will have a segment with segmentType==wrapup
with properties wrapUpCode
and wrapUpNote
.
I think my biggest issue here is that I can’t find meaningful documentation about the returned fields.
The conversations overview linked above has some overview information about conversations that may help here. Additionally, I just created API-2003 this morning to address the lack of documentation surrounding the specific parts of a conversation object and what they mean for real-world use.