NAV
shell python javascript

API

Authorization

To get started, please contact us to get an API token, or go to client web-app using a provided AxleHire account to retrieve your api token. All the requests then should include the following headers

Authorization: Token <YOUR_TOKEN>
Accept: application/json
Accept-Charset: utf-8
Content-Type: application/json

Submit Shipment

Code

curl -X POST \
  https://api.axlehire.com/v3/shipments \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{
    "customer": {
      "name": "John Doe",
      "email": "john.d@example.com",
      "phone_number": "123-456-7890"
    },
    "internal_id": "123",
    "workload": 1,
    "delivery_items": "One egg, two carrots, three tacos",
    "pickup_address": {
      "street": "1937 Davis Street",
      "street2": "Suite A",
      "city": "San Leandro",
      "state": "CA",
      "zipcode": "94577"
    },
    "pickup_earliest_ts": "2018-10-13T15:36:50.052Z",
    "pickup_latest_ts": "2018-10-13T16:23:50.052Z",
    "pickup_note": "Parking lot #3",
    "pickup_buffer": 300,
    "dropoff_address": {
      "street": "2250 Shattuck Avenue",
      "street2": "Penthouse",
      "city": "Berkeley",
      "state": "CA",
      "zipcode": "94704"
    },
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "dropoff_buffer": 360,
    "delivery_proof_photo_required": true,
    "signature_required": true,
    "sms_enabled": true,
    "id_required": true,
    "rdi": "COMMERCIAL",
    "tags": [
      "meal kit", "vip", "fragile", "perishable"
    ],
    "parcels": [
      {
        "dimensions": {
          "height": 10,
          "length": 25,
          "unit": "in",
          "width": 15
        },
        "weight": {
          "unit": "lb",
          "value": 1
        }
      }
    ],
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)",
    "code": "LS01"
  }'
import requests

url = "https://api.axlehire.com/v3/shipments"

