Dimensional weight, worked out

Five of these six cartons bill you for air at divisor 139, three of six under the USPS rule

Here is the line, and here is how to find yours. Every figure in the table below comes out of a file anyone can download without an account, and the arithmetic is written out step by step so you can run it against your own rate sheet instead of taking our word for it. The live pair further down is two dated quote requests you can send yourself in a minute.

One 12 lb item, Newark to Seattle, both cartons quoted with exact dimensions on 2026-09-02. In a 24 × 18 × 18 box the cheapest price back was $77.22. In a 16 × 16 × 16 box it was $50.11. The cheaper of those two changed carrier, so here is the version nobody can argue with: on the same carrier and the same service both times, the smaller carton came back at $51.59. Nothing was swapped to flatter the number.

The rule, once

A carrier bills the greater of two weights. One is what the box weighs on a scale. The other is what its size says it ought to weigh, and it is called dimensional weight: length × width × height in inches, divided by a divisor.

That divisor is a contract term, not physics. Two lines cover most parcels leaving a US address.

  • 139 on UPS and FedEx daily published rates.
  • 166 on USPS Ground Advantage — and only when the carton is over 1728 cubic inches, which is one cubic foot. At or under that size the scale weight stands and the dimensions are ignored outright.

A negotiated agreement can carry a different divisor, and yours is the one that bills you. Read the number off your own rate sheet before you plan against the table below. The arithmetic never changes; only what you divide by does.

Part 1: what the box weighs, and what it bills

No calls and no account for this part. These six cartons are the basket of an open price index. The August 2026 issue was captured on 2026-08-11 from one origin, 07102 in Newark, NJ, out to five US cities. The price column is the cheapest service that came back, averaged across those five lanes.

Six cartons as the open price index measured them. Issue 2026-08, captured 2026-08-11, origin 07102, five destination lanes.
CartonBoxCubic inScaleBilled at 139Billed, USPS ruleAverage cheapest
bulky24 × 18 × 18 in777612 lb56 lb47 lb over one cubic foot, size rules$57.82
heavy16 × 16 × 16 in409620 lb30 lb25 lb over one cubic foot, size rules$37.56
large18 × 14 × 12 in302410 lb22 lb19 lb over one cubic foot, size rules$27.89
medium16 × 12 × 8 in15365 lb12 lb5 lb under the floor, the scale stands$16.38
shoebox13 × 9 × 5 in5853 lb5 lb3 lb under the floor, the scale stands$11.74
small8 × 5 × 1.5 in601 lb1 lb1 lb too small to bill on size$10.43

At divisor 139, five of the six bill above what they actually weigh. Under the USPS Ground Advantage rule, three of the six do.

The gap between those counts is not the divisor. It is the 1728 cubic inch floor. The medium and shoebox cartons cross the divisor-139 line and stay under that floor, so one rule charges them for size and the other reads the scale and ignores it. Cite the first count on its own and you have overstated the problem by two cartons. Both counts, or neither.

Averages also hide the lane. The bulky carton averages $57.82 across the five destinations, and inside that average sit $43.77 to Atlanta and $73.30 to Seattle for the same box on the same day.

The repack check

Subtracting one row of that table from another is honest under one condition: the smaller carton's dimensional weight has to be greater than both cartons' scale weights. Then neither price came off a scale, both came off size, and the difference is the box and nothing else.

Passes: bulky to heavy. The 16 × 16 × 16 carton is 4096 cubic inches, which is 30 lb at divisor 139. That is above the 12 lb the bulky row carries and above the 20 lb the heavy row carries, so the scale set neither price. $57.82 − $37.56 = $20.26 per parcel, averaged over the five lanes in this issue.
Refused: bulky to medium. The 16 × 12 × 8 carton is 12 lb at divisor 139, and 12 is not greater than the 12 lb the bulky row carries. The pair sits exactly on the line. One more pound in that box and the medium carton starts billing on the scale instead of on its size, and the distance down to $16.38 stops being the carton. The rule is strict on purpose: a boundary pair is not a saving you can quote to anybody.

This is the check that separates a real repack from a marketing number. Run it before you quote a saving to anyone, including yourself.

Part 2: price your own carton at two sizes

The table above is a direction, not your price. Your lane, your item, your two candidate boxes. Two requests answer it, and this is the whole request.

POST https://quote-api.smklog.com/quote
Content-Type: application/json
User-Agent: your-tool-name/1.0

{"product": "packed carton of ceramic dinner plates",
 "quantity": 1,
 "from_postal_code": "07102",
 "to_postal_code": "98101",
 "to_country_code": "US",
 "length_cm": 60.96,
 "width_cm": 45.72,
 "height_cm": 45.72,
 "weight_kg": 5.443,
 "package_source": "manual"}

