Cancel an unassigned shipment
curl --request POST \
--url https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"reasonCode": "CUSTOMER_REQUESTED"
}
'import requests
url = "https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel"
payload = { "reasonCode": "CUSTOMER_REQUESTED" }
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({reasonCode: 'CUSTOMER_REQUESTED'})
};
fetch('https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel', 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-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel",
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([
'reasonCode' => 'CUSTOMER_REQUESTED'
]),
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://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel"
payload := strings.NewReader("{\n \"reasonCode\": \"CUSTOMER_REQUESTED\"\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://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reasonCode\": \"CUSTOMER_REQUESTED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel")
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 \"reasonCode\": \"CUSTOMER_REQUESTED\"\n}"
response = http.request(request)
puts response.read_body{
"shipmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"shipmentNumber": "<string>",
"externalReference": "<string>",
"state": "PENDING_APPROVAL",
"recipientName": "<string>",
"maskedRecipientPhone": "<string>",
"totalWeightKilograms": 123,
"declaredValue": 123,
"codAmount": 123,
"currency": "<string>",
"paymentMethod": "PREPAID",
"pickupWindowStart": "2023-11-07T05:31:56Z",
"pickupWindowEnd": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"approvedAt": "2023-11-07T05:31:56Z",
"version": 1,
"destination": {
"addressLine": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0
},
"pickup": {
"addressLine": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0
},
"items": [
{
"description": "<string>",
"quantity": 5000,
"weightKilograms": 123,
"lengthCentimetres": 1,
"widthCentimetres": 1,
"heightCentimetres": 1
}
],
"requirements": [
"<string>"
],
"timelineMedia": [
{
"mediaAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purpose": "SHIPMENT_CREATION_EVIDENCE",
"sortOrder": 49
}
]
}{
"type": "https://api.drop-hub.com/problems/authentication-required",
"title": "Authentication required",
"status": 401,
"detail": "Authentication is required for this resource.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "AUTHENTICATION_REQUIRED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}External Shipments
Cancel an unassigned shipment
Atomic with driver assignment. Once any driver offer/assignment exists this returns 409 SHIPMENT_ALREADY_ASSIGNED.
POST
/
v2
/
external
/
shipments
/
{shipmentId}
/
cancel
Cancel an unassigned shipment
curl --request POST \
--url https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"reasonCode": "CUSTOMER_REQUESTED"
}
'import requests
url = "https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel"
payload = { "reasonCode": "CUSTOMER_REQUESTED" }
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({reasonCode: 'CUSTOMER_REQUESTED'})
};
fetch('https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel', 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-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel",
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([
'reasonCode' => 'CUSTOMER_REQUESTED'
]),
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://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel"
payload := strings.NewReader("{\n \"reasonCode\": \"CUSTOMER_REQUESTED\"\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://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reasonCode\": \"CUSTOMER_REQUESTED\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-test.drop-hub.com/v2/external/shipments/{shipmentId}/cancel")
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 \"reasonCode\": \"CUSTOMER_REQUESTED\"\n}"
response = http.request(request)
puts response.read_body{
"shipmentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"shipmentNumber": "<string>",
"externalReference": "<string>",
"state": "PENDING_APPROVAL",
"recipientName": "<string>",
"maskedRecipientPhone": "<string>",
"totalWeightKilograms": 123,
"declaredValue": 123,
"codAmount": 123,
"currency": "<string>",
"paymentMethod": "PREPAID",
"pickupWindowStart": "2023-11-07T05:31:56Z",
"pickupWindowEnd": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"approvedAt": "2023-11-07T05:31:56Z",
"version": 1,
"destination": {
"addressLine": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0
},
"pickup": {
"addressLine": "<string>",
"cityCode": "<string>",
"latitude": 0,
"longitude": 0
},
"items": [
{
"description": "<string>",
"quantity": 5000,
"weightKilograms": 123,
"lengthCentimetres": 1,
"widthCentimetres": 1,
"heightCentimetres": 1
}
],
"requirements": [
"<string>"
],
"timelineMedia": [
{
"mediaAssetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"purpose": "SHIPMENT_CREATION_EVIDENCE",
"sortOrder": 49
}
]
}{
"type": "https://api.drop-hub.com/problems/authentication-required",
"title": "Authentication required",
"status": 401,
"detail": "Authentication is required for this resource.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "AUTHENTICATION_REQUIRED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}{
"type": "https://api.drop-hub.com/problems/access-denied",
"title": "Access denied",
"status": 403,
"detail": "Access to this resource is denied.",
"instance": "/v2/external/shipments/018f2d8a-1f00-7000-8000-000000000206",
"code": "ACCESS_DENIED",
"timestamp": "2026-08-22T18:30:00Z",
"correlationId": "018f2d8a-1f00-7000-8000-000000000207",
"requestId": "018f2d8a-1f00-7000-8000-000000000208"
}Authorizations
OAuth 2.0 client-credentials flow for external machine-to-machine integrations.
Headers
Preferred response language when a localized representation is available.
Maximum string length:
64Example:
"en"
Caller-generated key scoped by the operation, Merchant company, and OAuth client; an exact replay returns the original result.
Required string length:
16 - 128Example:
"merchant-order-20260822-0001"
Path Parameters
Body
application/json
Pattern:
^[A-Z][A-Z0-9_]{1,47}$Response
Merchant-safe canonical shipment
Maximum string length:
128Available options:
PENDING_APPROVAL, READY_FOR_DISPATCH, OFFERED, ACCEPTED, DISPATCH_UNRESOLVED, PICKED_UP, OUT_FOR_DELIVERY, DELIVERED, DELIVERY_FAILED, CANCELLED Only the final four digits are visible.
Available options:
PREPAID, COD Required range:
x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Existing READY assets attached only to the resulting shipment.created event.
Maximum array length:
10Show child attributes
Show child attributes
⌘I