payload = '''
  {
    "customer": {
      "name": "John Doe",
      "email": "john.d@example.com",
      "phone_number": "123-456-7890"
    },
    "internal_id": "123",
    "workload": 1,
    "delivery_items": "One egg, two carrots, three tacos",
    "pickup_address": {
      "street": "1937 Davis Street",
      "street2": "Suite A",
      "city": "San Leandro",
      "state": "CA",
      "zipcode": "94577"
    },
    "pickup_earliest_ts": "2018-10-13T15:36:50.052Z",
    "pickup_latest_ts": "2018-10-13T16:23:50.052Z",
    "pickup_note": "Parking lot #3",
    "pickup_buffer": 300,
    "dropoff_address": {
        "street": "2250 Shattuck Avenue",
      "street2": "Penthouse",
      "city": "Berkeley",
      "state": "CA",
      "zipcode": "94704"
    },
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "dropoff_buffer": 360,
    "delivery_proof_photo_required": true,
    "signature_required": true,
    "sms_enabled": true,
    "id_required": true,
    "rdi": "COMMERCIAL",
    "tags": [
      "meal kit", "vip", "fragile", "perishable"
    ],
    "parcels": [
      {
        "dimensions": {
          "height": 10,
          "length": 25,
          "unit": "in",
          "width": 15
        },
        "weight": {
          "unit": "lb",
          "value": 1
        }
      }
    ],
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)",
    "code": "LS01"
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
   { customer:
         { name: 'John Doe',
           email: 'john.d@example.com',
           phone_number: '123-456-7890' },
        internal_id: '123',
        workload: 1,
        delivery_items: 'One egg, two carrots, three tacos',
        pickup_address:
         { street: '1937 Davis Street',
           street2: 'Suite A',
           city: 'San Leandro',
           state: 'CA',
           zipcode: '94577' },
        pickup_earliest_ts: "2018-10-13T15:36:50.052Z",
        pickup_latest_ts: "2018-10-13T16:23:50.052Z",
        pickup_note: 'Parking lot #3',
        pickup_buffer: 300,
        dropoff_address:
         { street: '2250 Shattuck Avenue',
           street2: 'Penthouse',
           city: 'Berkeley',
           state: 'CA',
           zipcode: '94704' },
        dropoff_earliest_ts: '2018-10-14T16:00:00.052Z',
        dropoff_latest_ts: '2018-10-14T17:23:50.052Z',
        dropoff_note: 'Please leave at the door, do not ring the bell!',
        dropoff_buffer: 360,
        delivery_proof_photo_required: true,
        signature_required: true,
        sms_enabled: true,
        id_required: true,
        rdi: "COMMERCIAL",
        tags: [ 'meal kit', 'vip', 'fragile', 'perishable' ],
        parcels: [ { dimensions: { height: 10, length: 25, unit: 'in', width: 15 },
        weight: { unit: 'lb', value: 1 } } ],
        tracking_code: "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)",
        code: 'LS01'},
   json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns AxleHire's shipment ID

{"id": `<SHIPMENT_ID>`, "tracking_code": `<AUTO_GENERATED_TRACKING_CODE>`}

Payload Specification

Parameter Data Type Validation Description
customer Customer required Customer information
internal_id String optional Your unique identifier of the shipment
workload Number optional Number of bags / boxes, default to 0
delivery_items String optional Delivery contents or packaging info for sortation teams
pickup_address Address required Customer pickup address
pickup_earliest_ts String optional The earliest timestamp (ISO-8601 format) that pickup could be done
pickup_latest_ts String optional The latest timestamp (ISO-8601 format) that pickup could be done
pickup_note String optional Pickup instruction
pickup_buffer Number optional Approximate pickup duration in seconds, AxleHire will auto-populate if omitted
dropoff_address Address required Dropoff address object
dropoff_earliest_ts String optional The earliest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_latest_ts String optional The latest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_buffer Number optional Approximate dropoff duration in seconds, AxleHire will auto-populate if omitted
dropoff_note String optional Dropoff instruction
delivery_proof_photo_required Boolean optional The flag to mandate taking photo at dropoff, default to false
signature_required Boolean optional The flag to mandate collecting recipient signature, default to true
id_required Boolean optional The flag to mandate checking recipient personal ID, default to true
tags Array of String optional Miscellaneous tags, default to empty []
parcels Array of Parcel optional List of parcels included in shipment
tracking_code String optional Tracking code, auto-generated by AxleHire (highly-recommended), unless requested otherwise (please talk to our engineers first)
code String optional For branded shipments, the alphanumeric code corresponding to the brand, which is configured in the client portal. Branded shipments can override the name, logo, and other shipment information displayed on labels, tracking pages, and notifications.

Retrieve Specific Shipment

curl -X GET \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID> \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR_TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'Cache-Control': "no-cache",
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns the shipment object

{
    "id": <SHIPMENT_ID>,
    "internal_id": "123",
    "workload": 0,
    "customer": {
        "name": "John Doe",
        "phone_number": "123-456-7890",
        "email": "john.d@example.com"
    },
    "status": "CREATED",
    "pickup_address": {
        "street2": "Suite A",
        "street": "1937 Davis Street",
        "city": "San Leandro",
        "state": "CA",
        "zipcode": "94577",
        "lat": 0,
        "lng": 0
    },
    "pickup_earliest_ts": "2018-10-13T15:36:50.052Z",
    "pickup_latest_ts": "2018-10-13T16:23:50.052Z",
    "pickup_note": "Parking lot #3",
    "pickup_buffer": 300,
    "dropoff_address": {
        "street2": "Suite A",
        "street": "1937 Davis Street",
        "city": "Berkeley",
        "state": "CA",
        "zipcode": "94577",
        "lat": 0,
        "lng": 0
    },
    "dropoff_earliest_ts": "2018-10-13T17:36:50.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "dropoff_buffer": 360,
    "delivery_proof_photo_required": false,
    "signature_required": true,
    "sms_enabled": true,
    "assignment_id": <ASSIGNMENT_ID>,
    "is_cancelled": false,
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (auto-generated most of the time)",
    "tracking_url": "https://someAxleHireTrackingURL/xyz789",
    "rdi": "COMMERCIAL",
    "remark": {
      "pickup": "pickup remark left by driver/dispatcher if any",
      "dropoff": "dropoff remark left by driver/dispatcher if any",
      "return": "return remark left by driver/dispatcher if any"
    },
    "parcels": [
      {
        "dimensions": {
          "unit": "in",
          "height": 10,
          "width": 15,
          "length": 25
        },
        "weight": {
          "value": 1,
          "unit": "lb"
        }
      }
    ]
}

Please see the shipment model for the response format

Retrieve Specific Assignment

curl -X GET \
  https://api.axlehire.com/v3/assignments/<ASSIGNMENT_ID> \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR_TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
import requests

url = "https://api.axlehire.com/v3/assignments/<ASSIGNMENT_ID>"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'Cache-Control': "no-cache",
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/assignments/<ASSIGNMENT_ID>',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns the chosen assignment

{
    "id": <ASSIGNMENT_ID>,
    "driver":{
      "name":"Jason Statham",
      "phone_number":"123456789",
      "profile_photo":"https://someExpirableUrl.com"
    },
    "vehicle":{
      "make":"Ford",
      "model":"Fiesta",
      "color":"Silver",
      "license_plate":"CA 6XRT009"
   },
   "shipment_ids": [<SHIPMENT_ID_1>, <SHIPMENT_ID_2>]
}

Please see the assignment model for the response format

Cancel Shipment

For example, we only activate the return flow if the status of the shipment status is after PICKUP_SUCCEEDED

curl --request POST \
  --url https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/cancel \
  --header 'Authorization: Token <YOUR_TOKEN>' \
  --header 'Cache-Control: no-cache' \
  --header 'Content-Type: application/json'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/cancel"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Cache-Control': "no-cache",
    }

response = requests.request("POST", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/cancel',
  headers:
   { 'Cache-Control': 'no-cache',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield response code 202 (ACCEPTED)

Update Shipment Workload

Update the workload of shipment

curl --request POST \
  --url https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/workload \
  --header 'Authorization: Token <YOUR_TOKEN>' \
  --header 'Cache-Control: no-cache' \
  --header 'Content-Type: application/json' \
  --data '2'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/workload"

payload = '2'

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Cache-Control': "no-cache",
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/workload',
  headers:
   { 'Cache-Control': 'no-cache',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
   body: '2',
   json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield response code 202 (ACCEPTED) or code 412 (PRECONDITION_FAILED) if failed

Retrieve Shipment Photos and Signature

curl --request GET \
  --url https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pod \
  --header 'Accept: application/json' \
  --header 'Accept-Charset: utf-8' \
  --header 'Authorization: Token <YOUR_TOKEN>' \
  --header 'Cache-Control: no-cache' \
  --header 'Content-Type: application/json'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pod"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'Cache-Control': "no-cache"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pod',
  headers:
   { 'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns all photos and signature taken

{
  "images": [{url: "`<PHOTO_1>`"}, {url: "`<PHOTO_2>`"}],
  "signature": [{data: "`<SIGNATURE_1>`"}, {data: "`<SIGNATURE_2>`"}]
}

Update Instruction Notes

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/notes \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "pickup_note": "pickup instruction",
    "dropoff_note": "dropoff instruction"
}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/notes"

payload = '''
  {
    "street": "2320 Warring street",
    "street2": "#101",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "longitude": -122.2516053
}
'''
headers = {
    'Content-Type': "application/json",
    'Authorization': "YOUR_TOKEN",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache",
    }

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/notes',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>>',
     'Content-Type': 'application/json' },
  body:
   { pickup_note: 'pickup instruction',
     dropoff_note: 'dropoff instruction' },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script return response with status code 204

Update Pickup Address

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pickup_address \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "street": "2320 Warring street",
    "street2": "#102",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "latitude": -122.2516053
}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pickup_address"

payload = '''
  {
    "street": "2320 Warring street",
    "street2": "#101",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "longitude": -122.2516053
}
'''
headers = {
    'Content-Type': "application/json",
    'Authorization': "YOUR_TOKEN",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache",
    }

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/pickup_address',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>>',
     'Content-Type': 'application/json' },
  body:
   { street: "2320 Warring street",
    street2: "#102",
    city: "Berkeley",
    state: "CA",
    zipcode: "94704",
    latitude: 37.8686945,
    latitude: -122.2516053 },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script return response with status code 204

Update Dropoff Address

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff_address \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "street": "2320 Warring street",
    "street2": "#102",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "latitude": -122.2516053
}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff_address"

payload = '''
  {
    "street": "2320 Warring street",
    "street2": "#101",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "longitude": -122.2516053
}
'''
headers = {
    'Content-Type': "application/json",
    'Authorization': "YOUR_TOKEN",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache",
    }

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff_address',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>>',
     'Content-Type': 'application/json' },
  body:
   { street: "2320 Warring street",
    street2: "#102",
    city: "Berkeley",
    state: "CA",
    zipcode: "94704",
    latitude: 37.8686945,
    latitude: -122.2516053 },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script return response with status code 204

Update Dropoff Time

We are enabling this feature for special clients with a cutoff time, if you want to enable this feature, please contact AxleHire!

Code

curl -X POST \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff-time \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z"
  }'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff-time"

payload = '''
  {
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z"
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff-time',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
   {    dropoff_earliest_ts: '2018-10-14T16:00:00.052Z',
        dropoff_latest_ts: '2018-10-14T17:23:50.052Z',
         };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns the shipment object

{
    "id": <SHIPMENT_ID>,
    "internal_id": "123",
    "workload": 1,
    "customer": {
        "name": "John Doe",
        "phone_number": "123-456-7890",
        "email": "john.d@example.com"
    },
    "status": "GEOCODED",
    "pickup_address": {
        "street2": "Suite A",
        "street": "1937 Davis Street",
        "city": "San Leandro",
        "state": "CA",
        "zipcode": "94577",
        "lat": 0,
        "lng": 0
    },
    "dropoff_address": {
        "street2": "Suite A",
        "street": "1937 Davis Street",
        "city": "Berkeley",
        "state": "CA",
        "zipcode": "94577",
        "lat": 0,
        "lng": 0
    },
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "delivery_proof_photo_required": false,
    "signature_required": true,
    "sms_enabled": true,
    "is_cancelled": false,
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (auto-generated most of the time)",
    "tracking_url": "https://someAxleHireTrackingURL/xyz789",
    "parcels": [
      {
        "dimensions": {
          "unit": "in",
          "height": 10,
          "width": 15,
          "length": 25
        },
        "weight": {
          "value": 1,
          "unit": "lb"
        }
      }
    ]
}

Http Request

POST https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/dropoff-time

Payload Specification

Parameter Data Type Validation Description
dropoff_earliest_ts String required The earliest timestamp (ISO-8601 format) that the customer would accept the dropoff.
dropoff_latest_ts String required The latest timestamp (ISO-8601 format) that the customer would accept the dropoff.

HTTP status and error codes

HTTP Status Message Description
403 You do not allow to update time window! Please contact AxleHire if you want to enable this feature.
403 It's too late to update delivery time! You must update the time window before the cutoff time & before we route your order.
400 Dropoff latest timestamp must be after dropoff earliest timestamp! dropoff_latest_ts must be after dropoff_earliest_ts.

Mark shipment as shipped

Code

curl -X POST \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/mark-shipped \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{
    "data_field_1": "data_field_1_value",
    "data_field_2": "data_field_2_value"
  }'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/mark-shipped"

payload = '''
  {
    "data_field_1": "data_field_1_value",
    "data_field_2": "data_field_2_value"
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/mark-shipped',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
  {
    "data_field_1": "data_field_1_value",
    "data_field_2": "data_field_2_value"
  };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script returns no of updated shipments.

{
  "updated": 1
}

Http Request

POST https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/mark-shipped

Payload Specification

You can send multiple fields with value or empty payload.

Parameter Data Type Description
your_field_name String The data you want to send to us when you mark shipment as shipped.
your_field_name String The data you want to send to us when you mark shipment as shipped.

HTTP status and error codes

HTTP Status Response Description
200 {"updated": 0} Shipment does not exist or already marked as shipped or we received shipment.
200 {"updated": 1} Shipment has been marked as shipped successfully.

Update Customer

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/customer \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "street": "2320 Warring street",
    "street2": "#102",
    "city": "Berkeley",
    "state": "CA",
    "zipcode": "94704",
    "latitude": 37.8686945,
    "latitude": -122.2516053
}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/customer"

payload = '''
  {
    "name": "Joana Doe",
    "email": "joana@doe.com",
    "phone_number": "1113335555"
}
'''
headers = {
    'Content-Type': "application/json",
    'Authorization': "YOUR_TOKEN",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache",
    }

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/customer',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>>',
     'Content-Type': 'application/json' },
  body:
   { name: "2320 Warring street",
       email: "joana@doe.com",
       phone_number: "1113335555" },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

The above script return response with status code 204

Retrieve Shipment Label

curl --request GET \
  --url https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/label?format=PDF \
  --header 'Accept: application/json' \
  --header 'Accept-Charset: utf-8' \
  --header 'Authorization: Token <YOUR_TOKEN>' \
  --header 'Content-Type: application/json' \
  --header 'cache-control: no-cache'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/label"
querystring = {"format":"PDF"}
headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/label',
  qs: { format: 'PDF' },
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

{
    "label": "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zgC4wT586rlzL92EPIvBq2x3h1zEfZFuoGeDi+s0+s4OyKo8LKiewgKG1vw7DpePqUt/ff0ERJHDoYQEoiySOgNRyqQMEGUXlZRAVCko74GoyqR6ICodVZkDUZmkCiAqTEoAUfVJlUA8i6QUEM+n2MLf7x6FHLOifvXmfag+DjQWfFQ7WqSZu9kdKR4e9gO8dZfeCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iago8PC9UeXBlL0ZvbnQvU3VidHlwZS9UeXBlMC9CYXNlRm9udC9CT0hDQlYrQ291cmllci1Cb2xkL0VuY29kaW5nL0lkZW50aXR5LUgvRGVzY2VuZGFudEZvbnRzWzEzIDAgUl0vVG9Vbmljb2RlIDE0IDAgUj4+CmVuZG9iago4IDAgb2JqCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1R5cGUxL0Jhc2VGb250L0NvdXJpZXItQm9sZC9FbmNvZGluZy9XaW5BbnNpRW5jb2Rpbmc+PgplbmRvYmoKMTAgMCBvYmoKPDwvVHlwZS9QYWdlcy9Db3VudCAxL0tpZHNbMSAwIFJdPj4KZW5kb2JqCjE1IDAgb2JqCjw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAxMCAwIFI+PgplbmRvYmoKMTYgMCBvYmoKPDwvUHJvZHVjZXIoaVRleHSuIDUuNS4xMSCpMjAwMC0yMDE3IGlUZXh0IEdyb3VwIE5WIFwoQUdQTC12ZXJzaW9uXCkpL0NyZWF0aW9uRGF0ZShEOjIwMTkwNDAyMjI1MzUwWikvTW9kRGF0ZShEOjIwMTkwNDAyMjI1MzUwWik+PgplbmRvYmoKeHJlZgowIDE3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNzI2OSAwMDAwMCBuIAowMDAwMDA3NDU0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDQ4OCAwMDAwMCBuIAowMDAwMDA3NTQwIDAwMDAwIG4gCjAwMDAwMTI3NjUgMDAwMDAgbiAKMDAwMDAwNjM1MCAwMDAwMCBuIAowMDAwMDEyODk5IDAwMDAwIG4gCjAwMDAwMDY2MjUgMDAwMDAgbiAKMDAwMDAxMjk5MCAwMDAwMCBuIAowMDAwMDA3NjM4IDAwMDAwIG4gCjAwMDAwMTE5NTkgMDAwMDAgbiAKMDAwMDAxMjE0MiAwMDAwMCBuIAowMDAwMDEyNDE2IDAwMDAwIG4gCjAwMDAwMTMwNDIgMDAwMDAgbiAKMDAwMDAxMzA4OSAwMDAwMCBuIAp0cmFpbGVyCjw8L1NpemUgMTcvUm9vdCAxNSAwIFIvSW5mbyAxNiAwIFIvSUQgWzw2MzNlZDJjYzhiNmFkZDU2Mjc3NDcyNmQ4OTI4NTJkZT48NjMzZWQyY2M4YjZhZGQ1NjI3NzQ3MjZkODkyODUyZGU+XT4+CiVpVGV4dC01LjUuMTEKc3RhcnR4cmVmCjEzMjM2CiUlRU9GCg=="
}

Retrieve Shipment Fee

curl -X GET \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/fee \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/fee"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/fee',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

{
    "base": 10.6,
    "pre_delivery_adjustment": -0.5,
    "post_delivery_adjustment": 0.1
}

Please see Price

Track Shipment

curl -X GET \
  https://api.axlehire.com/v3/tracking/<SHIPMENT_TRACKING_CODE>/events \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache'
import requests

url = "https://api.axlehire.com/v3/tracking/<SHIPMENT_TRACKING_CODE>/events"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/tracking/<SHIPMENT_TRACKING_CODE>/events',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

{
"events": [
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T22:15:19.000Z",
      "geolocation": {
        "latitude": 30.39480879213078,
        "longitude": -87.26686378082174
      },
      "signal": "DROPOFF_FAILED",
      "next_destination": "DROP_OFF",
      "remark": "Too far away"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T22:10:56.000Z",
      "geolocation": {
        "latitude": 30.394913617408267,
        "longitude": -87.26681762984384
      },
      "signal": "DROPOFF_READY",
      "eta": 1000,
      "next_destination": "DROP_OFF"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T22:05:16.000Z",
      "geolocation": {
        "latitude": 30.396216413495207,
        "longitude": -87.28009472505788
        },
      "signal": "DROPOFF_EN_ROUTE",
      "eta": 314000,
      "next_destination": "DROP_OFF"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T22:05:08.000Z",
      "geolocation": {
        "latitude": 30.396222403166874,
        "longitude": -87.28008684726137
      },
      "signal": "PICKUP_SUCCEEDED",
      "eta": 314000,
      "next_destination": "PICK_UP"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T22:04:48.000Z",
      "geolocation": {
        "latitude": 30.396216545549482,
        "longitude": -87.28009610748641
      },
      "signal": "PICKUP_READY",
      "eta": 10000,
      "next_destination": "PICK_UP"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T21:49:28.000Z",
      "geolocation": {
        "latitude": 30.41565254029608,
        "longitude": -87.2429396669947
      },
      "signal": "PICKUP_EN_ROUTE",
      "eta": 518000,
      "next_destination": "PICK_UP"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T21:49:28.000Z",
      "geolocation": {
        "latitude": 30.4156494140625,
        "longitude": -87.2429396669947
      },
      "signal": "PICKUP_EN_ROUTE",
      "eta": 518000,
      "next_destination": "PICK_UP"
    },
    {
      "shipment_id": <SHIPMENT_ID>,
      "ts": "2019-03-27T21:25:00.294Z",
      "signal": "ASSIGNED"
    }
  ]
}

Please see Event

Retreive Parcels of Shipment

Please see Parcel for the response format

curl -X GET \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels"

headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

[
    {
        "id": "e34b7b8b-3248-4ac1-9db2-bfc804333b46",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        },
        "type": "box",
        "shipment_id": <SHIPMENT_ID>,
        "parcel_id": "your-parcel-id"
    },
    {
        "id": "c6da2cd7-8203-4f38-a5ef-d1e0c9a37784",
        "dimensions": {
            "unit": "in",
            "height": 5,
            "width": 5,
            "length": 5
        },
        "weight": {
            "value": 5,
            "unit": "lb"
        },
        "type": "tote",
        "shipment_id": <SHIPMENT_ID>,
        "parcel_id": "another-parcel-id"
    }
]

Add Parcels to Shipment

curl -X POST \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '[
    {
        "parcel_id": "your-parcel-id",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    },
    {
        "parcel_id": "your-parcel-id-2",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    }
]'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels"

payload = '''
    [
        {
            "parcel_id": "your-parcel-id",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        },
        {
            "parcel_id": "your-parcel-id-2",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        }
    ]
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
    [
        {
            "parcel_id": "your-parcel-id",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        },
        {
            "parcel_id": "your-parcel-id-2",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        }
    ],
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will return number of parcels added

Payload Specification

Parameter Data Type Validation Description
shipment_id Number required AxleHire Shipment identifier that the parcel belong to
parcel_id String optional Your unique identifier of the parcel
type String required Type of the parcel (eg: box, bag, tote, pallet)
description String optional Detail about parcel [optional]
dimensions Dimension optional Dimension of parcel
weight Weight optional Weight of parcel

Add/Update Parcels of Shipment

curl -X PUT \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '[
    {
        "parcel_id": "your-parcel-id",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    },
    {
        "parcel_id": "your-parcel-id-2",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    }
]'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels"