Send all four of length_cm, width_cm, height_cm and weight_kg. Those four are what decides it, and they count only as a complete set: leave one out and all four are ignored, the carton gets worked out from your words instead, and the request starts spending from a much smaller budget. With the set present, the packed-box estimate is skipped outright and neither call touches that budget at all. package_source set to manual is documented alongside them and is worth sending for clarity, but the four fields alone do the work.

Then send the same body again with the second carton's dimensions. Two notes before you read the answers. Rates do not come back cheapest first — the default order weighs speed against price — so sort on the amount yourself before you call anything cheapest. And print service_label, never the raw service field, which is an internal code no carrier sells anything under.

One 12 lb item priced in two cartons, 07102 to 98101, exact dimensions on both calls, quoted 2026-09-02.
CartonCheapest backCarrier cost inside itServiceTransit
24 × 18 × 18 in$77.22$65.44UPS Ground8 business days
16 × 16 × 16 in$50.11$42.46FedEx Ground Economy11 business days
16 × 16 × 16 in$51.59$43.72UPS Ground, the same service as row one8 business days

Cheapest to cheapest is $27.11. Same carrier and same service both times is $25.63. Publish both, in that order, or somebody will correctly point out that the larger figure came partly from changing carriers rather than from changing the box.

Both of those are checkout prices with our fee inside them, and that fee is a share of the carrier cost, so it shrinks as the box does. Underneath, the carrier cost went $65.44 to $42.46: $22.98 of the $27.11 is the carrier charging less, and the rest is our own fee getting smaller. On the same-service pair the carrier cost went $65.44 to $43.72, so that one nets $21.72. If you are planning against your own carrier account, those are your figures, and both are smaller than the checkout numbers above them. Note also that the same box on this same lane was $73.30 in the 2026-08-11 index and $77.22 here three weeks later; nothing is wrong with either number, and that drift is exactly what a monthly recapture is for.

One difference worth naming before you compare this against Part 1. Here a single 12 lb load rides through both cartons, which is what a repack actually is. In the index basket each carton is loaded to its own weight, so the 16 × 16 × 16 row there carries 20 lb rather than 12. Same two boxes, two different questions, and the cross-row check above is exactly what makes those index rows safe to subtract anyway.

Where the repack is the wrong lever

Now hold the repack up against the carrier choice, using the open file rather than a live call so you can check this one yourself. On that same 24 × 18 × 18 carton, on this same Newark-to-Seattle lane, the 2026-08-11 capture has the cheapest service at $73.30 and the dearest at $125.51: a $52.21 spread on one box, one lane, one day. That is wider than the $25.63 the repack saved and wider than the $22.98 it took off the carrier cost. On a long carton the carrier you pick moves more money than any amount of tape, and it moves more money than what we charge. Choose the service first. Shrink the box second.

The script

The whole recipe runs as one file, repack.py, Python standard library only, nothing to install. Part 1 reads the open data file and prints the table above. Part 3 runs the check and prints both a pair it accepts and a pair it refuses. Part 2 sends the two requests, and --dry-run prints both bodies without sending anything.

Get it: repack.py — one file, no dependencies, CC BY 4.0 like the data. Save it wherever you run things and the three commands below work exactly as printed.

python3 repack.py

python3 repack.py --box 24x18x18 --into 16x16x16 --weight 12 --to 98101

python3 repack.py --box 24x18x18 --into 16x16x16 --weight 12 --to 98101 --dry-run

Every number it prints is derived in front of you, and the refused pair is printed on purpose: a tool that only ever agrees with you is not a check.

When you do not have the box yet

Sometimes there is no carton to measure, only a thing on a shelf. Describe it in ordinary words — a Yamaha FG800 acoustic guitar in a hard case — and a packed carton is worked out for you, then priced. That is the case this endpoint exists for: a rate form wants length, width, height and weight before it will say anything, which is unhelpful precisely when the box is the thing you are trying to decide on. Said plainly the other way round: if the carton is already in front of you and all you want is a label, free label tools exist that do exactly that job, and you should use one. This page is not asking you to move.

Two caveats, said plainly. That path is capped far tighter than an ordinary quote, and it is slower, because the carton has to be settled before any carrier is asked for a price. If you already know your dimensions, send them and skip all of it. The estimate is for the case where you genuinely do not know, not a shortcut for the case where you do.

The limits, as the code counts them

80 quote calls an hour

Counted per client and shared between the plain endpoint and the assistant endpoint, so switching protocol adds no capacity. Every quote reaches live carrier rating and costs us money. Ask once per shipment and cache the answer.

16 an hour without dimensions

A request that omits the box spends from a second, much smaller budget. That token is taken before the catalog is read and before the cache is consulted, so asking for the same item twice costs two of them. Sixteen dimensionless quotes, not sixteen different items.

Past the box-estimate budget

You still get rates. What you lose is the carton fitted to your item: the box falls back to a category average, and the price is then only as good as that average. Nothing errors, so watch for it rather than waiting to be told.

