curl --request POST \
--url https://api.terminal49.com/v2/trade_intel/containers/lookup \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"container_number": "MSCU1234567"
}
'import requests
url = "https://api.terminal49.com/v2/trade_intel/containers/lookup"
payload = { "container_number": "MSCU1234567" }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({container_number: 'MSCU1234567'})
};
fetch('https://api.terminal49.com/v2/trade_intel/containers/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.terminal49.com/v2/trade_intel/containers/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'container_number' => 'MSCU1234567'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.terminal49.com/v2/trade_intel/containers/lookup"
payload := strings.NewReader("{\n \"container_number\": \"MSCU1234567\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.terminal49.com/v2/trade_intel/containers/lookup")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"container_number\": \"MSCU1234567\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.terminal49.com/v2/trade_intel/containers/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"container_number\": \"MSCU1234567\"\n}"
response = http.request(request)
puts response.read_body{
"container_number": "MSCU1234567",
"found": true,
"latest_import": {
"container_number": "MSCU1234567",
"imported_on": "2026-08-14",
"scac": "MSCU",
"vessel_name": "EXAMPLE VESSEL",
"port_of_discharge_name": "LOS ANGELES"
},
"bills_of_lading": [
{
"imported_on": "2026-08-14",
"master_bill_of_lading_number": "MEDUW9559867",
"house_bill_of_lading_number": null,
"scac": "MSCU",
"scac_name": "MEDITERRANEAN SHIPPING COMPANY",
"vessel_name": "EXAMPLE VESSEL",
"voyage_number": "026N",
"port_of_lading_name": "NINGBO",
"port_of_lading_country": "PEOPLES REP OF CHINA",
"port_of_discharge_name": "LOS ANGELES",
"destination_city": "ONTARIO",
"destination_state": "CA",
"ultimate_origin_country": "PEOPLES REP OF CHINA",
"container_type_short_description": "40 HC",
"container_teu": 2,
"container_reefer_flag": false
}
],
"commodities": [
{
"imported_on": "2026-08-14",
"master_bill_of_lading_number": "MEDUW9559867",
"house_bill_of_lading_number": null,
"consignee": "EXAMPLE OUTDOOR SUPPLY",
"consignee_city": "ONTARIO",
"consignee_state": "CA",
"notify_party": "EXAMPLE OUTDOOR SUPPLY",
"shipper": "EXAMPLE FURNITURE CO LTD",
"shipper_country": "PEOPLES REP OF CHINA",
"commodity_short_description": "OFFICE CHAIRS",
"commodity_hs_code_6": "940130",
"commodity_hs_code_6_description": "Swivel seats with variable height adjustment",
"commodity_quantity": 420,
"commodity_quantity_uom": "CTN",
"commodity_estimated_value": 38000,
"bol_metric_tons": 8.2,
"bol_teus": 2,
"nvocc_scac": null,
"nvocc_scac_description": null
}
],
"commodities_truncated": false,
"note": "only the most recent US import of this container is on record; earlier imports are not included"
}{
"error": "hs4 must be a 4-digit HS code, e.g. '0306'; use commodities/search to find one"
}{
"error": "Terminal49 API key could not be verified"
}{
"error": "Trade intelligence is not enabled for this account"
}{
"detail": [
{
"loc": [
"body",
"limit"
],
"msg": "Input should be less than or equal to 50",
"type": "less_than_equal"
}
]
}{
"error": "Rate limit exceeded; retry in a minute"
}{
"error": "Trade intelligence is temporarily unavailable; try again shortly"
}{
"error": "Trade intelligence is temporarily unavailable; try again shortly"
}Look up a container's import record
Get the most recent US import of a container from US Customs manifests: bills of lading, carrier, vessel, ports, destination, parties, and commodity lines.
curl --request POST \
--url https://api.terminal49.com/v2/trade_intel/containers/lookup \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"container_number": "MSCU1234567"
}
'import requests
url = "https://api.terminal49.com/v2/trade_intel/containers/lookup"
payload = { "container_number": "MSCU1234567" }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({container_number: 'MSCU1234567'})
};
fetch('https://api.terminal49.com/v2/trade_intel/containers/lookup', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.terminal49.com/v2/trade_intel/containers/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'container_number' => 'MSCU1234567'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.terminal49.com/v2/trade_intel/containers/lookup"
payload := strings.NewReader("{\n \"container_number\": \"MSCU1234567\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.terminal49.com/v2/trade_intel/containers/lookup")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"container_number\": \"MSCU1234567\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.terminal49.com/v2/trade_intel/containers/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"container_number\": \"MSCU1234567\"\n}"
response = http.request(request)
puts response.read_body{
"container_number": "MSCU1234567",
"found": true,
"latest_import": {
"container_number": "MSCU1234567",
"imported_on": "2026-08-14",
"scac": "MSCU",
"vessel_name": "EXAMPLE VESSEL",
"port_of_discharge_name": "LOS ANGELES"
},
"bills_of_lading": [
{
"imported_on": "2026-08-14",
"master_bill_of_lading_number": "MEDUW9559867",
"house_bill_of_lading_number": null,
"scac": "MSCU",
"scac_name": "MEDITERRANEAN SHIPPING COMPANY",
"vessel_name": "EXAMPLE VESSEL",
"voyage_number": "026N",
"port_of_lading_name": "NINGBO",
"port_of_lading_country": "PEOPLES REP OF CHINA",
"port_of_discharge_name": "LOS ANGELES",
"destination_city": "ONTARIO",
"destination_state": "CA",
"ultimate_origin_country": "PEOPLES REP OF CHINA",
"container_type_short_description": "40 HC",
"container_teu": 2,
"container_reefer_flag": false
}
],
"commodities": [
{
"imported_on": "2026-08-14",
"master_bill_of_lading_number": "MEDUW9559867",
"house_bill_of_lading_number": null,
"consignee": "EXAMPLE OUTDOOR SUPPLY",
"consignee_city": "ONTARIO",
"consignee_state": "CA",
"notify_party": "EXAMPLE OUTDOOR SUPPLY",
"shipper": "EXAMPLE FURNITURE CO LTD",
"shipper_country": "PEOPLES REP OF CHINA",
"commodity_short_description": "OFFICE CHAIRS",
"commodity_hs_code_6": "940130",
"commodity_hs_code_6_description": "Swivel seats with variable height adjustment",
"commodity_quantity": 420,
"commodity_quantity_uom": "CTN",
"commodity_estimated_value": 38000,
"bol_metric_tons": 8.2,
"bol_teus": 2,
"nvocc_scac": null,
"nvocc_scac_description": null
}
],
"commodities_truncated": false,
"note": "only the most recent US import of this container is on record; earlier imports are not included"
}{
"error": "hs4 must be a 4-digit HS code, e.g. '0306'; use commodities/search to find one"
}{
"error": "Terminal49 API key could not be verified"
}{
"error": "Trade intelligence is not enabled for this account"
}{
"detail": [
{
"loc": [
"body",
"limit"
],
"msg": "Input should be less than or equal to 50",
"type": "less_than_equal"
}
]
}{
"error": "Rate limit exceeded; retry in a minute"
}{
"error": "Trade intelligence is temporarily unavailable; try again shortly"
}{
"error": "Trade intelligence is temporarily unavailable; try again shortly"
}Authorizations
Use a Terminal49 API key in the Authorization header with the Token prefix.
Authorization: Token YOUR_API_KEY
Body
ISO 6346 container number. Spaces and hyphens are removed and letters uppercased before matching.
1 - 20"MSCU1234567"
Response
OK
The normalized container number that was looked up.
"MSCU1234567"
false when no US import of this container is on record, or the number is malformed.
Only when found is false because the number is malformed.
"expected ISO 6346 format, e.g. MSCU1234567"
Summary of the container's most recent US import (import date, carrier, vessel, ports, and destination), present when found is true.
Bills of lading the container travelled under on that import.
Show child attributes
Show child attributes
Commodity lines on those bills, grouped by bill with the highest estimated value first within each bill. At most 200 lines are returned; the cap keeps the first 200 in that order, not the 200 highest-value lines overall.
Show child attributes
Show child attributes
true when more than 200 commodity lines exist and only the first 200 are returned.
Coverage caveat for this response.
"only the most recent US import of this container is on record; earlier imports are not included"
Was this page helpful?