payload = '''
    [
        {
            "parcel_id": "your-parcel-id",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        },
        {
            "parcel_id": "your-parcel-id-2",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        }
    ]
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("PUT", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
    [
        {
            "parcel_id": "your-parcel-id",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        },
        {
            "parcel_id": "your-parcel-id-2",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        }
    ],
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will return number of parcels added

Do same function as Add parcels to shipment but allow to update parcels if parcel_id is conflict.

This use PUT method instead of POST

Payload Specification

Please refer this for payload.

Update Specific Parcel of Shipment

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '
    {
        "parcel_id": "your-parcel-id",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    }
'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels"

payload = '''
    {
        "parcel_id": "your-parcel-id",
        "dimensions": {
            "unit": "in",
            "height": 12,
            "width": 10.5,
            "length": 11
        },
        "weight": {
            "value": 14,
            "unit": "lb"
        }
    }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body: {
            "parcel_id": "your-parcel-id",
            "dimensions": {
                "unit": "in",
                "height": 12,
                "width": 10.5,
                "length": 11
            },
            "weight": {
                "value": 14,
                "unit": "lb"
            }
        },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will return 200 on success

Payload Specification

Parameter Data Type Description
shipment_id Number (required) AxleHire Shipment identifier that the parcel belong to
parcel_id String (required) Your unique identifier of the parcel
type String (required) Type of the parcel (eg: box, bag, tote, pallet)
description String (optional) Detail about parcel [optional]
dimensions Dimension (optional) Dimension of parcel
weight Weight (optional) Weight of parcel