How to read the four figures in a rate

Every rate carries its money broken apart, on purpose. Four fields, and they are not interchangeable.

  • amount — the checkout total, everything inside it. This is what a customer pays here.
  • carrier_amount — the carrier cost sitting underneath that total.
  • service_fee — ours, the difference between the two.
  • retail_amount — the carrier's own published counter price. It is always in the response and it is 0 when the carrier publishes none, so test for 0 rather than for a missing key. Zero there means unpublished, not free.

If you are building a comparison and you intend to buy the label somewhere else entirely, plan against carrier_amount. That is the figure your own account would be charged, and it is the fair thing to hold up next to a rate from anywhere else. Comparing our amount against somebody else's carrier cost puts two different things side by side and flatters whichever side you happened to pick. We would rather hand you the number that makes us look worse than have you find it later and stop believing the other three.

Why a request comes back with no rates

Once a request is accepted, every no-rates outcome answers HTTP 200 with an empty rates array and a mode field. Input the endpoint rejects outright — a bad ZIP, a missing field, an item description it cannot read as a product — answers 400 with an error field instead, and a product URL it cannot read answers 422. So check the status first, then branch on mode: a 200 with no rates is the interesting case, and these are the four to handle by name.

  • freight_manager — past parcel limits. A person prices it, and no carrier was called.
  • parcel_restricted — the item cannot travel as a parcel at all.
  • international_unsupported_online — that destination country is not priced without a person.
  • parcel_rates_unavailable — the carriers were asked and returned nothing for that box on that lane.

Two traps nobody guesses. A quantity of 2 or more comes back with no rates before any carrier is contacted — one label per request, so loop rather than multiply. And freight wording inside the item description routes the whole request to a person even when the dimensions you sent are plainly parcel sized. Describe the item, not how you imagine it travels.

Get the data

Every price in the Part 1 table and every price in the carrier-spread paragraph above, one row per quote: parcel-price-index.csv. Columns are issue, capture date, carton, box size, weight, origin ZIP and city, destination ZIP and city, carrier, service, customer price, carrier counter price where the carrier publishes one, and transit business days — fourteen in all. Released under Creative Commons Attribution 4.0: use it, chart it, argue with it, with a link back.

The two live quotes in Part 2 are not in the file. They were sent on 2026-09-02, outside the monthly basket, so nothing in the file will match $77.22 or $50.11. Rerun them yourself with the script; that is precisely what it is for.

Cite as: SMKlog Parcel Price Index, August 2026 issue, captured 2026-08-11. https://smklog.com/lp/parcel-price-index — prices are the whole amount a customer pays at checkout on the capture date, and the carrier counter price column is the carrier's own published retail figure on the same date.

Send a User-Agent request header. The default one urllib sets in Python is refused with HTTP 403 by the file host and by the quote endpoint both. That refusal reads exactly like an outage if you are not expecting it, and it is the single most likely reason a fresh script of yours fails on the first run.

The honest limit of this data: one origin, six cartons, five destinations. It gives a seller on the West Coast the shape of the rule, not their own prices, and the shape is what transfers. The file also carries only the July and August issues today, so a newer issue shown on the index page may not have reached the file yet.

One line of plumbing, and then the questions: if you do end up buying the label here, the quote you just priced hands off to a checkout page that a person confirms and pays on. That is the only thing on this page that costs anything, and it is not what the page is for.

Questions

Which divisor does my carrier use?

139 on UPS and FedEx daily published rates, and 166 on USPS Ground Advantage. The 166 line has a second half people forget: it applies only above 1728 cubic inches. A negotiated agreement can name a different divisor, and yours is the one that bills you, so read it off your own rate sheet before planning against this page.

Does a smaller box always cost less?

No. A smaller box only saves money while it still bills on its size. Once the carton's dimensional weight falls below what the item actually weighs, the price follows the scale, and shrinking the box further changes nothing at all. That is the whole reason the check on this page exists.

Why print two counts instead of one?

Because the divisor is not the entire rule. At divisor 139, five of the six cartons bill above what they weigh. Under the USPS Ground Advantage rule, three of the six do, because that rule ignores size at or under 1728 cubic inches. Quoting the first count alone overstates the problem by two cartons.

Do I need an account or a key to run this?

No. The price index file and the quote endpoint are both open. One thing will bite you: send a User-Agent request header. The default header Python's urllib sets is refused with HTTP 403 by both hosts, and that refusal reads like an outage if you are not expecting it.

The response came back with no rates. Is it broken?

Probably not. Once a request is accepted, every no-rates outcome answers HTTP 200 with an empty rates array and a mode field that says why, so read mode rather than the status code for those. Input the endpoint rejects outright, such as a bad ZIP or a missing field, answers 400 with an error field instead, so check the status first. A quantity of 2 or more comes back empty before any carrier is called, and freight wording in the item description routes the request to a person.