LIVE LTL RATES
LASF$260Quote →|SFLA$264Quote →|COLLA$366Quote →|COLCHI$193Quote →|NJMIA$288Quote →|COLSF$420Quote →|SFSAC$142Quote →|LADAL$398Quote →|LASD$156Quote →|COLMIA$303Quote →|SFSEA$235Quote →|COLDAL$208Quote →|LASLC$297Quote →|LAPHX$244Quote →|LALV$260Quote →|LAORL$437Quote →|LANJ$447Quote →|HARNJ$188Quote →|LACOL$365Quote →|CHINJ$235Quote →|DALMIA$266Quote →|SFPDX$231Quote →|COLPHX$244Quote →|NJORL$304Quote →|SFSD$208Quote →|COLORL$310Quote →|CHIMIA$295Quote →|COLDEN$275Quote →|LAMIA$420Quote →|LVLA$215Quote →|SATAUS$125Quote →|LASAC$195Quote →|LADEN$310Quote →|DALLA$385Quote →|SFPHX$280Quote →|LASEA$340Quote →|NJDAL$335Quote →|ORLMIA$145Quote →|ORLTPA$130Quote →|DALHOU$155Quote →|DALSAT$165Quote →|NJATL$270Quote →|MIANJ$305Quote →|NJCHI$240Quote →|NJLA$440Quote →|ORLJAX$140Quote →|COLSLC$320Quote →|HOUNJ$345Quote →|SLCBOI$185Quote →|LAPDX$315Quote →|LASF$260Quote →|SFLA$264Quote →|COLLA$366Quote →|COLCHI$193Quote →|NJMIA$288Quote →|COLSF$420Quote →|SFSAC$142Quote →|LADAL$398Quote →|LASD$156Quote →|COLMIA$303Quote →|SFSEA$235Quote →|COLDAL$208Quote →|LASLC$297Quote →|LAPHX$244Quote →|LALV$260Quote →|LAORL$437Quote →|LANJ$447Quote →|HARNJ$188Quote →|LACOL$365Quote →|CHINJ$235Quote →|DALMIA$266Quote →|SFPDX$231Quote →|COLPHX$244Quote →|NJORL$304Quote →|SFSD$208Quote →|COLORL$310Quote →|CHIMIA$295Quote →|COLDEN$275Quote →|LAMIA$420Quote →|LVLA$215Quote →|SATAUS$125Quote →|LASAC$195Quote →|LADEN$310Quote →|DALLA$385Quote →|SFPHX$280Quote →|LASEA$340Quote →|NJDAL$335Quote →|ORLMIA$145Quote →|ORLTPA$130Quote →|DALHOU$155Quote →|DALSAT$165Quote →|NJATL$270Quote →|MIANJ$305Quote →|NJCHI$240Quote →|NJLA$440Quote →|ORLJAX$140Quote →|COLSLC$320Quote →|HOUNJ$345Quote →|SLCBOI$185Quote →|LAPDX$315Quote →|View all rates →LASF$260Quote →|SFLA$264Quote →|COLLA$366Quote →|COLCHI$193Quote →|NJMIA$288Quote →|COLSF$420Quote →|SFSAC$142Quote →|LADAL$398Quote →|LASD$156Quote →|COLMIA$303Quote →|SFSEA$235Quote →|COLDAL$208Quote →|LASLC$297Quote →|LAPHX$244Quote →|LALV$260Quote →|LAORL$437Quote →|LANJ$447Quote →|HARNJ$188Quote →|LACOL$365Quote →|CHINJ$235Quote →|DALMIA$266Quote →|SFPDX$231Quote →|COLPHX$244Quote →|NJORL$304Quote →|SFSD$208Quote →|COLORL$310Quote →|CHIMIA$295Quote →|COLDEN$275Quote →|LAMIA$420Quote →|LVLA$215Quote →|SATAUS$125Quote →|LASAC$195Quote →|LADEN$310Quote →|DALLA$385Quote →|SFPHX$280Quote →|LASEA$340Quote →|NJDAL$335Quote →|ORLMIA$145Quote →|ORLTPA$130Quote →|DALHOU$155Quote →|DALSAT$165Quote →|NJATL$270Quote →|MIANJ$305Quote →|NJCHI$240Quote →|NJLA$440Quote →|ORLJAX$140Quote →|COLSLC$320Quote →|HOUNJ$345Quote →|SLCBOI$185Quote →|LAPDX$315Quote →|LASF$260Quote →|SFLA$264Quote →|COLLA$366Quote →|COLCHI$193Quote →|NJMIA$288Quote →|COLSF$420Quote →|SFSAC$142Quote →|LADAL$398Quote →|LASD$156Quote →|COLMIA$303Quote →|SFSEA$235Quote →|COLDAL$208Quote →|LASLC$297Quote →|LAPHX$244Quote →|LALV$260Quote →|LAORL$437Quote →|LANJ$447Quote →|HARNJ$188Quote →|LACOL$365Quote →|CHINJ$235Quote →|DALMIA$266Quote →|SFPDX$231Quote →|COLPHX$244Quote →|NJORL$304Quote →|SFSD$208Quote →|COLORL$310Quote →|CHIMIA$295Quote →|COLDEN$275Quote →|LAMIA$420Quote →|LVLA$215Quote →|SATAUS$125Quote →|LASAC$195Quote →|LADEN$310Quote →|DALLA$385Quote →|SFPHX$280Quote →|LASEA$340Quote →|NJDAL$335Quote →|ORLMIA$145Quote →|ORLTPA$130Quote →|DALHOU$155Quote →|DALSAT$165Quote →|NJATL$270Quote →|MIANJ$305Quote →|NJCHI$240Quote →|NJLA$440Quote →|ORLJAX$140Quote →|COLSLC$320Quote →|HOUNJ$345Quote →|SLCBOI$185Quote →|LAPDX$315Quote →|
$50 off·applied automatically at checkout
Tools API · Free public endpoint