Delete Specific Parcel of Shipment

curl -X PATCH \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels?delete=true \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '
    {
        "parcel_id": "your-parcel-id-to-delete"
    }
'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels?delete=true"

payload = '''
    {
        "parcel_id": "your-parcel-id-to-delete"
    }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("PATCH", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'PATCH',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels?delete=true',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body: { "parcel_id": "your-parcel-id-to-delete" },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will return 200 on success

Delete All Parcels of Shipment

curl -X DELETE \
  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels"

payload = ''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("DELETE", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/parcels',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body: {},
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will return number of parcels deleted

Signal Shipment Readiness


curl -X POST \

  https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/ready \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{}'

import requests
url = "https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/ready"
payload = ''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}
response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())

var request = require("request");
var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIPMENT_ID>/ready',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json'
   },
  body: {},
  json: true
};

request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(body);
});

Tip Driver

Payload Specification

Parameter Data Type Description
amount Number Tip amount
currency String Tip currency, default to USD
remark String Tip remark
curl --request POST \
  --url https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/tip \
  --header 'Accept: application/json' \
  --header 'Accept-Charset: utf-8' \
  --header 'Authorization: Token <YOUR_TOKEN>' \
  --header 'Content-Type: application/json' \
  --header 'cache-control: no-cache' \
  --data '{\n   "currency": "USD",\n    "amount": 60.123\n, \n  "remark": "fast and furious"\n}'
import requests

url = "https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/tip"

payload = "{\n\t\"currency\": \"USD\",\n\t\"amount\": 60.123\n, \n\t\"remark\": \"fast and furious\"}"
headers = {
    'Content-Type': "application/json",
    'Authorization': "Token <YOUR_TOKEN>",
    'Accept-Charset': "utf-8",
    'Accept': "application/json",
    'cache-control': "no-cache"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/<SHIMENT_ID>/tip',
  headers:
   {
     'cache-control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body: { currency: 'USD', amount: 60.123, remark: "fast and furious" },
  json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

{
    "amount": 1.5,
    "currency": "USD",
    "shipment_id": <SHIPMENT_ID>,
    "assignment_id": <ASSIGNMENT_ID>,
    "driver_id": <TIPPED_DRIVER_ID>,
    "remark": "fast and furious",
    "created_at": "2019-01-01T01:00:00Z"
}

Get estimated fee for a potential shipment

Code

curl -X POST \
  https://api.axlehire.com/v3/shipments/rating \
  -H 'Accept: application/json' \
  -H 'Accept-Charset: utf-8' \
  -H 'Authorization: Token <YOUR TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{
    "customer": {
      "name": "John Doe",
      "email": "john.d@example.com",
      "phone_number": "123-456-7890"
    },
    "internal_id": "123",
    "workload": 1,
    "delivery_items": "One egg, two carrots, three tacos",
    "pickup_address": {
      "street": "1937 Davis Street",
      "street2": "Suite A",
      "city": "San Leandro",
      "state": "CA",
      "zipcode": "94577"
    },
    "pickup_earliest_ts": "2018-10-13T15:36:50.052Z",
    "pickup_latest_ts": "2018-10-13T16:23:50.052Z",
    "pickup_note": "Parking lot #3",
    "pickup_buffer": 300,
    "dropoff_address": {
      "street": "2250 Shattuck Avenue",
      "street2": "Penthouse",
      "city": "Berkeley",
      "state": "CA",
      "zipcode": "94704"
    },
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "dropoff_buffer": 360,
    "delivery_proof_photo_required": true,
    "signature_required": true,
    "sms_enabled": true,
    "id_required": true,
    "rdi": "COMMERCIAL",
    "tags": [
      "meal kit", "vip", "fragile", "perishable"
    ],
    "parcels": [
      {
        "dimensions": {
          "height": 10,
          "length": 25,
          "unit": "in",
          "width": 15
        },
        "weight": {
          "unit": "lb",
          "value": 1
        }
      }
    ],
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)"
  }'
import requests

url = "https://api.axlehire.com/v3/shipments/rating"

payload = '''
  {
    "customer": {
      "name": "John Doe",
      "email": "john.d@example.com",
      "phone_number": "123-456-7890"
    },
    "internal_id": "123",
    "workload": 1,
    "delivery_items": "One egg, two carrots, three tacos",
    "pickup_address": {
      "street": "1937 Davis Street",
      "street2": "Suite A",
      "city": "San Leandro",
      "state": "CA",
      "zipcode": "94577"
    },
    "pickup_earliest_ts": "2018-10-13T15:36:50.052Z",
    "pickup_latest_ts": "2018-10-13T16:23:50.052Z",
    "pickup_note": "Parking lot #3",
    "pickup_buffer": 300,
    "dropoff_address": {
        "street": "2250 Shattuck Avenue",
      "street2": "Penthouse",
      "city": "Berkeley",
      "state": "CA",
      "zipcode": "94704"
    },
    "dropoff_earliest_ts": "2018-10-14T16:00:00.052Z",
    "dropoff_latest_ts": "2018-10-14T17:23:50.052Z",
    "dropoff_note": "Please leave at the door, do not ring the bell!",
    "dropoff_buffer": 360,
    "delivery_proof_photo_required": true,
    "signature_required": true,
    "sms_enabled": true,
    "id_required": true,
    "rdi": "COMMERCIAL",
    "tags": [
      "meal kit", "vip", "fragile", "perishable"
    ],
    "parcels": [
      {
        "dimensions": {
          "height": 10,
          "length": 25,
          "unit": "in",
          "width": 15
        },
        "weight": {
          "unit": "lb",
          "value": 1
        }
      }
    ],
    "tracking_code": "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)"
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Token <YOUR TOKEN>",
  'Accept-Charset': "utf-8",
  'Accept': "application/json",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.json())
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.axlehire.com/v3/shipments/rating',
  headers:
   {'Cache-Control': 'no-cache',
     Accept: 'application/json',
     'Accept-Charset': 'utf-8',
     Authorization: 'Token <YOUR_TOKEN>',
     'Content-Type': 'application/json' },
  body:
   { customer:
         { name: 'John Doe',
           email: 'john.d@example.com',
           phone_number: '123-456-7890' },
        internal_id: '123',
        workload: 1,
        delivery_items: 'One egg, two carrots, three tacos',
        pickup_address:
         { street: '1937 Davis Street',
           street2: 'Suite A',
           city: 'San Leandro',
           state: 'CA',
           zipcode: '94577' },
        pickup_earliest_ts: "2018-10-13T15:36:50.052Z",
        pickup_latest_ts: "2018-10-13T16:23:50.052Z",
        pickup_note: 'Parking lot #3',
        pickup_buffer: 300,
        dropoff_address:
         { street: '2250 Shattuck Avenue',
           street2: 'Penthouse',
           city: 'Berkeley',
           state: 'CA',
           zipcode: '94704' },
        dropoff_earliest_ts: '2018-10-14T16:00:00.052Z',
        dropoff_latest_ts: '2018-10-14T17:23:50.052Z',
        dropoff_note: 'Please leave at the door, do not ring the bell!',
        dropoff_buffer: 360,
        delivery_proof_photo_required: true,
        signature_required: true,
        sms_enabled: true,
        id_required: true,
        rdi: "COMMERCIAL",
        tags: [ 'meal kit', 'vip', 'fragile', 'perishable' ],
        parcels: [ { dimensions: { height: 10, length: 25, unit: 'in', width: 15 },
          weight: { unit: 'lb', value: 1 } } ],
        tracking_code: "AXLEHIRE_UNIQUE_CODE_123 (highly recommended to skip this field, we will auto-generate)" },
   json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Above request will yield

