For agents and developers
Live parcel rates, one POST away
The same engine that prices orders on this site answers plain HTTP. Describe an item in ordinary words and the packed box size and weight are estimated for you; give exact dimensions to skip the estimate. USPS, UPS and FedEx, US domestic, no account, no key. Assistants can call it natively over MCP.
One request
POST https://quote-api.smklog.com/quote
Content-Type: application/json
{"product": "acoustic guitar in a hard case",
"quantity": 1,
"from_postal_code": "07102",
"to_postal_code": "30303"}
The answer carries up to five purchasable services. Each rate states three figures separately: amount is the checkout total a customer pays, carrier_amount is the negotiated carrier cost beneath it, and service_fee is the SMKlog fee between the two. Where a carrier publishes a retail counter price, retail_amount carries it. We would rather hand you all three numbers than have you discover the middle one later.
Exact dimensions skip the estimate: send length_cm, width_cm, height_cm, weight_kg and package_source: "manual". The full contract lives in the OpenAPI 3.1 description.
MCP for assistants
Streamable HTTP endpoint at https://quote-api.smklog.com/mcp with a single tool, get_parcel_quote. Inches and pounds on the way in, because that is how people describe boxes.
{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "get_parcel_quote",
"arguments": {"product": "65 inch flat screen TV in original box",
"from_zip": "07102", "to_zip": "90011"}}}
Discovery: server card, API catalog (RFC 9727), agent skills index. In browsers with WebMCP support the same tools register on this site’s pages via navigator.modelContext, so an in-browser agent can price and track without leaving the page. A shipment past parcel limits comes back as mode: "freight_manager" with no rates; the honest next step is the freight review form, where a person prices it.
The rules, plainly
Rate limits are real
Hourly, per client, and shared between /quote and /mcp, so switching protocol does not add capacity. Every quote hits live carrier rating and costs us money: one call per shipment, cache on your side, never poll.
US domestic only
Both ZIPs must be US. International and freight requests come back unpriced by design, routed to a human review instead of a wrong number.
Pricing, not purchase
The API answers what a parcel costs. Buying the label, address validation and restricted-item screening happen at the calculator.
Questions
Do I need an account or a key?
No for normal use: quoting and payment sessions are open, rate limited per client. Credentials exist for one case — an agent whose legitimate traffic outgrows the public limits gets its own hourly bucket via OAuth client_credentials. Registration is manual for now: see smklog.com/auth.md.
What does a call cost me?
Nothing. It costs us, though: every quote hits live carrier rating, so call once per shipment, cache the answer, and never poll.
Is the price the customer's final price?
The amount field is the complete checkout total with the SMKlog fee inside, and carrier_amount states the carrier cost beneath it. Quote both to your user. Prices move with carrier tariffs, so a quote is a snapshot, not a contract.
Can an agent buy the label too?
Not autonomously. The create_checkout_link tool (MPP intent "session") prices the shipment and returns a handoff URL that opens the checkout prefilled; the human confirms the shipping consents there and pays on Stripe hosted checkout. The agent prepares, the person pays.
What happens with a pallet or a crate?
The response comes back with mode freight_manager and no rates. That is deliberate: freight is priced by a person, and the right next step is the form at smklog.com/quote.