Parts prices move. A quote that prints a number without saying when that number was confirmed is making a promise the data cannot keep. So every price in a parts response is an object, not a scalar, and the third field is the one that does the work.
{ "oem_part_number": "45022-TLA-A02", "name": "Front Brake Pads", "price": { "amount": 70.99, "msrp": 103.07, "as_of": 1787173928266 }}What each field is for
- amount is the most recent trusted market price we hold for that exact part number, as of the as_of date.
- msrp is the manufacturer's list price, which is what makes a discount legible on a quote.
- as_of is when amount was last confirmed, as a timestamp, so your own freshness rules can run on it.
Freshness is your decision, not ours
Because the date travels with the number, you can set the policy that suits your business: refuse to quote on anything older than a week, show the date next to the price, or refresh on a schedule and cache the rest. None of that requires a different endpoint or a flag, and none of it breaks when the underlying price changes.
Parts come grouped by service rather than as a flat catalogue, with the labor for that service in the same object. That is deliberate: the unit a shop quotes is a job, not a part, and a response shaped like a job is one less thing to assemble on your side.