Carrier Service API: How are monetary amounts represented for OMR?

Hi,

Could you clarify how monetary amounts are represented in Carrier Service API requests and responses for OMR, a currency with three decimal places?

We reproduced this with one product visible in checkout:

  • Variant price in Shopify: OMR 1.000
  • Quantity: 1
  • The product requires shipping
  • Discount: 0
  • Subtotal displayed in checkout: OMR 1.000

Here is a sanitized excerpt of the request sent to our callback:

{
  "rate": {
    "items": [
      {
        "quantity": 1,
        "price": 100,
        "requires_shipping": true
      }
    ],
    "currency": "OMR",
    "order_totals": {
      "subtotal_price": 1000,
      "total_price": 1000,
      "discount_amount": 0
    }
  }
}

For a product priced at OMR 1.000, items[0].price is 100, while both order_totals.subtotal_price and order_totals.total_price are 1000. That is an exact 10× difference. Checkout displays a subtotal of OMR 1.000.

This affects a free-shipping threshold in our app. Our current code divides order_totals.total_price by 100, which interprets 1000 as OMR 10. It therefore considers a free-shipping threshold of OMR 5 to have been exceeded and returns a zero shipping rate. After temporarily raising the threshold, the paid rate is available and checkout displays OMR 2.120 for shipping.

There is also a related question about the response. In a local reproduction, our app computes rates[].total_price = 212 for a shipping rule configured as 2.12. Checkout displays that rate as OMR 2.120. The Carrier Service API documentation describes response total_price as an amount in currency subunits, while one Omani rial contains 1,000 baisa.

Could someone from Shopify confirm:

  1. What unit is guaranteed for items[].price when the currency is OMR or another three-decimal currency?
  2. What unit is guaranteed for order_totals.subtotal_price, total_price, and discount_amount? Is their scale intentionally different from items[].price?
  3. What unit should we use for response rates[].total_price in OMR? Is 212 displaying as OMR 2.120 expected?
  4. Is the 100 versus 1000 difference in this example a known issue or part of the API contract?
  5. What is the recommended way to normalize these fields for three-decimal currencies? Does the same behavior apply to currencies such as KWD or BHD?

The documentation’s request example uses USD, where items[].price and order_totals.subtotal_price appear to use the same scale. The changelog introducing order_totals explains what the fields represent but does not specify their units for OMR. We understand that order_totals can include products absent from items; in this checkout, one product is visible and its price matches the displayed subtotal.

We have omitted the full request and checkout screenshot because they contain store and customer information. We can provide further diagnostic details through a private channel if needed.