You can use an analytics conversation details query to get these.
The response fields conversationStart and conversationEnd will get you the total duration.
For the inbound number, the response contains an array of participants. You find the participant with purpose of "customer" and read the ani field of that participant within the sessions array.
For region, in my experience both the participantName and remoteNameDisplayable fields within the particpant of purpose "customer" contain the city and state of the inbound caller.
I'm not aware of a way to determine whether the inbound number is DID or toll free with the API. You may be able to parse that from the number itself, for example a toll free number starts with a 3-digit code of 800, 888, 877, 866, 855, 844 or 833.