curl --request POST \
--url https://www.landedfees.com/v1/calc/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_country": "US",
"currency": "USD",
"incoterm": "FOB",
"transport_mode": "ocean",
"freight": 1200,
"insurance": 180,
"rows": [
{
"description": "Bluetooth earbuds",
"hs_code": "8517.62",
"quantity": 500,
"unit_value": 12.5,
"origin_country": "CN"
},
{
"description": "USB-C charging cable",
"hs_code": "8544.42",
"quantity": 1000,
"unit_value": 1.2,
"origin_country": "CN"
},
{
"description": "Silicone phone case",
"hs_code": "3926.90",
"quantity": 800,
"unit_value": 2,
"origin_country": "VN"
}
]
}
'import requests
url = "https://www.landedfees.com/v1/calc/bulk"
payload = {
"destination_country": "US",
"currency": "USD",
"incoterm": "FOB",
"transport_mode": "ocean",
"freight": 1200,
"insurance": 180,
"rows": [
{
"description": "Bluetooth earbuds",
"hs_code": "8517.62",
"quantity": 500,
"unit_value": 12.5,
"origin_country": "CN"
},
{
"description": "USB-C charging cable",
"hs_code": "8544.42",
"quantity": 1000,
"unit_value": 1.2,
"origin_country": "CN"
},
{
"description": "Silicone phone case",
"hs_code": "3926.90",
"quantity": 800,
"unit_value": 2,
"origin_country": "VN"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
destination_country: 'US',
currency: 'USD',
incoterm: 'FOB',
transport_mode: 'ocean',
freight: 1200,
insurance: 180,
rows: [
{
description: 'Bluetooth earbuds',
hs_code: '8517.62',
quantity: 500,
unit_value: 12.5,
origin_country: 'CN'
},
{
description: 'USB-C charging cable',
hs_code: '8544.42',
quantity: 1000,
unit_value: 1.2,
origin_country: 'CN'
},
{
description: 'Silicone phone case',
hs_code: '3926.90',
quantity: 800,
unit_value: 2,
origin_country: 'VN'
}
]
})
};
fetch('https://www.landedfees.com/v1/calc/bulk', 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://www.landedfees.com/v1/calc/bulk",
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([
'destination_country' => 'US',
'currency' => 'USD',
'incoterm' => 'FOB',
'transport_mode' => 'ocean',
'freight' => 1200,
'insurance' => 180,
'rows' => [
[
'description' => 'Bluetooth earbuds',
'hs_code' => '8517.62',
'quantity' => 500,
'unit_value' => 12.5,
'origin_country' => 'CN'
],
[
'description' => 'USB-C charging cable',
'hs_code' => '8544.42',
'quantity' => 1000,
'unit_value' => 1.2,
'origin_country' => 'CN'
],
[
'description' => 'Silicone phone case',
'hs_code' => '3926.90',
'quantity' => 800,
'unit_value' => 2,
'origin_country' => 'VN'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://www.landedfees.com/v1/calc/bulk"
payload := strings.NewReader("{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://www.landedfees.com/v1/calc/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.landedfees.com/v1/calc/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"results": [
{
"line_index": 123,
"ok": true,
"description": "<string>",
"hs_code": "<string>",
"origin": "<string>",
"quantity": 123,
"unit_value": 123,
"line_value": 123,
"duty": 123,
"taxes": 123,
"fees": 123,
"landed_cost": 123,
"currency": "<string>",
"de_minimis_applied": true,
"warnings": [
"<string>"
]
}
],
"errors": [
{
"line_index": 123,
"reason": "<string>",
"field": "<string>"
}
],
"aggregate": {
"total_rows": 123,
"ok_rows": 123,
"error_rows": 123,
"total_value": 123,
"total_duty": 123,
"total_taxes": 123,
"total_fees": 123,
"total_landed": 123,
"currency": "<string>"
}
}{
"error": "invalid body",
"issues": [
{
"path": [
"destination_country"
],
"message": "String must contain exactly 2 character(s)"
}
]
}{
"error": "unauthorized"
}{
"error": "quota_exceeded",
"code": "QUOTA_EXCEEDED",
"message": "Monthly quota exhausted. Upgrade at https://www.landedfees.com/pricing."
}{
"error": "rate_limited",
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after 60 seconds."
}{
"error": "internal",
"detail": "engine error"
}Bulk landed cost
Accepts up to 500 single-line rows sharing ship-level fields
(destination, currency, incoterm, transport_mode, freight,
insurance). Freight and insurance are pro-rated across rows by
line value. Row-level validation errors do not fail the batch;
they are returned in the errors array alongside successful
rows in results.
curl --request POST \
--url https://www.landedfees.com/v1/calc/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"destination_country": "US",
"currency": "USD",
"incoterm": "FOB",
"transport_mode": "ocean",
"freight": 1200,
"insurance": 180,
"rows": [
{
"description": "Bluetooth earbuds",
"hs_code": "8517.62",
"quantity": 500,
"unit_value": 12.5,
"origin_country": "CN"
},
{
"description": "USB-C charging cable",
"hs_code": "8544.42",
"quantity": 1000,
"unit_value": 1.2,
"origin_country": "CN"
},
{
"description": "Silicone phone case",
"hs_code": "3926.90",
"quantity": 800,
"unit_value": 2,
"origin_country": "VN"
}
]
}
'import requests
url = "https://www.landedfees.com/v1/calc/bulk"
payload = {
"destination_country": "US",
"currency": "USD",
"incoterm": "FOB",
"transport_mode": "ocean",
"freight": 1200,
"insurance": 180,
"rows": [
{
"description": "Bluetooth earbuds",
"hs_code": "8517.62",
"quantity": 500,
"unit_value": 12.5,
"origin_country": "CN"
},
{
"description": "USB-C charging cable",
"hs_code": "8544.42",
"quantity": 1000,
"unit_value": 1.2,
"origin_country": "CN"
},
{
"description": "Silicone phone case",
"hs_code": "3926.90",
"quantity": 800,
"unit_value": 2,
"origin_country": "VN"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
destination_country: 'US',
currency: 'USD',
incoterm: 'FOB',
transport_mode: 'ocean',
freight: 1200,
insurance: 180,
rows: [
{
description: 'Bluetooth earbuds',
hs_code: '8517.62',
quantity: 500,
unit_value: 12.5,
origin_country: 'CN'
},
{
description: 'USB-C charging cable',
hs_code: '8544.42',
quantity: 1000,
unit_value: 1.2,
origin_country: 'CN'
},
{
description: 'Silicone phone case',
hs_code: '3926.90',
quantity: 800,
unit_value: 2,
origin_country: 'VN'
}
]
})
};
fetch('https://www.landedfees.com/v1/calc/bulk', 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://www.landedfees.com/v1/calc/bulk",
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([
'destination_country' => 'US',
'currency' => 'USD',
'incoterm' => 'FOB',
'transport_mode' => 'ocean',
'freight' => 1200,
'insurance' => 180,
'rows' => [
[
'description' => 'Bluetooth earbuds',
'hs_code' => '8517.62',
'quantity' => 500,
'unit_value' => 12.5,
'origin_country' => 'CN'
],
[
'description' => 'USB-C charging cable',
'hs_code' => '8544.42',
'quantity' => 1000,
'unit_value' => 1.2,
'origin_country' => 'CN'
],
[
'description' => 'Silicone phone case',
'hs_code' => '3926.90',
'quantity' => 800,
'unit_value' => 2,
'origin_country' => 'VN'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://www.landedfees.com/v1/calc/bulk"
payload := strings.NewReader("{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://www.landedfees.com/v1/calc/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.landedfees.com/v1/calc/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destination_country\": \"US\",\n \"currency\": \"USD\",\n \"incoterm\": \"FOB\",\n \"transport_mode\": \"ocean\",\n \"freight\": 1200,\n \"insurance\": 180,\n \"rows\": [\n {\n \"description\": \"Bluetooth earbuds\",\n \"hs_code\": \"8517.62\",\n \"quantity\": 500,\n \"unit_value\": 12.5,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"USB-C charging cable\",\n \"hs_code\": \"8544.42\",\n \"quantity\": 1000,\n \"unit_value\": 1.2,\n \"origin_country\": \"CN\"\n },\n {\n \"description\": \"Silicone phone case\",\n \"hs_code\": \"3926.90\",\n \"quantity\": 800,\n \"unit_value\": 2,\n \"origin_country\": \"VN\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"results": [
{
"line_index": 123,
"ok": true,
"description": "<string>",
"hs_code": "<string>",
"origin": "<string>",
"quantity": 123,
"unit_value": 123,
"line_value": 123,
"duty": 123,
"taxes": 123,
"fees": 123,
"landed_cost": 123,
"currency": "<string>",
"de_minimis_applied": true,
"warnings": [
"<string>"
]
}
],
"errors": [
{
"line_index": 123,
"reason": "<string>",
"field": "<string>"
}
],
"aggregate": {
"total_rows": 123,
"ok_rows": 123,
"error_rows": 123,
"total_value": 123,
"total_duty": 123,
"total_taxes": 123,
"total_fees": 123,
"total_landed": 123,
"currency": "<string>"
}
}{
"error": "invalid body",
"issues": [
{
"path": [
"destination_country"
],
"message": "String must contain exactly 2 character(s)"
}
]
}{
"error": "unauthorized"
}{
"error": "quota_exceeded",
"code": "QUOTA_EXCEEDED",
"message": "Monthly quota exhausted. Upgrade at https://www.landedfees.com/pricing."
}{
"error": "rate_limited",
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after 60 seconds."
}{
"error": "internal",
"detail": "engine error"
}Authorizations
API key issued from the LandedFees dashboard under Settings > API keys.
Format: sk_live_... (production) or sk_test_... (sandbox). Pass in
the Authorization: Bearer <key> header.
Headers
Client-generated unique string (recommended UUID v4). Repeating the same key within 24 hours returns the cached response for the original request body. Different bodies with the same key return HTTP 409.
8 - 128"e4c1d2a0-8f6b-4c9d-a123-2f8b7c5e9d10"
Body
23EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF ocean, air, truck, rail, express 1 - 500 elementsShow child attributes
Show child attributes
x >= 0x >= 0222