Are you using event socket to send an originate? Or are you using fs_cli -x? Also, are you ignoring early media? Those are all factors in the method you choose, however if you want to make absolutely certain that you know what happened to a call then listen for CHANNEL_HANGUP_COMPLETE events. You'll have a header like this:
Hangup-Cause: NO_ANSWER
If you are looking at XML CDRs then you can apply some logic. Look for sip_hangup_disposition of "send_cancel" and that tells you that FreeSWITCH sent a cancel, possibly because the far end did not answer. Also, the answer_epoch is 0 so you know that the call was not answered, but you don't necessarily know why. However, you can subtract the progress_epoch from the end_epoch and find out how many seconds the call was ringing. You'll have to determine the number of seconds of ringing that constitutes a "no answer" but that's probably the easy part.