Carrier’s official API
Old Dominion Freight Line API: integration guide
Old Dominion Freight Line (ODFL) publishes REST/JSON APIs for rate estimates, electronic bills of lading, pickup requests, shipment tracking and document retrieval. Each API has its own downloadable development guide on the ODFL Shipping API Integrations page. They are used by shippers, 3PLs and TMS vendors who want OD pricing and shipment data inside their own systems.
This guide covers Old Dominion Freight Line’s own API (api.odfl.com). Credentials come from Old Dominion Freight Line, not from FreightAPIs, and we are not affiliated with them.
Want one API key for carrier terminals, NMFC and ports instead? FreightAPIs API docs →
At a glance
| Carrier | Old Dominion Freight Line |
|---|---|
| Type | LTL carrier |
| SCAC | ODFL |
| Interface | REST/JSON |
| Authentication | Session bearer token from ODFL.com username/password (Basic auth) |
| Capabilities | Authentication, Rate estimate, Electronic BOL, Pickup requests, Shipment tracking, Documents & images |
Getting access
- Register an ODFL.com account (the "Sign Up" link on odfl.com). The username and password of that account are what you authenticate with, and they determine which account data you can see.
- There is no separate developer key in the published guides. Access to shipment data and documents follows the OD accounts your username is linked to.
- ODFL offers a QA environment for onboarding and testing. To get set up, use the "Email an Expert" option on the Shipping API Integrations page. API problems go to API@odfl.com.
- Document permissions (for example invoice or photo access) are granted per username; the guides direct you to ODFL customer service to add them.
- The guides do not mention pricing for API access.
Authentication
Session bearer token from ODFL.com username/password (Basic auth).
- Send a GET to /auth/v1.0/token with Basic authentication, using your ODFL.com username and password.
- The response contains a session token and its expiration (returned as epoch time). Tokens expire one hour after issue.
- Send the token on every API call as `Authorization: Bearer <token>`. Cache it and reuse it until it expires rather than requesting a new one per call.
- A 400 "invalid credentials" response from the token endpoint means the username or password is wrong or the account is disabled.
Environments
| Production | https://api.odfl.com |
|---|---|
| QA | https://apiq.odfl.com |
Endpoints
Authentication
Exchange ODFL.com credentials for a one-hour bearer token.
| GET | /auth/v1.0/token | Get a session token using Basic auth. |
Rate estimate
Returns rate estimates with a full charge breakdown for one or more service type and rate type combinations in a single call. The response may also include alternate rate options, service days and the origin and destination service centers. A separate reservation call returns a rate reference number when you need one.
| POST | /rating-service/v1.0/rates | Get rate estimates for the requested service and rate types. |
| POST | /rating-service/v1.0/reservation | Get a rate reference number for one service type and rate type from an earlier rate response. |
Electronic BOL
Submits an eBOL in the NMFTA Digital LTL Council format (spec version 2.1.0). You can supply your own PRO or let OD assign one, ask for the BOL and shipping labels back as base64 PDFs, then modify or delete the eBOL later.
| POST | /BOL/v3.1/eBOL/bol-external-per-standards | Create an eBOL. |
| PUT | /BOL/v3.1/eBOL/modify-bol-external-per-standards | Modify an eBOL that was submitted through create. |
| DELETE | /BOL/v3.1/eBOL/deleteBolPro | Delete the eBOL for a PRO (proNumber query parameter, no body). |
Pickup requests
Schedules a pickup that can cover several shipments from one location. OD returns one pickup number plus a pre-pro ID (PPID) for each destination; you use them to update, cancel or query the request.
| POST | /pickup/v3.0/create | Create a pickup request. |
| POST | /pickup/v3.0/update | Update an existing pickup request. |
| POST | /pickup/v3.0/cancel | Cancel a pickup request. |
| POST | /pickup/v3.0/info | Query a pickup request. |
Shipment tracking
Returns tracking events and shipment details for a single shipment, found by PRO or by another reference type. Extra fields such as account codes, appointment details and the PPID are returned only if your username is authorized for the shipment.
| POST | /tracking/v2.0/shipment.track | Track one shipment by a reference number. |
Documents & images
Returns a shipment document as base64 PDF data for a PRO, optionally split into one entry per page. Document types include BOL, delivery receipt, delivery and pickup photos, invoices, and weight and inspection certificates.
| POST | /document-retrieval-api/v1.0/getDocument | Get one document type for a PRO as PDF data. |
Example request
Use https://apiq.odfl.com with QA credentials while testing.
Integration notes
- All ODFL SOAP endpoints (tracking, BOL, pickup, labels, document retrieval, rating) retire on March 1, 2027. Build new integrations on the REST endpoints only.
- Tokens last one hour. Cache and reuse them; a 401 from a data endpoint means the token is missing or expired.
- In eBOL, bol.isTest must be false in production. Test against the QA host instead of sending isTest=true to production.
- bol.requestedPickupDate does not schedule a pickup. Call the Pickup API separately.
- The PPID (preProIdentifier) returned by the Pickup API is a second pickup reference, not a PRO. If you don't send a PRO, the driver assigns one at pickup. You can still track by PPID or pickup number (PKU).
- Country codes are three letters (USA, CAN, MEX) in both the Rate API and the eBOL, not two-letter ISO codes.
- Rate references: the rates call only returns a rate reference number when you request one service type and one rate type with referenceNumberRequested=true. Otherwise call /reservation with the rateRequestId.
- Document API: limit each PRO to 12 requests per hour or you may be throttled. Only the Invoice document can change after it is created, so don't re-pull the others. The guide suggests waiting for the matching tracking status (for example Delivered for delivery photos, Delivery Confirmed for the delivery receipt) before requesting a document.
FAQ
Does Old Dominion have a public API?
Yes. ODFL publishes REST APIs for rate estimates, eBOL, pickups, tracking and document retrieval, with development guides on its Shipping API Integrations page. You authenticate with an ODFL.com account.
How do I get access to the ODFL API?
Create an ODFL.com account, then exchange its username and password for a bearer token at /auth/v1.0/token. For QA access and onboarding help, use "Email an Expert" on the Shipping API Integrations page.
Can I track an Old Dominion shipment by BOL or PO number?
Yes. The Tracking API accepts a referenceType of PRO, BOL, PO, LOAD, PKU (pickup number) or PPID, plus the referenceNumber. It returns data for a single shipment per call.
Can I download a delivery receipt from the ODFL API?
Yes. POST to /document-retrieval-api/v1.0/getDocument with the PRO, documentType "Delivery Receipt" and format PDF. The document comes back as base64 data, as long as your username is linked to an account on the shipment.
Is the ODFL SOAP API being retired?
Yes. ODFL says its SOAP endpoints retire on March 1, 2027, and users should move to the REST endpoints before then.
On FreightAPIs
Official resources
- ODFL Shipping API Integrations: www.odfl.com/us/en/resources/shipping-api-integrations.html
- ODFL SOAP API sunset guide: www.odfl.com/us/en/resources/shipping-api-integrations/soap-api-sunset-guide.html
Written from Old Dominion Freight Line’s published API documentation and last checked 2026-10-09. FreightAPIs is not affiliated with Old Dominion Freight Line; endpoints and access rules can change, so confirm details in the carrier’s own documentation before going live.
Other carrier API guides
ABF Freight · Estes Express Lines · Saia LTL Freight · TForce Freight · XPO (LTL) · AAA Cooper Transportation · AIT Worldwide Logistics · Amazon Freight