{
    "base": 10.6,
    "pre_delivery_adjustment": -0.5,
    "post_delivery_adjustment": 0.1
}

Payload Specification

Parameter Data Type Validation Description
customer Customer required Customer information
internal_id String optional Your unique identifier of the shipment
workload Number optional Number of bags / boxes, default to 0
delivery_items String optional Delivery contents or packaging info for sortation teams
pickup_address Address required Customer pickup address
pickup_earliest_ts String optional The earliest timestamp (ISO-8601 format) that pickup could be done
pickup_latest_ts String optional The latest timestamp (ISO-8601 format) that pickup could be done
pickup_note String optional Pickup instruction
pickup_buffer Number optional Approximate pickup duration in seconds, AxleHire will auto-populate if omitted
dropoff_address Address required Dropoff address object
dropoff_earliest_ts String optional The earliest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_latest_ts String optional The latest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_buffer Number optional Approximate dropoff duration in seconds, AxleHire will auto-populate if omitted
dropoff_note String optional Dropoff instruction
delivery_proof_photo_required Boolean optional The flag to mandate taking photo at dropoff, default to false
signature_required Boolean optional The flag to mandate collecting recipient signature, default to true
id_required Boolean optional The flag to mandate checking recipient personal ID, default to true
tags Array of String optional Miscellaneous tags, default to empty []
parcels Array of Parcel optional List of parcels included in shipment
tracking_code String optional Tracking code, auto-generated by AxleHire (highly-recommended), unless requested otherwise (please talk to our engineers first)

