Public API documentation - data structure
It's available by this URL:
Create a token and access sandbox/production environment
Currently, this process is manual and depending on your particular situation.
Please, email emil@borderless360.com to receive the tokens and access to sandbox and production environment.
Sandbox & Production URL: https://api.borderless360.com
Header
Authorization: Token {TOKEN}
Content-Type: application/json
For example:

Inbound and outbound orders.
Create an outbound order.
Outbound orders (order_type: in_store
) are the orders that shipped from one of our warehouse facilities. However, you don't need to specify any of facility information explicitly as it must be set up based on the Shipping Options and defined by courier_reference
name, then it will be assigned automatically.
Description of the order fields:
customer_reference
- a unique reference that should be specified for every order. The uniqueness of this reference is used to prevent duplicated orders being shipped.
destination_address
- a receiver full name and address details.
notes
- text field for additional notes
order_items
- contain information of the products and quantities being shipped. Products should be specified by SKU. Customs value should be provided in
order_type
- it's eitherin_store
for outbound orders orasn
for inbound orders.
customs_value
andcustoms_value_currency
- the value of the goods per every one item. The currency must be the same across all ordered items.
Available requests to create and edit the order
POST: https://api.borderless360.com/api/v1/public_api/orders/, Response Status Code: 201
PUT: https://api.borderless360.com/api/v1/public_api/orders/{id}/, Response Status Code: 200
PATCH: https://api.borderless360.com/api/v1/public_api/orders/{id}/, Response Status Code: 200
Source address is not required, but can be specified if needed.
Request example:
{
"destination_address": {
"full_name": "John Galt",
"email": "test@example.com",
"company": "My Company",
"phone": "2312312",
"address_1": "Street1",
"address_2": "Street2",
"state": "VIC",
"city": "Melbourne",
"postal_code": "3000",
"country": "AU"
},
"source": "API",
"order_type": "in_store",
"order_items": [{
"sku": "CHOCO",
"quantity":1,
"customs_value": "23",
"customs_value_currency": "AUD"
}
],
"customer_reference": "REF50369",
"courier_reference": "Free shipping",
"notes": "Please, ship this order asap"
}
Response (the same for all order types)
{
"id": 383487,
"created": "2019-03-26T04:23:59.302315Z",
"reference": "GVS0383487",
"customer_reference": "REF50362",
"order_type": "in_store",
"actions": [
"cancel"
],
"status": "draft",
"status_display": "Draft",
"state": "draft",
"state_display": "Draft",
"source": "API",
"notes": "Please, ship this order asap",
"client_id": 9,
"source_address_id": 636463,
"destination_address_id": 1015351,
"fulfilment_id": 383502,
"customs_id": 358843,
"three_pl_id": 9
}
Create an inbound order (ASN).
{
"source_address": {
"full_name": "Test Company",
"company": "Test Company",
"phone": "1234567",
"email": "test@example.com",
"address_1": "Test1",
"address_2": "Test2",
"address_3": "",
"postal_code": "3000",
"city": "MELBOURNE",
"district": "",
"state": "Victoria",
"country": "AU"
},
"customs": {
"reason_of_export": "merchandise"
},
"fulfilment": {
"packages": [
{
"quantity": 1,
"length": "100",
"width": "100",
"height": "100",
"weight": "50.00",
"package_type": "box"
}
],
"tracking_number": "123"
},
"order_items": [
{
"sku": "product1",
"quantity": 1,
"order_item_type": "single"
},
{
"sku": "product2",
"quantity": 1,
"quantity_per_item": 10,
"order_item_type": "carton"
}
],
"asn_details": {
"eta_date": "2021-10-06"
},
"three_pl": "IN STORE 3PL"
}
Providing containers/parcels/pallets
Packaging type can be specified via fulfillments.packages
value. Above example shows how specify packaging type as box. Other packaging types are:
- Pallets
...
"packages": [
{
"length": "10",
"width": "10",
"height": "10",
"weight": "1.23",
"quantity": 1,
"package_type": "pallet",
}
],
...
- Containers
...
"packages": [
{
"weight": "1.00",
"quantity": 1,
"package_type": "container",
"container_type": "ft20_pallet",
}
],
...
Valid container_type
values are: ft20_pallet
, ft20_floor
, ft40_pallet
, ft40_floor
, ft40hc_pallet
, ft40hc_floor
.
Specifying products as singles/cartons
Order items can be specified as single products or cartions containing multiple products:
...
"order_items": [
{
"sku": "product1"
"quantity": 1, // Product quantity
"order_item_type": "single" // Single products
},
{
"sku": "product2"
"quantity": 1, // Carton quantity
"quantity_per_item": 10, // Products per carton
"order_item_type": "carton" // Cartons
},
]
...
Get an order (inbound and outbound):
Expandable parameters
Note. The response will be combined If you use several expandable parameters (see example below).
Object descriptions
Return order
Create the return order from original (by copy) and generate the shipping label for it.
Request
POST: https://api.borderless360.com/api/v1/public_api/order/return/, Response Status Code: 201
Payload. Content type: application/json
{
"order_id": 0,
"email": "user@example.com",
"customer_reference": "ARM2393",
"order_items": [
{
"sku": "string",
"quantity": 0
}
],
"notes": "string",
"source": "string"
}
Response.
Content type: application/json
{
"id": 0,
"reference": "string",
"created": "2021-11-02T09:21:31Z",
"customer_reference": "string",
"status": "draft",
"destination_address": {
"address_1": "string",
"address_2": "string",
"address_3": "string",
"postal_code": "string",
"city": "string",
"district": "string",
"state": "string",
"country": "AF",
"country_display": "string"
},
"fulfillments": [
{
"courier_service": {
"service_name": "string"
},
"shipping_account": {
"name": "string",
"courier": {
"logo": "http://example.com",
"logo_colour": "string"
}
},
"shipping_label": "http://example.com",
"tracking_url": "string",
"tracking_event": {
"tracking_number": "string",
"events": [
{
"event_time": "2021-11-02T09:21:31Z",
"message": "string",
"status": "pending",
"status_display": "string",
"location": {
"city": "string",
"country": "AF",
"country_display": "string",
"postcode": "string",
"state": "string"
}
}
]
},
"tracking_number": "string",
"delivery_date": "2021-11-02T09:21:31Z",
"estimated_delivery_date": "2021-11-02T09:21:31Z",
"tracking_status": "",
"tracking_status_display": "string"
}
],
"order_items": [
{
"id": 0,
"quantity": 0,
"title": "string",
"image": "http://example.com",
"sku": "string"
}
],
"is_return": true,
"is_return_action_available": "string"
}
- available action (after it's been shipped)
Cancel Order
Make sure to check that action cancel
available in the actions
of the order’s response. Otherwise, the system returns an error with status code different from 200.
When you cancel the order it also removes it from a manifest.
URL action to cancel an order, make sure to change 3957 to your order ID.
Response Status Code: 200
Products API
Create Product
Request POST: https://api.borderless360.com/api/v1/public_api/products/, Response Status Code: 201
{
country_of_manufacture: "BE"
customs_description: "New product"
customs_value_source: "declared_price"
declared_price: "10"
height: "3"
hs_code: ""
image: "https://gv-dev-media.s3.amazonaws.com/media/product/images/2021/10/11/58cf074365e343fa904a1ab94c7e86bf.png"
inventory_levels: []
length: "5"
local_customs_description: "New product"
retail_price: "10"
safety_stock: 10
sku: "new_test_prod"
tax_code: ""
title: "New test product"
weight: 0.5
wholesale_price: "10"
width: "2"
}
Description of the product fields:
- customs_description - Customs description (generic, e.g. plastic toy, supplements, wallet)
- local_customs_description - Local customs description, for shipments to China it should be in Simplified Chinese.
- hs_code - HS Code (required for US shipments)
Retrieve products
How to retrieve a list of products
Three PL API (warehouses)
GET /api/v1/public_api/three_pl/three_pls/?limit=999 HTTP/1.1
Host: api.borderless360.com
Authorization: Token {token}
{
"count": 7,
"next": null,
"previous": null,
"results": [
{
company_name: "Dallas"
country: "US"
id: 52
is_inventory_enabled: true
preferences_id: 147
}
...
]
}
Inventory API - retrieve inventory stock
Public API documentation: https://api.borderless360.com/api/v1/public_api/docs/#operation/inventory_inventory_levels_list
Workflow:
- Use API filters and search parameters to specify the products which need to be synced, e.g.
three_pl_id
. See all available filters under Public API documentation.
- Retrieve this information periodically (e.g. every day and after the order has been created or shipped). Then update your quantity based on
stock_quantity
parameter.
- Make sure to go through every page via the
next
URL in the response.
Example to retrieve all available stock for specific 3PL (warehouse):
{
"count": 79,
"next": " https://api.borderless360.com/api/v1/public_api/inventory/inventory_levels/?expand=product&limit=20&offset=20&three_pl=9",
"previous": null,
"results": [
{
"id": 17091,
"three_pl": 9,
"product": {
"id": 163,
"client": 3,
"title": "Kangaroo toy",
"image": "https://gv-media.s3.amazonaws.com/media/media/product/images/2018/6/7/705a679130d5461d95c6901fb376d680.jpg",
"product_type": "",
"sku": "WAG4628",
"barcode": "",
"width": "5.000",
"length": "5.000",
"height": "5.000",
"weight": "0.500",
"country_of_manufacture": "AU",
"country_of_manufacture_display": "Australia",
"hs_code": "23091020",
"tax_code": "",
"customs_description": "Dog toy",
"local_customs_description": "宠物玩具",
"state": "valid",
"state_display": "Valid",
"declared_price": "44.99",
"wholesale_price": "44.99",
"retail_price": "44.99",
"customs_value": "44.99",
"customs_value_source": "declared_price",
"customs_value_source_display": "Declared price",
"source": [],
"client_id": 3
},
"stock_quantity": 6,
"product_id": 163,
"three_pl_id": 9
}
]
Stock adjustment list
GET: https://api.borderless360.com/api/v1/public_api/inventory/stock_adjustments/
{
"count": 11,
"next": null,
"previous": null,
"results": [
{
"id": 2412,
"three_pl": 52,
"reference": "",
"comment": "",
"three_pl_id": 52
},
...
]
}
New stock adjustments are created via POST requests to the same endpoint. Sample request:
{
"three_pl": 11,
"reference": "r1",
"comment": "comment"
"lines": [{
"product": 12345,
"adjustment_type": "add", //"add" or "set"
"quantity": 6,
}]
}
Stock adjustment may be filtered by creation date using date_from
and date_to
query parameters:
https://api.borderless360.com/api/v1/public_api/inventory/stock_adjustments/?date_from=2022-06-06T15:33:00Z
Stock adjustment
GET: https://api.borderless360.com/api/v1/public_api/inventory/stock_adjustments/{id}/
{
"id": 2412,
"three_pl": 52,
"reference": "",
"comment": "",
"three_pl_id": 52
}
Stock transactions for a particular stock adjustment
GET: https://api.borderless360.com/api/v1/public_api/inventory/stock_transactions/?stock_adjustment_id=12345
{
"count": 1172,
"next": "https://api.borderless360.com/api/v1/public_api/inventory/stock_transactions/?limit=20&offset=20",
"previous": null,
"results": [
{
"id": 4569493,
"content_type": "order",
"object_id": 2438497,
"content_object": 2438497,
"inventory_level": 18875,
"quantity": 1,
"current_quantity": 9981,
"created": "2022-05-27T03:46:58.972450Z",
"inventory_level_id": 18875
},
...
All stock transactions
GET: https://api.borderless360.com/api/v1/public_api/inventory/stock_transactions/
{
"count": 1172,
"next": "https://api.borderless360.com/api/v1/public_api/inventory/stock_transactions/?limit=20&offset=20",
"previous": null,
"results": [
{
"id": 4569493,
"content_type": "order",
"object_id": 2438497,
"content_object": 2438497,
"inventory_level": 18875,
"quantity": 1,
"current_quantity": 9981,
"created": "2022-05-27T03:46:58.972450Z",
"inventory_level_id": 18875
},
...
Webhooks
Borderless360 can send webhook events to notify your system when orders change their status, as well as when they receive tracking updates. If you’d like to enable this functionality, please email emil@borderless360.com to have it set up.
We support HTTP and HTTPS URLs, custom request headers, and retry attempts for unsuccessful events.
Below is a sample webhook payload for tracking updates:
{
"order_id": 12345678,
"order_reference": "GVS12345678",
"order_customer_reference": "GVS12345678",
"courier_name": "Royal Mail",
"service_name": "Tracked24",
"tracking_number": "XXXXXXXXXXXXXXXX",
"tracking_status": "in_transit",
"tracking_status_display": "In transit",
"courier_tracking_url": "https://www.royalmail.com/business/track-your-item#/tracking-results/XXXXXXXXXXXXXXXX",
"shipping_date": "2023-03-06T15:02:44.880639Z",
"delivery_date": null,
"tracking_event_id": 12345678,
"tracking_event": {
"eta": "2023-03-08T15:02:45.212958+00:00",
"tracking_number": "XXXXXXXXXXXXXXXX",
"events": [
{
"status": "in_transit",
"event_time": "2023-03-06T19:30:25Z",
"message": "Item Received",
"location_id": 1,
"location": {
"city": null,
"country": null,
"postcode": null,
"state": null,
"country_display": ""
}
},
{
"status": "pending",
"event_time": "2023-03-06T11:09:17Z",
"message": "Sender preparing item",
"location_id": 1,
"location": {
"city": null,
"country": null,
"postcode": null,
"state": null,
"country_display": ""
}
}
],
"source_location_id": null,
"destination_location_id": null
}
}
We can also send detailed order information on both order status and tracking status updates:
{
"id": 12345678,
"state": "shipping",
"source_address": {
"id": 3540715,
"full_name": "Borderless360",
"company": "Borderless360",
"phone": "+442038089103",
"email": "",
"address_1": "XXXXXXXXXXXX",
"address_2": "XXXXXXXXXXXX",
"address_3": "",
"postal_code": "SS14 3EL",
"district": "",
"city": "Basildon",
"state": "Essex",
"country": "GB",
"passport_urls": [],
"passport_full_name": "",
"passport_number": "",
"gst": ""
},
"destination_address": {
"id": 7472041,
"full_name": "Fiona Roberts",
"company": "Fiona Roberts",
"phone": "XXXXXXXXXXXX",
"email": "XXXXXXXXXXXX",
"address_1": "XXXXXXXXXXXX",
"address_2": "",
"address_3": "",
"postal_code": "HD6 3SW",
"district": "",
"city": "Brighouse",
"state": "West Yorkshire",
"country": "GB",
"passport_urls": [],
"passport_full_name": "",
"passport_number": "",
"gst": ""
},
"fulfilment": 12345678,
"reference": "GVS12345678",
"customer_reference": "#12345678",
"courier_reference": "Standard Shipping",
"order_type": "in_store",
"source_integration": null,
"notes": "",
"source": "API",
"order_items": [
{
"id": 8579178,
"fulfilment": null,
"quantity": 1,
"reserved_stock": 1,
"quantity_per_item": 1,
"order_item_type": "single",
"product": {
"id": 187776,
"title": "Camping",
"image": null,
"product_type": "single",
"sku": "SKU",
"barcode": "731788632397",
"weight": "1.000",
"width": "1.000",
"height": "1.000",
"length": "1.000",
"country_of_manufacture": "AU",
"country_of_manufacture_display": "Australia",
"hs_code": "63014090",
"tax_code": "",
"customs_description": "Apparel",
"local_customs_description": "Apparel",
"declared_price": "1.00",
"wholesale_price": "1.00",
"retail_price": "1.00",
"customs_value": "1.00",
"customs_value_source": "declared_price",
"customs_value_source_display": "Declared price",
"safety_stock": 0,
"tags": []
},
"customs_value": "1.00",
"customs_value_currency": "USD",
"product_id": 187776
}
],
"original_date": null,
"is_return": false,
"tags": [],
"source_address_id": 3540715,
"destination_address_id": 7472041,
"fulfillments": [
{
"id": 3903781,
"manifest_id": 2982256,
"order": 3842703,
"packages": [
{
"id": 5129162,
"length": 10,
"width": 10,
"height": 10,
"weight": "1.000"
}
],
"created": "2023-03-06T23:46:05.377707Z",
"tracking_number": "XXXXXXXXXXXXXXX",
"tracking_status": "pending",
"shipping_label": "",
"receiving_label": null,
"commercial_invoice": null,
"packing_slip": "",
"tracking_url": "",
"courier_tracking_url": "",
"shipping_config": {},
"courier_service": {
"id": 584,
"state": "enabled",
"courier": {
"id": 380,
"name": "Royal Mail (B360 Basildon)",
"logo": "https://gv-media.s3.amazonaws.com/media/courier/logos/2022/8/18/16700d8de40e41439308fb2211d607d9.png",
"tracking_url": "https://www.globaleco.app/track/{tracking_number}",
"integration": "hermes_international",
"logo_colour": "transparent"
},
"service_name": "48 hours ex Basildon",
"service_code": "TR48_PAR",
"courier_id": 380
}
}
],
"customs_id": 1978973
}
How to Retrieve Serial Numbers for a Specific Order
Endpoint:
GET: https://api.borderless360.com/api/v1/public_api/orders/{order_id}/serial_numbers/
Description:
Use this endpoint to retrieve the serial numbers associated with a specific order.
How to Retrieve Serial Numbers for Multiple Orders
Endpoint:
GET: https://api.borderless360.com/api/v1/public_api/orders/orders_serial_numbers/
Description:
This endpoint allows you to retrieve the serial numbers across multiple orders in one call.
Filters:
You can use filter by created or modified dates and search by order reference, product SKU or serial number. Example request
GET: https://api.borderless360.com/api/v1/public_api/orders/orders_serial_numbers/?created_from=2024-10-01T15%3A02%3A46.774418Z&created_to=&modified_from=&modified_to=&search=680
Response example
[
{
"id": 1,
"order": 3956,
"product_sku": "SKU1",
"serial_number": "132432492_ABC",
"created": "2024-10-28T15:02:46.774418Z",
"modified": "2024-10-28T15:02:46.774418Z"
},
{
"id": 2,
"order": 3956,
"product_sku": "SKU2",
"serial_number": "FJSD_3434",
"created": "2024-10-28T15:02:47.774418Z",
"modified": "2024-10-28T15:02:47.774418Z"
}
]