Accessorial Fee API

LTL accessorial fee estimator. Pass the slugs of the accessorials a shipment will incur and (optionally) the base rate. Returns industry-standard fee ranges, invoice totals, and the percent impact on the base rate. JSON in, JSON out. CORS open. Free for 60 requests per hour without a key.

POST/api/v1/tools/accessorial
60/hrfree, no key required
CORS openbrowser, mobile, server

30-second start

POST your inputs. Get back the answer in JSON. No signup. No key required for the first 60 calls per hour per IP.

curl

curl -X POST https://www.wearewarp.com/api/v1/tools/accessorial \
  -H "Content-Type: application/json" \
  -d '{"selected":["liftgate_pickup","residential_delivery","appointment"],"base_rate":850}'

Or use GET with query params for one-liners:

curl GET

curl "https://www.wearewarp.com/api/v1/tools/accessorial?base_rate=850"

Request

POST /api/v1/tools/accessorial

Field
Type
Required
Notes
selected
string[] | csv
yes
Array of accessorial slugs in POST; comma-separated string in GET. See the slug table below.
base_rate
number
no
Base linehaul rate in USD. Adds invoice totals + percent impact to the response.

GET form (comma-separated):

curl

curl -X POST https://www.wearewarp.com/api/v1/tools/accessorial \
  -H "Content-Type: application/json" \
  -d '{"selected":"reweigh,reclassification"}'

Response

Every response has a data envelope (the computed result) and a meta envelope (rate limits, docs, upgrade path, attribution).

200 OK

{
  "data": {
    "selected": [
      { "slug": "liftgate_pickup", "name": "Liftgate Pickup", "low_usd": 75, "high_usd": 150, "description": "Required when origin lacks a loading dock" },
      { "slug": "residential_delivery", "name": "Residential Delivery", "low_usd": 75, "high_usd": 200, "description": "Delivery to a residential address" },
      { "slug": "appointment", "name": "Appointment Scheduling", "low_usd": 25, "high_usd": 75, "description": "Delivery within a specific time window" }
    ],
    "count": 3,
    "total_low_usd": 175,
    "total_high_usd": 425,
    "base_rate_usd": 850,
    "invoice_low_usd": 1025,
    "invoice_high_usd": 1275,
    "pct_of_base_low": 20.6,
    "pct_of_base_high": 50
  },
  "meta": {
    "request_id": "req_lzgk2zo_a1b2c3d4",
    "tier": "anon",
    "rate_limit": { "limit": 60, "remaining": 59, "reset_at": "2026-05-15T19:00:00.000Z" },
    "docs": "https://www.wearewarp.com/developers/tools-api/accessorial",
    "attribution": "Powered by Warp — https://www.wearewarp.com"
  }
}