Please see Price

Errors

AxleHire Public API uses the following error codes:

Error Code Meaning
400 Bad Request -- Your request components are invalid
401 Unauthorized -- Your API key is wrong.
403 Forbidden -- You don't have enough permission to perform this request.
404 Not Found -- Not Found
405 Method Not Allowed -- You request methods are invalid
406 Not Acceptable -- You payload contains unacceptable data (check the response message for more detail)
412 Precondition Failed -- You payload contains bad data (check the response message for more detail)
417 Expectation Failed -- Please check your payload
422 Unprocessable Entity - Please check your payload
429 Too Many Requests -- You are requesting too many
500 Internal Server Error -- We had a problem with our server. Try again later.
502 Bad Gateway -- We're temporarily offline for maintenance. Please try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

Webhooks

Format

Each webhook will @POST to your server with the following generic payload

Field Data Type Description
event String Event type
ts String Timestamp as ISO-8601 string
geolocation Geolocation Basic GPS data: latitude and longitude as float values
data EventData Event data

Geolocation

Field Data Type Description
latitude Number latitude as a floating point
longitude Number longitude as a floating point

Event Data

Field Data Type Description
shipment MiniShipment A small extraction of shipment
assignment MiniAssignment A small extraction of assignment
eta Number estimated milliseconds as an integer (if applicable) to the respective destination (pickup/dropoff/return)
ts_local String Timestamp as ISO-8601 string with time zone qualifier (e.g. -07:00 for America/Los_Angeles)
delayed_reason String Free-form text explanation of delay reason for SHIPMENT.DROPOFF_DELAY events

Mini Shipment

Field Data Type Description
shipment_id Number AxleHire Shipment unique identifier
internal_id String Your unique identifier of the shipment
tracking_code String Your unique identifier of the shipment
assignment_id String Unique identifier of the assignment that the shipment is part of
store_id String Unique identifier of the original Store that the shipment would be picked up (If applicable)
remark Remark Remarks left by AxleHire driver/dispatcher

Mini Assignment

Field Data Type Description
id Number AxleHire Assignment unique identifier
driver Driver Driver information
vehicle Vehicle Vehicle information
shipment_ids Array[Number] AxleHire unique identifiers of all associated shipments

Upon receiving webhook, you can use the info provided to event data to query for detailed

Shipment signals

curl -X POST \
  https://webhooks.axlehire.<YOUR_DOMAIN>.com \
  -H 'Authorization: Bearer <YOUR_WEBHOOK_TOKEN>' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{
   "event":"SHIPMENT.<SHIPMENT_SIGNAL>",
   "ts":"2018-08-27T14:10:00",
   "geolocation": { "latitude": 37.123, "longitude": -118.234 },
   "data":{
      "shipment":{
         "id":18273645,
         "internal_id":"W123",
         "remark": {
            "pickup": "Skipped if no remark at pickup",
            "dropoff": "Skipped if no remark at dropoff",
            "return": "Skipped if no remark at return"
         }
      },
      "eta": 600000
   }
}'
import requests

url = "https://webhooks.axlehire.<YOUR_DOMAIN>.com"

