Hi Eric,
If you look in the DTD for X2ML you will see the following...
@attr wire_end 1 for start, or 2 for the end of the wire
I believe that when you access IXWireEnds from an IXWire, they are ordered with the 'start' returned first. Therefore, the first IXWireEnd returned from getWireEnds will be the start (with wire_end=1) and the second will be the end (with wire_end=2).
My only slight concern is that the API documentation does not explicitly state that WireEnds are always ordered (although I believe it to be the case). If you find this is not the case, you could go via getAbstractPins because the API documentation here explicitly states:
The set is ordered and, where present, the start pin is always the first entry.
Simon