POST /rate
Create a rate request, fetch carrier rates synchronously, and return sanitized rate responses. By default all quoted carriers are returned; use shippingType to narrow which quotes are returned.
Scope: shipments:rate
Request body
Validated by the apiRateRequest request schema.
Required top-level fields
| Field | Type | Description |
|---|---|---|
shippingOptions | object | Shipment options (see below) |
shipper | object | Origin address |
recipient | object | Destination address |
packages | object | Package details |
shippingOptions (required)
| Field | Required | Type | Notes |
|---|---|---|---|
shippingDate | Yes | string | ISO date, e.g. 2026-05-25 or 2026-05-25T14:00:00 |
shippingDateTimezone | No | string | Timezone for shipping date |
references | No | object | customer, order, invoice strings |
insurance | No | object | amount (number), currency (3-letter) |
signature | No | string | none, required, adult |
nonConveyable | No | boolean | |
createReturnLabel | No | boolean | |
saturdayDelivery | No | boolean | |
packingSlipType | No | string | |
deliveryInstructions | No | string |
Address (shipper / recipient)
| Field | Required | Type | Notes |
|---|---|---|---|
personName | Yes | string | |
addressLine1 | Yes | string | |
countryCode | Yes | string | 2-letter ISO |
provinceCode | No | string | 2–4 chars |
companyName, phoneNumber, emailAddress | No | string | |
addressLine2, city, provinceName, postalCode | No | string | |
residential | No | boolean | |
timezone, canadaPostId, id | No | string | |
type | No | string | shipping, broker, buyer |
Nested objects use additionalProperties: false where defined in the schema.
packages (required)
| Field | Required | Type | Notes |
|---|---|---|---|
unitOfMeasure | Yes | string | imperial or metric |
pieces | Yes | array | Min 1 piece |
Each piece:
| Field | Required | Type |
|---|---|---|
quantity | Yes | number (≥ 1) |
weight | Yes | number (≥ 0) |
length | Yes | number (≥ 0) |
width | Yes | number (≥ 0) |
height | Yes | number (≥ 0) |
packagingType | Conditional | string or object |
itemCount | No | number |
packagingType (per piece)
Describes the package type for carrier rating. Other carriers may ignore this field; FedEx requires it when the request can include FedEx quotes.
The public API accepts packagingType as a string or a full object. Strings are resolved to objects before schema validation (see String references below). After resolution, the same validation rules apply as for an inline object.
When required
packagingType must be present on every piece when shippingType is omitted or when shippingType.carrier is one of:
shippingType.carrier | FedEx quoted? | packagingType required? |
|---|---|---|
| (omit) | Yes (default all) | Yes |
all | Yes | Yes |
cheapest | Yes | Yes |
fastest | Yes | Yes |
federal-express | Yes | Yes |
{other carrier} | No | No |
Validation error example: packages.pieces[0].packagingType is required for FedEx.
String references
Send packagingType as a string on the rate request; the API hydrates it before validation:
| String value | Interpretation | Lookup |
|---|---|---|
Packaging type code (e.g. GENERIC_BOX, FEDEX_PAK, CP_BOX_MEDIUM) | Catalog / carrier default type | Match code in default packaging types (GET /packaging-types entries that are not company Generic boxes) |
UUID (e.g. e2aa23cd-b3cb-40fd-88d2-0c96c6b586c0) | Company custom box | Match id; must belong to your organization and have categoryName "Generic" (or be a shared default type with no companyId) |
Unknown code or id → 400 packagingType not found: {reference}.
Use GET /packaging-types to discover available code and id values.
Object shape (inline or after resolution)
| Field | Required | Type | Notes |
|---|---|---|---|
code | Yes | string | Packaging type code (see FedEx codes below) |
isEnvelope | No | boolean | true for document/envelope shipments |
name | No | string | Display name (not sent to FedEx) |
id | No | string | Packaging-type UUID |
FedEx mapping
FedEx derives a single shipment-level packaging type from all pieces. Every piece in the shipment must use the same packaging category for specialized FedEx types (envelope, pak, box, tube); mixed types fall back to YOUR_PACKAGING (customer-supplied dimensions).
packagingType.code | FedEx API value | Notes |
|---|---|---|
(any with isEnvelope: true) | FEDEX_ENVELOPE | Only when total piece count is 1 (quantity summed across pieces). Dimensions are omitted; weight is normalized to 1 lb / 0.5 kg. |
FEDEX_PAK | FEDEX_PAK | Also accepts PUROLATOR_EXPRESS_PAK, UPS_PAD_PAK, UPS_PAK when all pieces use one of these codes |
FEDEX_SMALL_BOX | FEDEX_BOX | All pieces must share this code |
FEDEX_MEDIUM_BOX | FEDEX_BOX | All pieces must share this code |
FEDEX_LARGE_BOX | FEDEX_BOX | All pieces must share this code |
FEDEX_EXTRA_LARGE_BOX | FEDEX_BOX | All pieces must share this code |
FEDEX_TUBE | FEDEX_TUBE | All pieces must share this code |
Any other code (e.g. GENERIC_BOX) | YOUR_PACKAGING | Uses length, width, height, and weight from each piece |
Practical notes
- Call GET /packaging-types for the full catalog. Use a code string for carrier/catalog types; use the
idstring for company custom boxes (categoryName"Generic"). GENERIC_BOXas a code resolves to the system default generic box. Custom company boxes share theGENERIC_BOXcode but are referenced byid.- For multi-piece shipments with FedEx-branded boxes or tubes, send the same
packagingType(code or resolved object) on each piece. - When quoting only a non-FedEx carrier (e.g.
{ "shippingType": { "carrier": "canada-post" } }),packagingTypemay be omitted.
Optional top-level fields
All optional blocks are defined in the apiRateRequest schema. The public API validates the body against that schema and passes each block through to carrier rating.
Unless noted, fields are passed through to every carrier that is quoted for the organization. Carriers ignore blocks they do not implement. Parcel examples below use FedEx and UPS Parcel.
| Field | Required for | Primary use |
|---|---|---|
internationalOptions | Cross-border customs/duties | Customs clearance, duties payer, documents-only, declared value |
freightOptions | LTL/freight carriers | Appointments, tailgate, two-person, after-hours (not parcel carriers) |
commercialInvoice | International goods (non-documents) | Line items, HS codes, customs value for rating/shipping/labels |
buyer | Some international / CI flows | Sold-to / buyer address (FedEx soldTo) |
broker | Import broker selection | Customs broker (FedEx BROKER_SELECT_OPTION) |
shippingNotificationOptions | Email on transit updates | Stored on quotation; UPS ship notification + tracker emails |
billingOptions | Third-party billing | Restrict which carrier accounts are quoted; third-party ship at label time |
shippingType | Controlling quote results (public API) | Filter bulk-rates output (default { "carrier": "all" }) |
sort | Ordering multiple rates | Control rates[] order when multiple quotations are returned |
internationalOptions
Customs and cross-border options. Most carriers only read this object when it is non-empty (FedEx builds customsClearanceDetail only if Object.keys(internationalOptions).length > 0). For international parcel rating you typically send internationalOptions together with commercialInvoice (goods) or documentsOnly: true (documents).
| Field | Type | Schema | FedEx | UPS Parcel (rate / ship) | Other carriers |
|---|---|---|---|---|---|
documentsOnly | boolean | optional | isDocumentOnly; commodities use fixed “Corporate Correspondence” lines | Rate: DocumentsOnlyIndicator + placeholder InvoiceLineTotal; ship: same + skips full commercial invoice forms | — |
declaredValue | object | optional | Not mapped directly on rate (see commercialInvoice / package declared value) | Rate & ship: InvoiceLineTotal (value + currency) when set; overrides documents-only total | — |
declaredValue.value | number | required if declaredValue present | — | Monetary value for invoice line total | — |
declaredValue.currency | string | 3-letter, required if declaredValue present | — | ISO currency on InvoiceLineTotal | — |
billDutyTo | string | sender | recipient | thirdParty | Rate: duties payment SENDER when any intl options exist. Ship/validate: SENDER, RECIPIENT, or THIRD_PARTY (+ optional account) | Not mapped on UPS rate/ship in current code | DHL, Purolator Express, FedEx Freight (export purpose), etc. |
dutyAccountNumber | string | optional | Required for meaningful THIRD_PARTY duties payor on ship | — | — |
recipientTaxId | string | optional | Not referenced in carrier mappers today; stored on rate request | — | — |
senderIsProducer | boolean | optional | Not referenced in carrier mappers today | — | — |
businessRelationship | string | related | unrelated | Not referenced in FedEx mappers | — | Purolator Express, DHL Express, FedEx Freight |
exportType | string | permanent | return | repair | returnRepair | Not referenced in FedEx parcel mappers | — | Purolator Express, DHL, FedEx Freight, generic CI PDF |
brokerRequired | boolean | optional | Not referenced in FedEx parcel mappers | — | Day & Ross Freight REST |
commercialInvoiceRequired | boolean | optional | Not referenced in carrier mappers today | — | — |
postShipmentDocumentUpload | boolean | optional | Ship/validate: ELECTRONIC_TRADE_DOCUMENTS / post-upload ETD | — | — |
requestEstimatedDutiesAndTaxes | boolean | optional | Adds FedEx edtRequestType: "ALL" on rate/ship customs block | — | — |
Practical notes
- International vs domestic: UPS treats signature differently for international (shipment-level
DeliveryConfirmation) vs domestic (package-levelDeliveryConfirmation); seeshippingOptions.signatureand UPSsignature/packagesmappers. billDutyToat rate time (FedEx): With anyinternationalOptionskeys present, FedEx rate uses dutiespaymentType: "SENDER"regardless ofbillDutyTo; full duty billing follows on ship/validate.- Schema:
internationalOptionshasadditionalProperties: false— only the fields above are accepted by the public API.
freightOptions
LTL and freight carrier accessorials. Ignored by FedEx Parcel and UPS Parcel (those carriers error on shippingOptions.nonConveyable but do not read freightOptions). Used by freight carriers such as FedEx Freight, GLS Freight, Purolator Freight, Day & Ross, Day & Ross REST.
| Field | Type | Values / shape | Carrier usage |
|---|---|---|---|
appointment | string | free text | Delivery appointment note / call-before-delivery (e.g. FedEx Freight CALL_BEFORE_DELIVERY, GLS/Purolator BOL text) |
prebookedAppointment | object | appointmentDate, appointmentTime (required) | Scheduled delivery window (FedEx Freight, GLS Freight, Day & Ross) |
pickupAppointment | object | appointmentDate, appointmentTime (required) | Pickup window (Day & Ross / Day & Ross REST) |
tailgate | string | pickup | delivery | both | Liftgate accessorials on rate/ship/BOL |
twoPersons | string | pickup | delivery | both | Two-person handling (Purolator Freight BOL, etc.) |
afterHours | string | pickup | delivery | both | After-hours pickup/delivery flags on labels/BOL |
Practical notes
- Quote freight services only when the organization’s pricing plans include freight carriers; parcel-only requests can omit
freightOptions. appointmentis often combined withshippingOptions.deliveryInstructionson label/BOL output.
commercialInvoice
Commercial invoice / customs line-item data. Schema requires at least one invoiceItems entry when the object is present. Item-level template flags (selectedTemplateId, shouldSaveAsTemplate, shouldUpdateTemplate) are accepted by validation but are not used by the public API.
| Field | Type | Schema | FedEx | UPS Parcel | Notes |
|---|---|---|---|---|---|
generalNote | string | null | max 255 | Stripped before rating | — | UI/note only for public API pipeline |
customsValue | number | ≥ 0 | Mapped via totalCustomsValue when object present | Ship: part of intl value logic when no declaredValue | Total customs value |
currency | string | 3-letter | Commodity / customs currency | Invoice forms default CAD | Required for meaningful intl quotes |
unitOfMeasure | string | imperial | metric | Commodity weight units | Invoice product weight LBS/KGS | Should align with packages.unitOfMeasure |
buyerRequired | boolean | optional | Not referenced in FedEx parcel mappers | — | Accepted by schema; not used by the public API |
invoiceItems | array | min 1 if object present | commodities (all items on rate/ship; first item only on validate) | Ship only: InternationalForms / Product list (rate does not send full CI) | See line item table below |
invoiceItems[] line
| Field | Required | FedEx commodity | UPS ship (InternationalForms) |
|---|---|---|---|
description | Yes | name, description | Description |
quantity | Yes | quantity | Unit.Number |
value | Yes | unitPrice, customsValue (× qty) | Unit.Value |
weight | Yes | weight per line | ProductWeight |
hsCode | No | harmonizedCode | CommodityCode if non-empty |
countryOfManufacture | No | countryOfManufacture | OriginCountryCode |
unitOfMeasure | No | — | — |
Practical notes
- Documents-only: Set
internationalOptions.documentsOnly: true; FedEx synthesizes commodity lines; UPS uses documents indicator —commercialInvoiceis usually omitted. - Public API vs internal app: The public schema does not include extra commercial-invoice fields some carriers use internally on ship (e.g. UPS
invoiceNumber,incoterm,freightCharges). Those are rejected byapiRateRequestvalidation (additionalProperties: falseoncommercialInvoice). - Rate vs ship (UPS): Full
InternationalFormsare built at ship time fromcommercialInvoice; rate uses totals /declaredValue/documentsOnlyonly.
buyer
Optional party address (same field shape as shipper / recipient in schema: personName, addressLine1, countryCode, etc.; type may be shipping, broker, or buyer).
| Carrier | Usage |
|---|---|
| FedEx | soldTo on the shipment via buyer address on rate, ship, and validate |
| UPS Parcel | Not mapped to a dedicated buyer block; UPS ship InternationalForms SoldTo uses recipient contact today |
| Others | Passed through on rate request; carrier-specific |
Send when FedEx or customs workflows require a distinct sold-to/importer distinct from recipient.
broker
Optional customs broker address (same address shape as buyer).
| Carrier | Usage |
|---|---|
| FedEx | customsClearanceDetail.brokers (IMPORT broker from broker address); enables BROKER_SELECT_OPTION in shipmentSpecialServices when broker is non-empty |
| UPS Parcel | Not mapped in current UPS parcel code |
| Day & Ross Freight REST | internationalOptions.brokerRequired controls broker behavior (not the broker address block alone) |
shippingNotificationOptions
Email notifications tied to the quotation. Applied asynchronously when shipment status changes (not during the synchronous rate call).
| Field | Type | Schema | Behavior |
|---|---|---|---|
shippingNotificationStatuses | string[] | pending, intransit, delivered, cancelled | UPS ship: when array includes intransit and email is set, adds UPS Notification on shipment create |
shippingNotificationEmail | string | When status becomes intransit and email is set, sends a status email |
Practical notes
- Only
intransitis wired end-to-end today for UPS ship + tracker emails. unsubscribeis not in the public API schema (additionalProperties: falseon this object).
billingOptions
Not defined in apiRateRequest schema but allowed at the root of the JSON body (root schema has no additionalProperties: false).
| Field | Type | When used |
|---|---|---|
type | string | "thirdParty" triggers third-party billing flow |
thirdPartyShipperNumber | string | Bill-to account number; must pass organization blacklist rules |
carrierCode | string | With type: "thirdParty", limits quoting to that carrier’s pricing plans |
soldTo | object (address) | UPS ship only: maps to UPS SoldTo (not validated by apiRateRequest) |
Practical notes
- Third-party rates are flagged when
type === "thirdParty"andthirdPartyShipperNumberis set. - Ship uses stored
billingOptionsfrom the rate request (public API ship does not accept billing in the body; org must be account billing). - Blacklisted third-party accounts return 400 from rate validation when not allowed.
shippingType
Controls which quote(s) the public API returns after rating. Default when omitted: { "carrier": "all" } (every successful carrier quote).
carrier value | service | Result |
|---|---|---|
| (omit) | — | Treated as { "carrier": "all" } |
all | ignored | Array of all carrier rates |
cheapest | ignored | Single cheapest rate (by lowest total price) |
fastest | ignored | Single rate with earliest commitment date/time |
{carrierCode} | omitted | Cheapest rate for that carrier only (e.g. federal-express, ups-parcel) |
| any | {serviceCode} | First rate whose service.code matches service (case-insensitive) across all carriers |
{carrierCode} | {serviceCode} | If service is set, selection is by service code only (the carrier filter is not applied) |
Valid carrier codes for filtering include those returned by GET /carriers (e.g. federal-express, ups-parcel, purolator-express, canada-post, dhl-express, canpar-express, day-ross-freight, nationex, purolator-freight, gls-parcel, gls-freight). Use GET /carrier-services for service codes.
Example — all carriers (default):
{ "shippingType": { "carrier": "all" } }
Example — cheapest FedEx service only:
{ "shippingType": { "carrier": "federal-express" } }
Example — one service by code (any carrier that returns it):
{ "shippingType": { "carrier": "ups-parcel", "service": "11" } }
Practical notes
shippingTypeaffects which quotes are returned in the synchronous rate response; it does not change per-carrier request mapping.- Internal UI/Workato may use richer
shippingTypeshapes (third_party,account_number); those are outsideapiRateRequestand are not validated on the public API unless present as extra root properties.
sort
Optional. When shippingType.carrier is "all" (the default) and multiple carrier quotations are returned, rates[] is sorted server-side before the response is sent.
Omit sort entirely to use the default: { "by": "price", "dir": "asc" } (cheapest discounted total first).
Shape:
"sort": {
"by": "price",
"dir": "asc"
}
| Field | Required | Values | Default |
|---|---|---|---|
by | Yes, when sort is provided | price, date, value | price (when sort is omitted) |
dir | No | asc, desc | asc (when by is set) |
Invalid by or dir values return 400.
What by means
by | Sorts by | asc | desc |
|---|---|---|---|
price | Discounted total (rate.totals.discounted.total.amount) | Cheapest first | Most expensive first |
date | Delivery commitment (commitment.commitDate + commitment.commitTime) | Earliest first | Latest first |
value | Savings ratio (retailTotal - discountedTotal) / retailTotal (computed server-side) | Smallest savings % first | Largest savings % first |
Rates without a commitment are placed at the end when sorting by date.
Sorting applies only when two or more rates are returned; a single rate is unchanged.
Example — fastest delivery first:
"sort": { "by": "date", "dir": "asc" }
Example — best relative deal first:
"sort": { "by": "value", "dir": "desc" }
dir may be omitted; it defaults to asc when by is set.
Related: shippingOptions (required block)
Not optional, but often used together with the fields above:
| Field | FedEx parcel | UPS parcel |
|---|---|---|
insurance | totalDeclaredValue + per-package declared value | Per-package DeclaredValue (amount split by piece count) |
signature | SIGNATURE_OPTION / DIRECT / ADULT / NO_SIGNATURE_REQUIRED | Domestic: package DeliveryConfirmation; international: shipment-level (see internationalOptions) |
saturdayDelivery | Applied when rated service includes SATURDAY_DELIVERY surcharge | — |
createReturnLabel | Ship/validate only (not rate): return shipment services | — |
nonConveyable | Rejected at FedEx/UPS rate prepare | Rejected at UPS/FedEx rate prepare |
references, deliveryInstructions, etc. | References on ship; delivery instructions on recipient address | Ship references / delivery instructions |
Example request
{
"shippingOptions": {
"shippingDate": "2026-05-25"
},
"shipper": {
"personName": "Jane Shipper",
"addressLine1": "100 Main St",
"city": "Montreal",
"provinceCode": "QC",
"postalCode": "H2X 1Y4",
"countryCode": "CA",
"phoneNumber": "5145550100"
},
"recipient": {
"personName": "John Recipient",
"addressLine1": "200 King St W",
"city": "Toronto",
"provinceCode": "ON",
"postalCode": "M5H 1J1",
"countryCode": "CA",
"phoneNumber": "4165550200"
},
"packages": {
"unitOfMeasure": "imperial",
"pieces": [
{
"quantity": 1,
"weight": 5,
"length": 10,
"width": 8,
"height": 6,
"packagingType": "GENERIC_BOX"
}
]
}
}
packagingType is included because the default shippingType (all) quotes FedEx. Omit it only when limiting the request to a single non-FedEx carrier.
Example — company custom box by id:
{
"shippingOptions": {
"shippingDate": "2026-05-25"
},
"shipper": {
"personName": "Jane Shipper",
"addressLine1": "100 Main St",
"city": "Montreal",
"provinceCode": "QC",
"postalCode": "H2X 1Y4",
"countryCode": "CA",
"phoneNumber": "5145550100"
},
"recipient": {
"personName": "John Recipient",
"addressLine1": "200 King St W",
"city": "Toronto",
"provinceCode": "ON",
"postalCode": "M5H 1J1",
"countryCode": "CA",
"phoneNumber": "4165550200"
},
"packages": {
"unitOfMeasure": "metric",
"pieces": [
{
"quantity": 1,
"weight": 2,
"length": 2,
"width": 2,
"height": 2,
"packagingType": "e2aa23cd-b3cb-40fd-88d2-0c96c6b586c0"
}
]
}
}
Use the id from GET /packaging-types for a categoryName "Generic" entry.
Example — FedEx pak only:
{
"shippingOptions": {
"shippingDate": "2026-05-25"
},
"shippingType": {
"carrier": "federal-express"
},
"shipper": {
"personName": "Jane Shipper",
"addressLine1": "100 Main St",
"city": "Montreal",
"provinceCode": "QC",
"postalCode": "H2X 1Y4",
"countryCode": "CA",
"phoneNumber": "5145550100"
},
"recipient": {
"personName": "John Recipient",
"addressLine1": "200 King St W",
"city": "Toronto",
"provinceCode": "ON",
"postalCode": "M5H 1J1",
"countryCode": "CA",
"phoneNumber": "4165550200"
},
"packages": {
"unitOfMeasure": "imperial",
"pieces": [
{
"quantity": 1,
"weight": 2,
"length": 12,
"width": 9,
"height": 1,
"packagingType": "FEDEX_PAK"
}
]
}
}
Example — inline object (unchanged):
"packagingType": {
"code": "GENERIC_BOX",
"isEnvelope": false
}
Success response (200)
Each item in rates is a sanitized rate record with non-public fields removed (see Rate response shape below). Example:
{
"data": {
"requestId": "uuid-rate-request-id",
"rates": [
{
"carrier": {
"code": "ups-parcel",
"fullName": { "en": "UPS Parcel" },
"shortName": { "en": "UPS Parcel" }
},
"service": {
"code": "CA-01",
"fullName": { "en": "UPS Express", "fr": "UPS Express" },
"shortName": { "en": "Express", "fr": "Express" },
"billingCode": "",
"chips": [],
"isDisabled": false
},
"commitment": {
"commitDate": "2026-06-03",
"commitTime": "10:30",
"timezoneCode": "UTC",
"guaranteed": true
},
"rate": {
"charges": [
{
"code": "BasePrice",
"type": "base",
"name": { "en": "Base Rate" },
"retail": { "amount": 56, "currency": "CAD" },
"account": { "amount": 55.44, "currency": "CAD" }
}
],
"totals": {
"retail": {
"subtotal": { "amount": 76.3, "currency": "CAD" },
"tax": { "amount": 2.83, "currency": "CAD" },
"total": { "amount": 79.13, "currency": "CAD" }
},
"discounted": {
"subtotal": { "amount": 72.0, "currency": "CAD" },
"tax": { "amount": 2.7, "currency": "CAD" },
"total": { "amount": 74.7, "currency": "CAD" }
},
"account": {
"subtotal": { "amount": 75.54, "currency": "CAD" },
"tax": { "amount": 2.8, "currency": "CAD" },
"total": { "amount": 78.34, "currency": "CAD" }
}
},
"fxRate": 1
},
"rateRequestId": "uuid-rate-request-id",
"rateResponseId": "uuid-use-for-ship",
"entityType": "rateResponse",
"createdDate": "2026-06-01T17:07:54.862Z",
"isBestPrice": true,
"isBestChoice": false,
"isFastDelivery": false
}
]
}
}
Notes:
ratesis built from the rating response. By default (noshippingTypein the request) the public API quotes with{ "carrier": "all" }and returns every quoted rate, each with its ownrateResponseId. Send{ "shippingType": { "carrier": "cheapest" } }to get a single cheapest rate only.- When multiple rates are returned,
rates[]is sorted server-side before the response (default: cheapest discounted total first). With default sort,rates[0]is the cheapest option when multiple carriers quote. Use optionalsortto change ordering (see above). - Each rate includes boolean badge flags (
isBestPrice,isBestChoice,isFastDelivery) as display hints. Badges are computed independently of the activesortand do not reorder the list. rateResponseIdfrom the chosen rate is required for Ship.- Tracking links are returned on Ship (
metadata.trackingUrl), not on rate items.
Badge flags
When one or more rates are returned, each rate includes:
| Field | Rule | Related sort.by |
|---|---|---|
isBestPrice | Lowest rate.totals.discounted.total.amount among returned rates | price |
isBestChoice | Highest discount ratio (retail - discounted) / retail | value |
isFastDelivery | Earliest commitment.commitDate + commitment.commitTime | date |
Rate response shape
The public API returns a subset of the full rate response document.
| Area | Removed from public API | Kept |
|---|---|---|
| Top-level | carrierAccount (includes credentials such as oauthToken), pk, sk, isThirdParty, and other non-public fields | carrier, service, commitment, rate, rateRequestId, rateResponseId, entityType, createdDate, isBestPrice, isBestChoice, isFastDelivery |
rate.charges[] | margin, discounted, percentage | chips, code, billingCode, name, type, retail, account |
rate.totals | — | retail, discounted, and account tiers (subtotal, tax, total each with amount + currency) |
rate | — | fxRate |
The discounted tier is the customer-facing price used for default sort and badge computation. Account is the negotiated carrier price. Margin details are not exposed.
Error responses
| HTTP | Condition |
|---|---|
400 | Validation failed (schema messages joined with ; ), invalid sort.by / sort.dir, unknown packagingType code/id, or organization has no userId |
401 | Missing/invalid/expired API key, wrong integration type |
403 | Missing shipments:rate scope |
422 | No rates returned for the shipment (NO_RATES) |
500 | Internal error |