payload = '''
  {
     "event":"SHIPMENT.<SHIPMENT_SIGNAL>",
     "ts":"2018-08-27T14:10:00",
     "data":{
        "shipment":{
           "id":18273645,
           "internal_id":"W123",
           "remark": {
              "pickup": "Skipped if no remark at pickup",
              "dropoff": "Skipped if no remark at dropoff",
              "return": "Skipped if no remark at return"
           }
        },
        "eta": 600000
     },
     "geolocation":{
        "latitude":37.123,
        "longitude":-118.234
     },
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Bearer <YOUR_WEBHOOK_TOKEN>",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)

var request = require("request");

var options = { method: 'POST',
  url: 'https://webhooks.axlehire.<YOUR_DOMAIN>.com',
  headers:
   { 'Cache-Control': 'no-cache',
     Authorization: 'Bearer <YOUR_WEBHOOK_TOKEN>',
     'Content-Type': 'application/json' },
  body:
     { event: 'SHIPMENT.<SHIPMENT_SIGNAL>',
       ts: '2018-08-27T14:10:00',
       geolocation: { latitude: 37.123, longitude: -118.234 },
       data: { shipment: {
                  id: 18273645,
                  internal_id: 'W123',
                  remark: {pickup: "Skipped if no remark at pickup",
                           dropoff: "Skipped if no remark at dropoff",
                           return: "Skipped if no remark at return",
                          }},
               eta: 60000
             }
     },
    json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(body);
});

Possible values for <SIGMENT_SIGNAL>

Shipment Signal Description
GEOCODE_FAILED there is a problem with geocoding either pickup address or dropoff address
ASSIGNED shipment has been assigned to a driver
CANCELLED_BEFORE_PICKUP shipment has been cancelled before being picked up
PICKUP_DELAY driver reports there is a delay to pickup location
PICKUP_EN_ROUTE driver is on the way to pickup location
PICKUP_READY driver has arrived at pickup location and is ready to load
PICKUP_SUCCEEDED pickup done!
PICKUP_FAILED driver failed to pickup
CANCELLED_AFTER_PICKUP shipment has been cancelled after being picked up
UPDATE_DROPOFF shipment dropoff info has been updated such as geolocation, instruction, access code...
DROPOFF_DELAY driver reports there is a delay to dropoff location
DROPOFF_EN_ROUTE driver is on the way to dropoff location
DROPOFF_READY driver has arrived at dropoff location and is ready to unload
DROPOFF_FAILED driver failed to dropoff
DROPOFF_SUCCEEDED dropoff done!
RETURN_DELAY driver reports there is a delay to return location
RETURN_EN_ROUTE driver is on the way to return location
RETURN_READY driver has arrived at return location and is ready to unload
RETURN_FAILED driver failed to return
RETURN_SUCCEEDED return done!

Assignment signals

curl --request POST \
  --url https://webhooks.axlehire.<YOUR_DOMAIN>.com \
  --header 'Authorization: Bearer <YOUR_WEBHOOK_TOKEN>' \
  --header 'Cache-Control: no-cache' \
  --header 'Content-Type: application/json' \
  -d '{
     "event":"ASSIGNMENT.<ASSIGNMENT_SIGNAL>",
     "ts":"2018-08-27T14:10:00",
     "geolocation":{
        "latitude":37.123,
        "longitude":-118.234
     },
     "data":{
        "assignment":{
           "id":270,
           "driver":{
              "first_name":"Jason",
              "last_name": "Statham",
              "phone_number":"123456789",
              "profile_photo":"https://someExpirableUrl.com"
           },
           "vehicle":{
              "make":"Ford",
              "model":"Fiesta",
              "color":"Silver",
              "license_plate":"6XRT009"
              "license_plate_state":"CA"
           },
           "shipment_ids": [<SHIPMENT_ID_1>, <SHIPMENT_ID_2>]
        }
     }
  }'
import requests

url = "https://webhooks.axlehire.<YOUR_DOMAIN>.com"

payload = '''
  {
     "event":"ASSIGNMENT.<ASSIGNMENT_SIGNAL>",
     "ts":"2018-08-27T14:10:00",
     "geolocation":{
        "latitude":37.123,
        "longitude":-118.234
     },
     "data":{
        "assignment":{
           "id":270,
           "driver":{
              "first_name":"Jason",
              "last_name":"Statham",
              "phone_number":"123456789",
              "profile_photo":"https://someExpirableUrl.com"
           },
           "vehicle":{
              "make":"Ford",
              "model":"Fiesta",
              "color":"Silver",
              "license_plate":"6XRT009"
              "license_plate_state":"CA"
           },
           "shipment_ids": [<SHIPMENT_ID_1>, <SHIPMENT_ID_2>]
        }
     }
  }
