How can we help?

Borderless360 — Public API

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:

Notion image
 

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 either in_store for outbound orders or asn for inbound orders.
  • customs_value and customs_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

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

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

Workflow:

  1. 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.
  1. 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.
  1. 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"
    } 
] 
 
Did this answer your question?
😞
😐
🤩