Thank you for taking the time to read our documentation for Liminal Network's API. We hope that you find our API to be easy-to-use in whatever language or library you are connecting with. Our goal is to make our products some of the easiest apis you've ever implemented.
Topics:
Liminal Network's proprietary product connects you directly with your carriers. Updates depend on the carrier's technology, and update frequency can be anywhere from near-real-time to daily.
Liminal Network currently supports four major APIs:
Get Delivery Status returns a shipment's current status as provided by the carrier. Common statuses include "In Transit", "Out for Delivery", "Images Available", "Images Complete", or "Delivered".
Get Expected Delivery Date returns a shipment's expected or actual delivery date as provided by the carrier. The delivery date is actual when the delivery status is "Delivered".
Get Bill of Lading returns an image (pdf, png, jpg) of the Bill of Lading (BOL) provided to the carrier when a shipment was tendered. Your customers may find this useful because it often includes details about the shipment including weight, pallet count, and dimensions.
Get Proof of Delivery returns an image of the Proof of Delivery (POD) confirming the shipment was delivered. The POD often (but not always) includes the name and signature of the person who signed for a shipment. Larger customers may have a "drop & hook" agreement that allows carriers to deliver multiple shipments at one time. Under these agreements the receiver has a set amount of time to review the delivery and file any disputes.
Everyone has different data available. Our product works without a TMS - you probably have PRO / Tracking Number and Carrier available in your OMS or Invoice data. We offer variations on each API to meet your needs:
If you're curious about any supply chain terminology in this documentation, our Glossary is here. PRO and tracking number are interchangeable, generally PRO is used for LTL and tracking number for parcel.
Every subscription includes virtually unlimited access to our Sandbox. Our Sandbox rate limits are in the 10s of requests per second and hundreds per day.
Your production per-API rate limits are listed under each API Key, and your account-wide limits are listed under Billing.
The best way to learn about our API is to use it. You can test our Sandbox API from any web browser:
When you have the tracking number and carrier, you can specify the SCAC (or get pattern matching on the carrier's name) by including the name / SCAC in the url, along with the tracking number.
Note: using the Sandbox carrier forces the carrier in this example to be our internal sandbox provider. Below, you will need to replace YOUR_API_KEY with an API Key provided by our dashboard, and replace NAME_OR_SCAC and CARRIER_ID with real data.
Before you try this live with your own carriers and tracking information, carrier credentials need to be added on My Carriers. It is important to partner with your shipping/operations team - if you create new credentials on the carrier's website, you won't have the access you need. More information on carrier setup can be found here.
To try all of this live with your own carriers and tracking information, you can visit the Tracking page, and see what you have available now.
When accessing our API using one of your user-defined API Keys, you may have selected more than one Carrier Key to use with that API key. We recommend this API whenever possible. This API has the lowest latency and will provide the best user experience. When you provide the SCAC or Carrier name, we connect directly:
If your platform expects a different API Key for each carrier, you can create an API Key for each Carrier Credential. In this case, the URL you use can be simplified to remove the SCAC:
Of course we have you covered. Generally, if we know which carrier to connect to, for a given Tracking/PRO (characters and number patterns), we will connect directly. If we are not able to determine which is which, we may try some or all carriers, returning data if / when data is returned by the upstream carrier.
Yes, we take BOL Numbers too. That said, BOL number calls usually take more time for carriers to process because they're not inherently unique. We recommend using tracking/PRO if possible for a better end user experience.
Sometimes setups with carriers are more complex than one Carrier Key per SCAC can handle. If you have multiple accounts with one or more carriers (multiple carrier credentials with the same SCAC), you can use the Carrier ID to access the specific Carrier Key you need. You can create one API Key with all of your Carrier Keys attached and specify the Carrier ID for each specific Carrier key from our internal Tracking page. You will need to be fully explicit and provide all references with this API set. Your Carrier IDs go where the SCAC was above:
For status, date, lading, or proof, the list of arguments to our API endpoints and their meanings are as follows:
If you would like to check the pricing on your LTL shipments, you can test directly in our web interface on the Rating page, remembering to select your "ArcBest" carrier (we only support Rating via ArcBest at the current time). When on our Rating page, you can see what your API call would look like with those arguments, allowing you to copy / paste and edit as necessary.
For making rating calls to our API directly, there are several required, and some optional arguments:
country, if included must be one of: us, ca, or mx
type, if included, must be one of:
Webhooks are sent to your specified url as a POST request. For per-image events, each will be base64 encoded, and included as the "image" argument, with a "filename" to indicate original file name and type.
The following data will be posted to your endpoint, encoded either as json (as shown), or as 'application/x-www-form-urlencoded' (not shown).
{ "what": "qrcode", "ref": number // for single; [number, number] for a range }
{ "what": "start", "ref": "string" }
{ "what": "image", "ref": "string", "image": "data:image/jpeg;base64,IMAGE_DATA_BASE64_ENCODED" "filename": "REF_NAME.jpg" // same ref as above, for verification }
{ "what": "end", "ref": "string", "longstatus": "string" // is exactly "{status} - {longstatus}" as returned by /status endpoint }
Topics: