The easiest way we've found to do this is with a ItemSitesQueryRq. You can filter by specific site(s) or leave it blank to get the quantities on hand for all sites.
The request looks like:
<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="10.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<ItemSitesQueryRq>
<ItemSiteFilter>
<SiteFilter>
<FullName>Your Site Name Here</FullName>
</SiteFilter>
</ItemSiteFilter>
<MaxReturned>25</MaxReturned>
<ActiveStatus>All</ActiveStatus>
</ItemSitesQueryRq>
</QBXMLMsgsRq>
</QBXML>
QuickBooks qbXML example request from our QuickBooks development wiki.
And the response you get back includes elements such as:
ItemInventoryRef/ListID
ItemInventoryRef/FullName
InventorySiteRef/ListID
InventorySiteRef/FullName
ReorderLevel
QuantityOnHand
QuantityOnPurchaseOrders
QuantityOnOrder
QuantityOnSalesOrders
QuantityOnSalesOrder
QuantityToBeBuiltByPendingBuildTxns
QuantityRequiredByPendingBuildTxns
QuantityOnPendingTransfers