Create a movement
curl --request POST \
--url https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"action": "<string>",
"quantity": 123,
"grossWeightKg": 123,
"customsSupervision": "<string>",
"goodsHandlingCode": "<string>",
"hawbId": "<string>",
"partyId": "<string>",
"customsDeclaration": {
"source": "<string>",
"declarationId": "<string>",
"documentType": "<string>",
"declarationType": "<string>",
"declarationNumber": "<string>"
}
}
'import requests
url = "https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements"
payload = {
"action": "<string>",
"quantity": 123,
"grossWeightKg": 123,
"customsSupervision": "<string>",
"goodsHandlingCode": "<string>",
"hawbId": "<string>",
"partyId": "<string>",
"customsDeclaration": {
"source": "<string>",
"declarationId": "<string>",
"documentType": "<string>",
"declarationType": "<string>",
"declarationNumber": "<string>"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
action: '<string>',
quantity: 123,
grossWeightKg: 123,
customsSupervision: '<string>',
goodsHandlingCode: '<string>',
hawbId: '<string>',
partyId: '<string>',
customsDeclaration: {
source: '<string>',
declarationId: '<string>',
documentType: '<string>',
declarationType: '<string>',
declarationNumber: '<string>'
}
})
};
fetch('https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements', 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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements",
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([
'action' => '<string>',
'quantity' => 123,
'grossWeightKg' => 123,
'customsSupervision' => '<string>',
'goodsHandlingCode' => '<string>',
'hawbId' => '<string>',
'partyId' => '<string>',
'customsDeclaration' => [
'source' => '<string>',
'declarationId' => '<string>',
'documentType' => '<string>',
'declarationType' => '<string>',
'declarationNumber' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"movementId": "mov_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"shipmentId": "shp_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"action": "ISL",
"status": "QUEUED",
"processType": "IMPORT_HANDLING",
"trigger": "API",
"originalMovementId": null,
"createdAt": "2026-06-10T08:30:00.000Z",
"updatedAt": "2026-06-10T08:30:00.000Z"
}
RTO
Create a movement
Create an RTO movement by action (VAH, VAB, ISL, USL, ISC, USC).
POST
/
v1
/
shipments
/
{id}
/
movements
Create a movement
curl --request POST \
--url https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"action": "<string>",
"quantity": 123,
"grossWeightKg": 123,
"customsSupervision": "<string>",
"goodsHandlingCode": "<string>",
"hawbId": "<string>",
"partyId": "<string>",
"customsDeclaration": {
"source": "<string>",
"declarationId": "<string>",
"documentType": "<string>",
"declarationType": "<string>",
"declarationNumber": "<string>"
}
}
'import requests
url = "https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements"
payload = {
"action": "<string>",
"quantity": 123,
"grossWeightKg": 123,
"customsSupervision": "<string>",
"goodsHandlingCode": "<string>",
"hawbId": "<string>",
"partyId": "<string>",
"customsDeclaration": {
"source": "<string>",
"declarationId": "<string>",
"documentType": "<string>",
"declarationType": "<string>",
"declarationNumber": "<string>"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
action: '<string>',
quantity: 123,
grossWeightKg: 123,
customsSupervision: '<string>',
goodsHandlingCode: '<string>',
hawbId: '<string>',
partyId: '<string>',
customsDeclaration: {
source: '<string>',
declarationId: '<string>',
documentType: '<string>',
declarationType: '<string>',
declarationNumber: '<string>'
}
})
};
fetch('https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements', 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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements",
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([
'action' => '<string>',
'quantity' => 123,
'grossWeightKg' => 123,
'customsSupervision' => '<string>',
'goodsHandlingCode' => '<string>',
'hawbId' => '<string>',
'partyId' => '<string>',
'customsDeclaration' => [
'source' => '<string>',
'declarationId' => '<string>',
'documentType' => '<string>',
'declarationType' => '<string>',
'declarationNumber' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements"
payload := strings.NewReader("{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://devapi.eazecustoms.com/staging/v1/shipments/{id}/movements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"action\": \"<string>\",\n \"quantity\": 123,\n \"grossWeightKg\": 123,\n \"customsSupervision\": \"<string>\",\n \"goodsHandlingCode\": \"<string>\",\n \"hawbId\": \"<string>\",\n \"partyId\": \"<string>\",\n \"customsDeclaration\": {\n \"source\": \"<string>\",\n \"declarationId\": \"<string>\",\n \"documentType\": \"<string>\",\n \"declarationType\": \"<string>\",\n \"declarationNumber\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"movementId": "mov_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"shipmentId": "shp_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"action": "ISL",
"status": "QUEUED",
"processType": "IMPORT_HANDLING",
"trigger": "API",
"originalMovementId": null,
"createdAt": "2026-06-10T08:30:00.000Z",
"updatedAt": "2026-06-10T08:30:00.000Z"
}
Create a movement by action (
VAH, VAB, ISL, USL, ISC, USC). Do not send a provider, configuration, or process type — both come from the shipment.
Path Parameters
string
required
Shipment Public ID (
shp_…).Headers
string
required
Unique key that makes retrying this request safe for 24 hours. A UUID is recommended.
Body
string
required
Movement action. Allowed values:
VAH, VAB, ISL, USL, ISC, USC.integer
required
Number of packages (colli) moved.
number
required
Gross weight of those packages, in kg.
string
required
Whether the goods are under customs supervision:
Y (yes) or N (no).string
required
PGTS goods-handling status:
N— not applicable (the ordinary case)A— export under Inward Processing Relief (IPR)H— trade policy measures apply in the customs-free zoneB— IPR goods subject to trade policy measuresG— goods undergo a usual form of handling in the customs-free zoneC— IPR goods that underwent a usual form of handling
string
HAWB Public ID (
hawb_…). Omit for the master AWB.string
RTO party Public ID (
rpty_…). Required for VAH, VAB, ISL, and USL.object
Customs declaration for the movement. Required for
VAH, VAB, ISC and USC unless one is already on file (for example, an allocation or the configured RTO licence). Not allowed for ISL and USL, which reuse the linked movement’s declaration. The fields depend on source:Show properties
Show properties
string
required
Where the declaration comes from. Allowed values:
INTERNAL, EXTERNAL, RTO_LICENSE, DECO, ENTREPOT. VAH/VAB accept EXTERNAL or RTO_LICENSE; ISC accepts INTERNAL, EXTERNAL or ENTREPOT; USC also accepts DECO.string
INTERNAL only, required. Declaration Public ID (dec_…) on this shipment with an accepted MRN.string
Required for
EXTERNAL and ENTREPOT. PGTS document type, for example X (full declaration).string
EXTERNAL only, required. Declaration type, for example IM, EX or T1.string
EXTERNAL only, required. MRN or other customs reference.RTO_LICENSE and DECO take no other fields, and ENTREPOT only documentType: the licence or permit number comes from your RTO configuration. Any field not listed for the chosen source is rejected.{
"action": "VAH",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"partyId": "rpty_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"customsDeclaration": {
"source": "EXTERNAL",
"documentType": "X",
"declarationType": "T1",
"declarationNumber": "26NL00012345678901"
}
}
{
"action": "VAB",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"partyId": "rpty_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25"
}
{
"action": "ISL",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"partyId": "rpty_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25"
}
{
"action": "USL",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"hawbId": "hawb_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"partyId": "rpty_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25"
}
{
"action": "ISC",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"customsDeclaration": {
"source": "EXTERNAL",
"documentType": "X",
"declarationType": "IM",
"declarationNumber": "26NL12345678901234"
}
}
{
"action": "USC",
"quantity": 10,
"grossWeightKg": 400,
"customsSupervision": "Y",
"goodsHandlingCode": "N",
"customsDeclaration": {
"source": "INTERNAL",
"declarationId": "dec_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25"
}
}
{
"movementId": "mov_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"shipmentId": "shp_3f9a1c0e5b7d4e2f8a6c1b9d0e3f7a25",
"action": "ISL",
"status": "QUEUED",
"processType": "IMPORT_HANDLING",
"trigger": "API",
"originalMovementId": null,
"createdAt": "2026-06-10T08:30:00.000Z",
"updatedAt": "2026-06-10T08:30:00.000Z"
}