'''
headers = {
  'Content-Type': "application/json",
  'Authorization': "Bearer <YOUR_WEBHOOK_TOKEN>",
  'Cache-Control': "no-cache",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
var request = require("request");

var options = { method: 'POST',
  url: 'https://webhooks.axlehire.<YOUR_DOMAIN>.com',
  headers:
   { 'Cache-Control': 'no-cache',
     Authorization: 'Bearer <YOUR_WEBHOOK_TOKEN>',
     'Content-Type': 'application/json' },
  body:
     { event: 'ASSIGNMENT.<ASSIGNMENT_SIGNAL>',
       ts: '2018-08-27T14:10:00',
       geolocation: { latitude: 37.123, longitude: -118.234 },
       data:
        { assignment:
           { id: 270,
             driver:
              { first_name: 'Jason',
                last_name: 'Statham',
                phone_number: '123456789',
                profile_photo: 'https://someExpirableUrl.com' },
             vehicle:
              { make: 'Ford',
                model: 'Fiesta',
                color: 'Silver',
                license_plate: '6XRT009',
                license_plate_state: 'CA'},
             shipment_ids: [<SHIPMENT_ID_1>, <SHIPMENT_ID_2>] } } },
    json: true };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Possible values for <ASSIGNMENT_SIGNAL>

Assignment Signal Description
DRIVER_ASSIGNED A driver has been assigned to the route
DRIVER_DEPLOYED The assigned driver has started working

Models

Customer

A customer represents the essential information we should know about your customer or the recipient.

Parameter Data Type Validation Description
name String required Recipient name, preferably full name for clarity, this will appear on labels
phone_number String phone recipient phone number, masked by using proxy when exposed to front-end applications
email String email recipient email, will not be exposed to front-end applications

Address

An address is a structured entity that contains address components

Parameter Data Type Validation Description
street String required Street number and street prefix/suffix, for example: 1234 East International Boulevard
street2 String optional Additional info such as floor level, unit/apartment number and split identifier.
city String required City name
state String required State name, preferably the two-letter-abbreviation, for example: CA
zipcode String required Zipcode, preferably without the extension, for example: 94704
latitude Number optional Address latitude
longitude Number optional Address longitude

Driver

Parameter Data Type Description
first_name String Driver first name
last_name String Driver last name
phone_number String A proxy phone number that links to the assigned driver
profile_photo String Driver's profile photo

Vehicle

Parameter Data Type Description
make String Vehicle's make, e.g Toyota
model String Vehicle's model, e.g. Rav4
color String Vehicle's color, e.g silver
license_plate String Vehicle's plate characters, e.g. 6XRT009
license_plate_state String Vehicle's license plate state, e.g CA

Price

Parameter Data Type Description
unit String Currency ticker (e.g: USD, CAD, NZD, BTC)
base Number Base price
pre_delivery_adjustment Number Pre-delivery adjustment
post_delivery_adjustment Number Post-delivery adjustment

Remark

Parameter Data Type Description
pickup String Remark left by driver at pickup location
dropoff String Remark left by driver at dropoff location
return String Remark left by driver at return location

Assignment

Parameter Data Type Description
id Long AxleHire Assignment unique identifier
driver Driver Driver information
vehicle Vehicle Vehicle information
shipment_ids Array of Number Shipment IDs associated with such assignment
label String The routing label associated with the assignment

Dimension

Parameter Data Type Description
width Double Width of parcel
height Double Height of parcel
length Double Length of parcel
unit String Measure unit: in, m, cm

Weight

Parameter Data Type Description
value Double Weight of parcel
unit String Measure unit: kg, lb

Parcel

Parameter Data Type Description
id String AxleHire Parcel unique identifier (not required at submission)
shipment_id Number AxleHire Shipment identifier that the parcel belong to (not required at submission)
parcel_id String Your unique identifier of the parcel
quatity Number Number of items
type String Type of the parcel (eg: box, bag, tote, pallet)
description String (optional) Detail about parcel [optional]
dimensions Dimension Dimension of parcel
weight Weight Weight of parcel
status String Given the status of current parcel, populated by AxleHire

Shipment

A shipment is an abstract entity that represents a package info, client info, recipient info, etc.

Parameter Data Type Description
id Number AxleHire Shipment unique identifier
customer Customer Customer information
internal_id String Your unique identifier of the shipment
workload Number (optional) Number of bags / boxes
delivery_items String (optional) Delivery contents or packaging info for sortation teams
pickup_address Address Customer pickup address
pickup_note String Pickup instruction and remarks
pickup_earliest_ts String The earliest timestamp (ISO-8601 format) that the pickup could be done
pickup_latest_ts String The latest timestamp (ISO-8601 format) that the pickup could be done
pickup_buffer Number Approximate pickup duration in seconds, AxleHire will auto-populate if omitted
dropoff_address Address Dropoff address object
dropoff_earliest_ts String The earliest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_latest_ts String The latest timestamp (ISO-8601 format) that the customer would accept the dropoff
dropoff_buffer Number Approximate dropoff duration in seconds, AxleHire will auto-populate if omitted
dropoff_note String Dropoff instruction and remarks
delivery_proof_photo_required Boolean The flag to mandate taking photo at dropoff
signature_required Boolean The flag to mandate collecting recipient signature
sms_enabled Boolean The flag to mandate sending SMS to recipients regarding progress
id_required Boolean The flag to mandate checking recipient personal ID
tags Array of String Miscellaneous tags, default to empty []
status String Shipment status, given the status of current shipment, populated by AxleHire
assignment_id Number Container assignment of the shipment, populated by AxleHire
is_cancelled Boolean Cancellation flag
tracking_code String Tracking code, auto-generated by AxleHire (highly-recommended), unless requested otherwise (please talk to our engineers first)
tracking_url String Tracking URL
rdi String Residential Delivery Indicator, either COMMERCIAL or RESIDENTIAL
remark Remark Remarks left by AxleHire driver/dispatcher
parcels Array of Parcel List of parcels included in shipment
items Array of Parcel List of items included in shipment

Drop-off windows

In most cases, shipments should be submitted to AxleHire with indicated delivery drop-off windows (dropoff_earliest_ts and dropoff_latest_ts, provided in ISO-8601 UTC time).

AxleHire uses these drop-off windows for planning purposes and to determine routes on which to place shipments.

If you do not know your shipment's delivery drop-off window at the time the shipment is submitted, please ask AxleHire to configure your account for late drop-off window support.

Delivery Coverage Areas

AxleHire currently delivers in these US states: AZ, CA, IL, IN, NJ, NY, OR, PA, TX, WA, WI

These are the valid states that can be passed in the pickup_address.state and dropoff_address.state fields.

Please reach out to AxleHire for specific ZIP code coverage within these states.

Shipments submitted with addresses out of our coverage area will have status UNSERVICEABLE (see below).

Life Cycle

This is the normal shipment status lifecycle from the time a shipment is submitted until the time it is picked up for delivery.

This is the normal shipment status lifecycle from the time a shipment is out for delivery until it has been dropped off.

Please see the full list of possible values below

Status Description
CREATED shipment submission is acknowledged
GEOCODED shipment pickup address and dropoff address have been successfully geocoded
GEOCODE_FAILED there is a problem with geocoding both pickup address and dropoff address
GEOCODE_FAILED_DROPOFF there is a problem with geocoding dropoff address
GEOCODE_FAILED_PICKUP there is a problem with geocoding pickup address
RECEIVED_OK shipment has been received at the designated AxleHire facility, only applicable for next-day service
RECEIVED_DAMAGED shipment has been received at the designated AxleHire facility but the staff found it to be damaged, only applicable for next-day service
MISSING shipment has not arrived at the designated AxleHire facility, only applicable for next-day service
ASSIGNED shipment has been assigned to a driver
UNSERVICEABLE shipment belongs to out of service regions
CANCELLED_BEFORE_PICKUP shipment has been cancelled before being picked up
PICKUP_DELAYED driver reports there is a delay to pickup location
PICKUP_EN_ROUTE driver is on the way to pickup location
PICKUP_READY driver has arrived at pickup location and is ready to load
PICKUP_SCHEDULED Shipment has been scheduled to be picked up by driver
PICKUP_SUCCEEDED pickup done!
PICKUP_FAILED driver failed to pickup
CANCELLED_AFTER_PICKUP shipment has been cancelled after being picked up
DROPOFF_DELAYED delivery is in progress, but shipment will likely be dropped off at a later time
DROPOFF_EN_ROUTE driver is on the way to dropoff location
DROPOFF_READY driver has arrived at dropoff location and is ready to unload
DROPOFF_ATTEMPTED shipment was not successfully delivered, and will be reattempted later.
DROPOFF_FAILED driver failed to dropoff
DROPOFF_SUCCEEDED dropoff done!
REATTEMPT shipment was not successfully delivered, driver is on the way to reattempt for a second time.
RESCHEDULED shipment was not successfully delivered, and needs to be scheduled for another day.
RETURN_DELAYED driver reports there is a delay to return location
RETURN_EN_ROUTE driver is on the way to return location
RETURN_READY driver has arrived at return location and is ready to unload
RETURN_FAILED driver failed to return
RETURN_SUCCEEDED return done!
UNDELIVERABLE shipment is not deliverable despite multiple attempts
DISPOSABLE shipment is either out of shape or expired and ready to dispose

Tip

Parameter Data Type Description
amount Number Tip amount
currency String Tip currency, default to USD
shipment_id Number Shipment ID
assignment_id Number Assignment ID
driver_id Number Driver ID
remark String Tip remark
created_at String Tip created timestamp as a ISO-8601 string

Event

Parameter Data Type Description
shipment_id Number Shipment ID
ts DateTime Occured timestamp as a ISO-8601 string
geolocation Geolocation Geolocation
signal String Event category a.k.a shipment status, see Life Cycle
eta Number Estimated time of arrival in milliseconds
remark String Remark given by driver
next_destination String Next planned destination type

Phone

Phone is valid US phone number, include +1 or not

Example:

Email

Valid email format

Email example: example@email.com