Code samples

JavaScript (fetch)

const res = await fetch('https://www.wearewarp.com/api/v1/tools/accessorial', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({"selected":["liftgate_pickup","residential_delivery","appointment"],"base_rate":850}),
});
const { data, meta } = await res.json();
console.log(data.selected);

Python (requests)

import requests

res = requests.post(
    "https://www.wearewarp.com/api/v1/tools/accessorial",
    json={"selected":["liftgate_pickup","residential_delivery","appointment"],"base_rate":850},
)
data = res.json()["data"]
print(data["selected"])

curl with sandbox key

curl -X POST https://www.wearewarp.com/api/v1/tools/accessorial \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer wak_test_YOUR_KEY" \
  -d '{"selected":["liftgate_pickup","residential_delivery","appointment"],"base_rate":850}'

Rate limits and tiers

No tier blocks access. Hit the limit and the response includes an upgradeURL with the next tier's signup flow.

Tier
Key prefix
Limit (per hour)
How to get one
Anonymous
60
No signup. IP-based rate limit. Attribution requested via response meta.
Sandbox
wak_test_*
1,000
Free self-serve at /agents/account. No card required.
Live
wak_live_*
10,000
Self-serve. Adds a card so you can also book real freight at /agents/account.

Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. The meta.rate_limit object mirrors the same values in JSON.

Rate-limited response:

429 Too Many Requests

{
  "error": "Anonymous rate limit reached (60/hr). Get a free sandbox key for 1000/hr at https://www.wearewarp.com/agents/account.",
  "code": "RATE_LIMITED",
  "meta": { "tier": "anon", "rate_limit": { "limit": 60, "remaining": 0 }, "upgrade": "..." }
}

Errors

Status
Code
When
400
BAD_INPUT
Missing or invalid required field. JSON parse error.
429
RATE_LIMITED
You hit the per-hour limit for your tier. Wait or upgrade.

Bad input example:

400 Bad Request

{
  "error": "Unknown accessorial \"detention\". Valid: liftgate_pickup, liftgate_delivery, residential_delivery, inside_delivery, appointment, reweigh, reclassification, limited_access.",
  "code": "BAD_INPUT",
  "meta": { "request_id": "req_...", "docs": "https://www.wearewarp.com/developers/tools-api/accessorial" }
}

Attribution

The free tier carries an attribution request: link back to wearewarp.com from any surface that displays results from this API. A “Powered by Warp” link in your footer is enough. Live keys remove the attribution request.

Every API response includes meta.attribution so you can render the link programmatically.

Supported accessorials and how they’re calculated

  1. Liftgate Pickup / Delivery ($75-$150). Required when origin or destination has no loading dock. The carrier sends a truck with a hydraulic liftgate.
  2. Residential Delivery ($75-$200). Delivery to a residential address (not a commercial dock). Common on B2C ecommerce.
  3. Inside Delivery ($100-$250). Carrier brings freight inside the building beyond the threshold. Often required at retail stores, offices, residential.
  4. Appointment Scheduling ($25-$75). Delivery within a specific window (vs. standard "anytime during business hours").
  5. Reweigh + Reclassification ($25-$150). Carrier inspects the freight at the terminal and finds different weight or NMFC class. Triggers a back-bill.
  6. Limited Access ($75-$150). Construction site, military base, school, mine, prison, church. Anywhere a standard commercial truck can’t back up to a normal dock.

Fee ranges are industry-standard averages across the 6 largest LTL carriers. Actual fees vary by carrier, tariff version, and contract pricing. Warp ships per-pallet with most accessorials disclosed at booking (liftgate, residential, inside delivery, appointment) — no back-bills.

Related

Get a free sandbox key

Sandbox keys take 30 seconds. No card. 1,000 calls per hour across every Warp tool API.