NAV Navigation
JavaScript Java Python .NET Ruby Go PHP

Overview

Hello!

Welcome to the Dropoff 3rd Party API documentation! The Dropoff API (via the Brawndo client SDKs) allows our customers to easily send orders via API, reducing the need for manual entry on our website.

We have bindings in the following languages: JavaScript, Java, Python, .NET, Ruby, Go, and PHP! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.

Ready to Start the Integration?

If you are ready to start your integration, email us at (api-support@dropoff.com) and we will get you set up with a sandbox environment.

Client

Instantiation

Instantiate an instance of ApiV1 in order to start making calls to the Brawndo service.

import com.dropoff.service.brawndo.client.java.api.ApiV1;
        
public class DropoffExample {
	public static void main(String[] args) {
	ApiV1 brawndo = new ApiV1();
	}
}
using System;
using Dropoff;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace DropoffExample {
  class Program {
    static void Main(string[] args) {
      ApiV1 brawndo = new ApiV1();
    }
  }
}

Configuration

You will then have to configure the Brawndo instance with the configure function.

var brawndo = require('brawndo');

var configure_params = {};
configure_params.api_url = 'https://sandbox-brawndo.dropoff.com/v1';
configure_params.host = 'sandbox-brawndo.dropoff.com';
configure_params.public_key = 'b123bebbce97f1b06382095c3580d1be4417dbe376956ae9';

configure_params.private_key = '87150f36c5de06fdf9bf775e8a7a1d0248de9af3d8930da0';

// or .....

configure_params.hasher_url = 'https://myserver.com/sign';
var brawndo = require('brawndo');

// ..... express setup .....

app.post('/do_sign', function(req, res) {
    if (req.session && req.session.public_key && req.session.private_key) {
        brawndo.configure({
            api_url : 'https://qa-brawndo.dropoff.com/v1',
            public_key : req.session.public_key,
            private_key : req.session.private_key
        });
        var signature = brawndo.createHash(params);
        res.status(200).json({ signature : signature });
    } else {
        res.status(401).end();
    }
});
String url = "https://sandbox-brawndo.dropoff.com/v1";
String host = "sandbox-brawndo.dropoff.com";
String private_key = "fcb60b8680d7b5c67921a852b39067a19d85318ce8abf4c512";
String public_key = "ced2eaf24f1eaf832c1ea92b41386b4a5982cfcdb69b7c7818";
    
brawndo.initialize(url, host, private_key, public_key);
import datetime
import time
import json

import ApiV1	

# class ApiV1:
# def __init__(self, api_url, base_path, host, private_key, public_key):

api = ApiV1.ApiV1(
	'sandbox-brawndo.dropoff.com', 
	'/v1', 
	'sandbox-brawndo.dropoff.com',
	'fcb60b8680d7b5c67921a852b39067a19d85318ce8abf4c512',
	'ced2eaf24f1eaf832c1ea92b41386b4a5982cfcdb69b7c7818')
string api_url = "https://sandbox-brawndo.dropoff.com/v1";
string host = "sandbox-brawndo.dropoff.com";
string private_key = "fcb60b8680d7b5c67921a852b39067a19d85318ce8abf4c512";
string public_key = "ced2eaf24f1eaf832c1ea92b41386b4a5982cfcdb69b7c7818";

brawndo.Initialize(api_url, host, private_key, public_key);
require_relative 'dropoff/brawndo'

config = {}
config['public_key'] = 'b123bebbce97f1b06382095c3580d1be4417dbe376956ae9'
config['private_key'] = '87150f36c5de06fdf9bf775e8a7a1d0248de9af3d8930da0'
config['api_url'] = 'https://sandbox-brawndo.dropoff.com/v1'
config['host'] = 'sandbox-brawndo.dropoff.com'

brawndo = Brawndo.new(config)
import (
	"dropoff.com/brawndo"
)

var t brawndo.Transport
t.ApiURL = "https://sandbox-brawndo.dropoff.com/v1"
t.Host = "sandbox-brawndo.dropoff.com"
t.PublicKey = "91e9b320b18375927592759179d0b3d5415db4b80d4b553f46580a60119afc8"
t.SecretKey = "7f8fee62743d7febcda6482364826dfbeacbf4726f62d6fda26a3b906817482"

var b brawndo.Client
b.Transport = &t
$public_key = 'b123bebbce97f1b06382095c3580d1be4417dbe376956ae9';
$private_key = '87150f36c5de06fdf9bf775e8a7a1d0248de9af3d8930da0';
$api_url = 'https://sandbox-brawndo.dropoff.com/v1';
$host = 'sandbox-brawndo.dropoff.com';
$brawndo = new \Dropoff\Brawndo($public_key, $private_key, $api_url, $host);

Configuration Parameters

Parameter Description Required
api_url url of the Brawndo API
host API host
public_key public key of the user that will be using the client
private_key private key of the user that will be using the client (can be substituted with hasher_url)
hasher_url endpoint that can be called to generate the Authorization header on the server side in case you don't want the private key to be stored on your client
Parameter Description Required
url url of the Brawndo API
host API host
public_key public key of the user that will be using the client
private_key private key of the user that will be using the client
Parameter Description Required
api_url url of the Brawndo API
base_path base path of url calls
host API host
public_key public key of the user that will be using the client
private_key private key of the user that will be using the client
Parameter Description Required
api_url url of the Brawndo API
host API host
public_key public key of the user that will be using the client
private_key private key of the user that will be using the client
Parameter Description Required
ApiURL url of the Brawndo API
Host API host
PublicKey public key of the user that will be using the client
SecretKey private key of the user that will be using the client

Info

Getting Your Account Information

brawndo.info(function(error, data) {
  if (error) {
    .....
  } else {
    .....
  }
});
JsonObject info = brawndo.info();
info = json.loads(api.info())
JObject info = brawndo.Info();
info_data = brawndo.info()
res, err := brawndo.Info()
$result = $brawndo->info();

Example JSON Response:

{
    "success": true,
    "timestamp": "2017-01-25T16:51:36Z",
    "data": {
        "client": {
            "company_name": "EnterpriseCo Global",
            "id": "1111111111110"
        },
        "user": {
            "first_name": "Algis",
            "last_name": "Woss",
            "id": "2222222222222"
        },
        "managed_clients": {
            "level": 0,
            "company_name": "EnterpriseCo Global",
            "id": "1111111111110",
            "children": [
                {
                    "level": 1,
                    "company_name": "EnterpriseCo Europe",
                    "id": "1111111111112",
                    "children": [
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo Paris",
                            "id": "1111111111111",
                            "children": []
                        },
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo London",
                            "id": "1111111111113",
                            "children": []
                        },
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo Milan",
                            "id": "1111111111114",
                            "children": []
                        }
                    ]
                },
                {
                    "level": 1,
                    "company_name": "EnterpriseCo NA",
                    "id": "1111111111115",
                    "children": [
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo Chicago",
                            "id": "1111111111116",
                            "children": []
                        },
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo New York",
                            "id": "1111111111117",
                            "children": []
                        },
                        {
                            "level": 2,
                            "company_name": "EnterpriseCo Los Angeles",
                            "id": "1111111111118",
                            "children": []
                        }
                    ]
                }
            ]
        }
    }
}

If you want to know your client id and name you can access this information via the info call.

If you are an enterprise client user, then this call will return all of the accounts that you are allowed to manage with your current account.

Enterprise Managed Clients

In the previous info example you see that keys for a user in an enterprise client are being used. It has clients that can be managed as its descendants.

The hierarchy looks something like this:

EnterpriseCo Global (1111111111110)
├─ EnterpriseCo Europe (1111111111112)
│  ├─ EnterpriseCo Paris (1111111111111)
│  ├─ EnterpriseCo London (1111111111113)
│  └─ EnterpriseCo Milan (1111111111114)
└─ EnterpriseCo NA (1111111111115)
   ├─ EnterpriseCo Chicago (1111111111116)
   ├─ EnterpriseCo New York (1111111111117)
   └─ EnterpriseCo Los Angeles (1111111111118)

Let's say I was using keys for a user in EnterpriseCo Europe, then the returned hierarchy would be:

EnterpriseCo Europe (1111111111112)
├─ EnterpriseCo Paris (1111111111111)
├─ EnterpriseCo London (1111111111113)
└─ EnterpriseCo Milan (1111111111114)

So what does it mean to manage an enterprise client? This means that you can:

All you have to do is specify the id of the client that you want to act on. So if you wanted to place orders for EnterpriseCo Paris you would make sure to include that client's id: "1111111111111".

Order Items

Getting order line items

var items_params = {};
items_params.company_id = ""; // optional

brawndo.order.items(items_params, function(error, items) {});
//companyId is optional
GetAvailableItemsParameters getAvailableItemsParameters = new GetAvailableItemsParameters();
getAvailableItemsParameters.setCompanyId(companyId);
JsonObject availableItems = brawndo.order.availableItems(getAvailableItemsParameters);
#company_id is optional
company_available_items = json.loads(api.order.available_items({'company_id': info['data']['client']['id']}))
OrderItemsParameters p = new OrderItemsParameters();
p.company_id = "asdfasd"; //optional
JObject items = brawndo.order.Items(p);
return items;
var item_params = {}
item_params.company_id = "" #optional
prop_data = brawndo.order.items(item_params)
// comapnyId is optional
var availableItemsRequest brawndo.AvailableItemsRequest
availableItemsRequest.CompanyId = "asdfasdf"
availableItemsResponse, err := b.AvailableItems(&availableItemsRequest)
$company_id = NULL; //optional
$result = $brawndo->order->items($company_id);

Depending on your client, you may have the ability to add items to an order. In order to determine if you can add items and which properties are disabled, optional, or required you can make a request to the items function. It will return the order items configuration for the specified client.

If you include the company_id you will retrieve that company's properties only if your account credentials are managing that account.

Note that the response contains some data that won't be necessary, the fields that will be needed to know how items are configured for your client are order_item_enabled and any field that contains _allow_. These fields will be of 3 values, 0 - disabled, 1 - optional, or 2 - required. If line items are optional and you include an item when creating an order, you must include all required _allow_ fields.

In the below output, line items are optional. The following are required fields: sku, person_name, description, dimensions, and temperature. Optional fields are: weight and quantity. Disabled fields are container and price.

Example JSON Response:

{ 
    data: {
        "order_item_temp_refrigerated_max_value": 42,
        "order_item_allow_sku": 2,
        "company_id": "7df2b0bdb418157609c0d5766fb7fb12",
        "order_item_allow_weight": 1,
        "order_item_enabled": 1,
        "order_item_allow_person_name": 2,
        "order_item_allow_quantity": 1,
        "order_item_allow_description": 2,
        "order_item_person_name_label": "Patient",
        "order_item_allow_dimensions": 2,
        "order_item_allow_container": 0,
        "order_item_temp_frozen_max_value": 2,
        "order_item_temp_unit": "F",
        "order_item_allow_price": 0,
        "order_item_allow_temperature": 2,
        "order_item_temp_frozen_min_value": 0,
        "order_item_temp_refrigerated_min_value": 40
    },
    "success": true,
    "timestamp": "2018-12-19T14:05:33Z"
}

Response

Attribute Description
order_item_temp_refrigerated_max_value The max temperature a refrigerated item can reach.
order_item_allow_sku Signifies whether the sku is an optional, required, or disabled field for a line item
company_id Company identifier for the order items configuration
order_item_allow_weight Signifies whether item weight is an optional, required, or disabled field for a line item
order_item_enabled Signifies line items are optional, required, or disabled.
order_item_allow_person_name Signifies whether person_name is an optional, required, or disabled field for a line item
order_item_allow_quantity Signifies whether quantity of an item is an optional, required, or disabled field for a line item
order_item_allow_description Signifes whether a description is optional, required, or disabled for a line item
order_item_person_name_label A label to be displayed when showing a person_name
order_item_allow_dimensions Signifies whether dimensions are optional, required, or disabled for a line item. Note - If diemensions are used for an item, you must include width, height, depth, and unit
order_item_allow_container Signifies whether a container type is optional, required, or disabled for a line item.
order_item_temp_frozen_max_value The max temperature a frozen item can reach
order_item_temp_unit The units that max/min temperatures represent. F or C
order_item_allow_price Signifies whether a price is optional, required, or disabled for a line item
order_item_allow_temperature Signifies whether a temperature type is optional, required, or disabled for a line item. Note - Frozen, refrigerated, etc.
order_item_temp_frozen_min_value The minimum temperature a frozen item can reach
order_item_temp_refrigerated_min_value The minimum temperature a refrigerated item can reach

Order Properties

Getting available order properties

var properties_params = {};
properties.params.company_id = ""; // optional

brawndo.order.properties(properties_params, function(error, props) {})
AvailablePropertiesParameters propsGetParams = new AvailablePropertiesParameters();
propsGetParams.setCompanyId(companyId); //optional
JsonObject props = brawndo.order.availableProperties(propsGetParams);
#company_id is optional
company_id = info['data']['client']['id']
available_properties_params = {'company_id': company_id}
properties = json.loads(api.order.available_properties(available_properties_params))
AvailablePropertiesParameters p = new AvailablePropertiesParameters();
p.company_id = "asdfasd"; //optional
JObject properties = brawndo.order.AvailableProperties(p);
return properties;
var prop_params = {}
prop_params.company_id = "" #optional
prop_data = brawndo.order.properties(prop_params)
var req brawndo.AvailablePropertiesRequest
req.CompanyId = ""
res, err := b.AvailableProperties(&req)
$company_id = NULL //optional
$result = $brawndo->order->properties($company_id);

Depending on your client, you may have the option to add properties to your order. In order to determine whether or not your client has properties, you can call the availableProperties method. It will return all the properties that can be applied to your orders during creation.

If you include a company_id you will retrieve that company's properties only if your account credentials are managing that account.

Example JSON Response:

	{
  		"data": [
    	{
      		"id": 1,
      		"label": "Leave at Door",
      		"description": "If recipient is not at home or at office, leave order at the door.",
      		"price_adjustment": 0,
      		"conflicts": [
      		  2
      		],
      		"requires": []
    	},
    	{
      		"id": 2,
      		"label": "Signature Required",
      		"description": "Signature is required for this order.",
      		"price_adjustment": 0,
      		"conflicts": [
      		  1
      		],
      		"requires": []
    	},
    	{
      		"id": 3,
      		"label": "Legal Filing",
      		"description": "This order is a legal filing at the court house. Please read order remarks carefully.",
      		"price_adjustment": 5.50,
      		"conflicts": [],
      		"requires": [
      			2
      		]
    	}
  		],
  		"count": 3,
  		"total": 3,
  		"success": true
	}

Response

Attribute Description
id the id of the property, you will use this value if you want to add the property to an order you are creating
label a simple description of the property
description more details about the property
price_adjustment a number that describes any additional charges that the property will require
conflicts an array of other property ids that cannot be included in an order when this property is set. In the above response, you cannot set both "Leave at Door" and "Signature Required"
requires an array of other property ids that must be included in an order when this property is set. In the above response, when "Legal Filing" is set on an order, then "Signature Required" should be set as well

Estimates

Getting an Estimate

var estimate_params = {};
estimate_params.origin = '117 San Jacinto Blvd, Austin, TX 78701, United States';  // required
estimate_params.destination = '800 Brazos Street, Austin, TX 78701, United States'; // required
estimate_params.utc_offset = '-06:00'; // required
estimate_params.ready_timestamp = 1425578400; // optional
EstimateParameters estimateParams = new EstimateParameters();
estimateParams.setOrigin("117 San Jacinto Blvd, Austin, TX 78701");
estimateParams.setDestination("901 S MoPac Expy, Austin, TX 78746");
SimpleDateFormat sdf = new SimpleDateFormat("zzz");
estimateParams.setUtcOffset(sdf.format(new Date()));
    
/******************************************/
/* Optional ready_timestamp calculation */
Calendar tomorrowTenAM = Calendar.getInstance();
tomorrowTenAM.setTime(new Date());
tomorrowTenAM.set(Calendar.HOUR_OF_DAY, 0);
tomorrowTenAM.set(Calendar.MINUTE, 0);
tomorrowTenAM.set(Calendar.SECOND, 0);
tomorrowTenAM.add(Calendar.DATE, 1);
tomorrowTenAM.add(Calendar.HOUR, 10);
estimateParams.setUtcOffset(sdf.format(tomorrowTenAM.getTime()));
long tomorrowTenAMSeconds = tomorrowTenAM.getTimeInMillis()/1000;
estimateParams.setReadyTimestamp(tomorrowTenAMSeconds);
/* End Optional ready_timestamp calculation */
/******************************************/
    
JsonObject estimate = null;
try {
    estimate = brawndo.order.estimate(estimateParams);
} catch (IllegalArgumentException iae) {
    iae.printStackTrace();
}
utc_offset = time.strftime('%z')
t = datetime.datetime.now()
tomorrow10Am = t.replace(hour=10, minute=0, second=0) + datetime.timedelta(days=1)
estimate_params = {
	'origin': '117 San Jacinto Blvd, Austin, TX 78701',
	'destination': '901 S MoPac Expy, Austin, TX 78746',
	'utc_offset': utc_offset,
	'ready_timestamp': tomorrow10Am.strftime('%s')}

estimate = json.loads(api.order.estimate(estimate_params))
EstimateParameters estimateParams = new EstimateParameters();
estimateParams.origin = "117 San Jacinto Blvd, Austin, TX 78701";
estimateParams.destination = "901 S MoPac Expy, Austin, TX 78746";
estimateParams.utc_offset = DateTime.Now.ToString("zzz");
//  ************************************************
//  ***** Optional ready_timestamp calculation *****
DateTime tomorrow = DateTime.Now.AddDays(1);
DateTime tomorrowTenAM = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day, 10, 0, 0, 0);
estimateParams.utc_offset = tomorrowTenAM.ToString("zzz");
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan diff = tomorrowTenAM.ToUniversalTime() - origin;
estimateParams.ready_timestamp = (Int32)Math.Floor(diff.TotalSeconds);
//  ***** End optional ready_timestamp calculation *****
//  ****************************************************
JObject estimate = brawndo.order.Estimate(estimateParams);
estimate_params = {}
estimate_params['origin'] = '4729 Burnet Rd, Austin, TX 78756'        #required
estimate_params['destination'] = '2517 Thornton Rd, Austin, TX 78704' #required
estimate_params['utc_offset'] = Time.now.utc_offset                   #required
estimate_params['ready_timestamp'] = Time.now.to_i                    #optional
var req brawndo.EstimateRequest

_, zone := time.Now().Zone()

req.Origin = "2517 Thornton Rd, Austin, TX 78704"
req.Destination = "800 Brazos St, Austin, TX 78704"
req.UTCOffset = zone
req.ReadyTimestamp = -1
req.CompanyId = ""

res, err := b.Estimate(origin, destination, o, ready)
$origin = '117 San Jacinto Blvd, Austin, TX 78701, United States';  // required
$destination = '800 Brazos Street, Austin, TX 78701, United States'; // required
$utc_offset = '-06:00'; // required
$ready_timestamp = 1425578400; // optional
$company_id = '1111111111111'; // optional

$result = $brawndo->estimate('800 Brazos St, Austin, TX 78701', '2517 Thornton Rd, Austin, TX 78704', date('P'), time(), $company_id);

Before you place an order you will first want to estimate the distance, eta, and cost for the delivery. The client provides an Estimate function for this operation.

Estimate Parameters

Parameter Description Required
origin the origin (aka the pickup location) of the order
destination the destination (aka the delivery location) of the order
utc_offset the utc offset of the timezone where the order is taking place
ready_timestamp unix timestamp (in seconds) representing when order is ready to be picked up. If not set, we assume immediate availability for pickup
company_id if you are using Brawndo as an enterprise client that manages other dropoff clients you can specify the managed client id whose estimate you want here. This is optional and only works for enterprise clients
Parameter Description Required
Origin the origin (aka the pickup location) of the order
Destination the destination (aka the delivery location) of the order
UTCOffset the utc offset of the timezone where the order is taking place
ReadyTimestamp unix timestamp (in seconds) representing when order is ready to be picked up. If not set, we assume immediate availability for pickup
CompanyId if you are using Brawndo as an enterprise client that manages other dropoff clients you can specify the managed client id whose estimate you want here. This is optional and only works for enterprise clients

Example JSON Response:

{
	"success": true,
	"timestamp": "2015-03-05T14:51:14+00:00",
	"data": {
		"ETA": "243.1",
		"Distance": "0.62",
		"From": "78701",
		"To": "78701",
		"asap": {
			"Price": "19.00",
			"ETA": "243.1",
			"Distance": "0.62"
		},
		"two_hr": {
			"Price": "17.00",
			"ETA": "243.1",
			"Distance": "0.62"
		},
		"four_hr": {
			"Price": "15.00",
			"ETA": "243.1",
			"Distance": "0.62"
		},
		"all_day": {
			"Price": "13.00",
			"ETA": "243.1",
			"Distance": "0.62"
		},
		"service_type": "standard"
	}
}

Response

Attribute Description
data contains the pricing information for the allowed delivery window based on the given ready time, so you will not always see every option
Distance the distance from the origin to the destination
ETA the estimated time (in seconds) it will take to go from the origin to the destination
From the origin zip code. Only available if you have a zip-to-zip rate card configured
To the destination zip code. Only available if you have a zip-to-zip rate card configured
asap the pricing for an order that needs to delivered within an hour of the ready time
two_hr the pricing for an order that needs to delivered within two hours of the ready time
four_hr the pricing for an order that needs to delivered within four hours of the ready time
all_day the pricing for an order that needs to delivered by end of business on a weekday
service_type the service type for pricing, could be standard, holiday, or after_hr

Orders

Placing an Order

Given a successful estimate call, and a time window that you like, an order can be placed. An order requires origin information, destination information, and specifics about the order.

Origin and Destination Address Data

The origin and destination contain information regarding the addresses in the order.

var origin = {
    address_line_1 : '117 San Jacinto Blvd',  // required
    company_name : 'Gus\'s Fried Chicken',    // required
    first_name : 'Napoleon',                  // required
    last_name : 'Bonner',                     // required
    phone : '5124744877',                     // required
    email : 'orders@gussfriedchicken.com',    // required
    city : 'Austin',                          // required
    state : 'TX',                             // required
    zip : '78701',                            // required
    lat : '30.263706',                        // required
    lng : '-97.741703',                       // required
    remarks : 'Be nice to napoleon'           // optional
};

var destination = {
    address_line_1 : '800 Brazos Street',     // required
    address_line_2 : '250',                   // optional
    company_name : 'Dropoff Inc.',            // required
    first_name : 'Algis',                     // required
    last_name : 'Woss',                       // required
    phone : '8444376763',                     // required
    email : 'deliveries@dropoff.com',         // required
    city : 'Austin',                          // required
    state : 'TX',                             // required
    zip : '78701',                            // required
    lat : '30.269967',                        // required
    lng : '-97.740838'                        // required
};
OrderCreateParameters orderCreateParams = new OrderCreateParameters();
    
OrderCreateAddress originParams = new OrderCreateAddress();
originParams.setCompanyName("Gus's Fried Chicken");
originParams.setFirstName("Napoleon");
originParams.setLastName("Bonner");
originParams.setAddressLine1("117 San Jacinto Blvd");
//originParams.setAddressLine2("");
originParams.setCity("Austin");
originParams.setState("TX");
originParams.setZip("78701");
originParams.setPhone("5125555555");
originParams.setEmail("cluckcluck@gusfriedchicken.com");
originParams.setLat(30.263706);
originParams.setLng(-97.741703);
originParams.setRemarks("Origin Remarks");
    
orderCreateParams.setOrigin(originParams);
    
OrderCreateAddress destinationParams = new OrderCreateAddress();
destinationParams.setCompanyName("Dropoff");
destinationParams.setFirstName("Jason");
destinationParams.setLastName("Kastner");
destinationParams.setAddressLine1("901 S MoPac Expy");
destinationParams.setAddressLine2("#150");
destinationParams.setCity("Austin");
destinationParams.setState("TX");
destinationParams.setZip("78746");
destinationParams.setPhone("512-555-5555");
destinationParams.setEmail("jkastner+java+dropoff@dropoff.com");
destinationParams.setLat(30.264573);
destinationParams.setLng(-97.782073);
destinationParams.setRemarks("Please use the front entrance. The back one is guarded by cats!");
    
orderCreateParams.setDestination(destinationParams);
origin_params = {
  'company_name': "Gus's Fried Chicken",
  'first_name': 'Napoleon',
  'last_name': 'Bonner',
  'address_line_1': '117 San Jacinto Blvd',
  'address_line_2': '',
  'city': 'Austin',
  'state': 'TX',
  'zip': '78701',
  'phone': '5125555555',
  'email': 'cluckcluck@gusfriedchicken.com',
  'lat': 30.263706,
  'lng': -97.741703,
  'remarks': 'Origin Remarks'}

destination_params = {
  'company_name': 'Dropoff',
  'first_name': 'Jason',
  'last_name': 'Kastner',
  'address_line_1': '901 S MoPac Expy',
  'address_line_2': '#150',
  'city': 'Austin',
  'state': 'TX',
  'zip': '78746',
  'phone': '512-555-5555',
  'email': 'jkastner+python+dropoff@dropoff.com',
  'lat': 30.264573,
  'lng': -97.782073,
  'remarks': 'Please use the front entrance. The back one is guarded by cats!'}
OrderCreateParameters orderCreateParams = new OrderCreateParameters();

orderCreateParams.origin = new OrderCreateAddress();
orderCreateParams.origin.company_name = "Gus's Fried Chicken";
orderCreateParams.origin.first_name = "Napoleon";
orderCreateParams.origin.last_name = "Bonner";
orderCreateParams.origin.address_line_1 = "117 San Jacinto Blvd";
//orderCreateParams.origin.address_line_2 = "";
orderCreateParams.origin.city = "Austin";
orderCreateParams.origin.state = "TX";
orderCreateParams.origin.zip = "78701";
orderCreateParams.origin.phone = "5125555555";
orderCreateParams.origin.email = "cluckcluck@gusfriedchicken.com";
orderCreateParams.origin.lat = 30.263706;
orderCreateParams.origin.lng = -97.741703;
//orderCreateParams.origin.remarks = "";

orderCreateParams.destination = new OrderCreateAddress();
orderCreateParams.destination.company_name = "Dropoff";
orderCreateParams.destination.first_name = "Algis";
orderCreateParams.destination.last_name = "Woss";
orderCreateParams.destination.address_line_1 = "901 S MoPac Expy";
orderCreateParams.destination.address_line_2 = "#150";
orderCreateParams.destination.city = "Austin";
orderCreateParams.destination.state = "TX";
orderCreateParams.destination.zip = "78746";
orderCreateParams.destination.phone = "512-555-5555";
orderCreateParams.destination.email = "awoss@dropoff.com";
orderCreateParams.destination.lat = 30.264573;
orderCreateParams.destination.lng = -97.782073;
orderCreateParams.destination.remarks = "Please use the front entrance.  The back one is guarded by cats!";
origin = {
  address_line_1 => '117 San Jacinto Blvd',  # required
  company_name => 'Gus\'s Fried Chicken',    # required
  first_name => 'Napoleon',                  # required
  last_name => 'Bonner',                     # required
  phone => '5124744877',                     # required
  email => 'orders@gussfriedchicken.com',    # required
  city => 'Austin',                          # required
  state => 'TX',                             # required
  zip => '78701',                            # required
  lat => '30.263706',                        # required
  lng => '-97.741703',                       # required
  remarks => 'Be nice to napoleon'           # optional
}

destination = {
  address_line_1 => '800 Brazos Street',     # required
  address_line_2 => '250',                   # optional
  company_name => 'Dropoff Inc.',            # required
  first_name => 'Algis',                     # required
  last_name => 'Woss',                       # required
  phone => '8444376763',                     # required
  email => 'deliveries@dropoff.com',         # required
  city => 'Austin',                          # required
  state => 'TX',                             # required
  zip => '78701',                            # required
  lat => '30.269967',                        # required
  lng => '-97.740838'                        # required
}
type CreateOrderAddress struct {
  CompanyName     string
  Email           string
  Phone           string
  FirstName       string
  LastName        string
  AddressLine1    string
  AddressLine2    string
  City            string
  State           string
  Zip             string
  Remarks         string
  Lat             float64
  Lng             float64
}

var cor_o, cor_d brawndo.CreateOrderAddress

cor_o.CompanyName = "Dropoff GO Origin"
cor_o.Email = "noreply+origin@dropoff.com"
cor_o.Phone = "5124744877"
cor_o.FirstName = "Napoleon"
cor_o.LastName = "Bonner"
cor_o.AddressLine1 = "117 San Jacinto Blvd"
//cor_o.AddressLine2 = ""
cor_o.City = "Austin"
cor_o.State = "TX"
cor_o.Zip = "78701"
cor_o.Lat = 30.263706
cor_o.Lng = -97.741703
cor_o.Remarks = "Be nice to napoleon"

cor_d.CompanyName = "Dropoff GO Destination"
cor_d.Email = "noreply+destination@dropoff.com"
cor_d.Phone = "5555554444"
cor_d.FirstName = "Del"
cor_d.LastName = "Fitzgitibit"
cor_d.AddressLine1 = "800 Brazos Street"
cor_d.AddressLine2 = "250"
cor_d.City = "Austin"
cor_d.State = "TX"
cor_d.Zip = "78701"
cor_d.Lat = 30.269967
cor_d.Lng = -97.740838
//cor_d.Remarks = "Optional remarks"
$destination = array(
  'company_name' => 'Dropoff PHP Destination',     // required
  'email' => 'awoss+phpd@dropoff.com',             // required
  'phone' => '5555554444',                         // required
  'first_name' => 'Del',                           // required
  'last_name' => 'Fitzgitibit',                    // required
  'address_line_1' => '800 Brazos Street',         // required
  'address_line_2' => '250',                       // optional
  'city' => 'Austin',                              // required
  'state' => 'TX',                                 // required
  'zip' => '78701',                                // required
  'lat' => 30.269967,                              // required
  'lng' => -97.740838                              // required
);

$origin = array(
  'company_name' => 'Dropoff PHP Destination',     // required
  'email' => 'awoss+gus@dropoff.com',              // required
  'phone' => '5124744877',                         // required
  'first_name' => 'Napoleon',                      // required
  'last_name' => 'Bonner',                         // required
  'address_line_1' => '117 San Jacinto Blvd',      // required
  'city' => 'Austin',                              // required
  'state' => 'TX',                                 // required
  'zip' => '78701',                                // required
  'lat' => 30.263706,                              // required
  'lng' => -97.741703,                             // required
  'remarks' => 'Be nice to napoleon'               // optional
);

General Address Parameters

Parameter Description Required
address_line_1 the street information for the origin or destination
address_line_2 additional information for the address for the origin or destination (ie suite number)
company_name the name of the business for the origin or the destination
first_name the first name of the contact at the origin or destination
last_name the last name of the contact at the origin or destination
phone the contact number at the origin or destination
email the email address for the origin or destination
city the city for the origin or destination
state the state for the origin or destination
zip the zip code for the origin or destination
lat the latitude for the origin or destination
lng the longitude for the origin or destination
remarks additional instructions for the origin or destination
Parameter Description Required
AddressLine1 the street information for the origin or destination
AddressLine2 additional information for the address for the origin or destination (ie suite number)
CompanyName the name of the business for the origin or the destination
FirstName the first name of the contact at the origin or destination
LastName the last name of the contact at the origin or destination
Phone the contact number at the origin or destination
Email the email address for the origin or destination
City the city for the origin or destination
State the state for the origin or destination
Zip the zip code for the origin or destination
Lat the latitude for the origin or destination
Lng the longitude for the origin or destination
Remarks additional instructions for the origin or destination

Order Details Data

The details contain attributes about the order.

var details = {
    quantity : 1,                   // required
    weight : 5,                     // required
    eta : void(0),                  // required
    distance : void(0),             // required
    price : void(0),                // required
    ready_date : 1425578400,        // required
    type : void(0),                 // required
    reference_name : void(0),       // optional
    reference_code : void(0)        // optional
};
OrderCreateDetails details = new OrderCreateDetails();
details.setReadyDate(tomorrowTenAMSeconds);
details.setType("two_hr");
details.setQuantity(10);
details.setWeight(20);
// We are using the pricing for the two_hr time frame
// for the estimate result we called 	earlierdetails.setDistance(estimate.get("data").getAsJsonObject().get("Distance").getAsString());
details.setEta(estimate.get("data").getAsJsonObject().get("ETA").getAsString());
details.setPrice(estimate.get("data").getAsJsonObject().get("two_hr").getAsJsonObject().get("Price").getAsString());
    
orderCreateParams.setDetails(details);
distance = estimate['data']['Distance']
eta = estimate['data']['ETA']
price = estimate['data']['two_hr']['Price']
details_params = {
  'ready_date': tomorrow10Am.strftime('%s'),
  'type': 'two_hr',
  'quantity': 10,
  'weight': 20,
  'distance': distance,
  'eta': eta,
  'price': price}
orderCreateParams.details = new OrderCreateDetails();
orderCreateParams.details.ready_date = (Int32)Math.Floor(diff.TotalSeconds);
orderCreateParams.details.type = "two_hr";
orderCreateParams.details.quantity = 10;
orderCreateParams.details.weight = 20;
//  We are using the pricing for the two_hr time frame 
//  for the estimate result we called earlier
orderCreateParams.details.distance = (string) estimate["data"]["two_hr"]["Distance"];
orderCreateParams.details.eta = (string) estimate["data"]["two_hr"]["ETA"];
orderCreateParams.details.price = (string)estimate["data"]["two_hr"]["Price"];
details = {
  quantity => 1,                      # required
  weight => 5,                        # required
  eta => void(0),                     # required
  distance => nil,                    # required
  price => nil,                       # required
  ready_date => Time.now.utc_offset,  # required
  type => nil,                        # required
  reference_name => nil,              # optional
  reference_code => nil               # optional
}
type CreateOrderDetails struct {
  Quantity      int64
  Weight        int64
  ETA           string
  Distance      string
  Price         string
  ReadyDate     int64
  Type          string
  ReferenceCode string
  ReferenceName string
}

var cor_det brawndo.CreateOrderDetails

cor_det.Quantity = 1
cor_det.Weight = 5
cor_det.ETA = "448.5"
cor_det.Distance = "0.64"
cor_det.Price = "13.99"
cor_det.ReadyDate = time.Now().Unix()
cor_det.Type = "two_hr"
cor_det.ReferenceCode = "reference code 0001"
cor_det.ReferenceName = "reference name"
$details = array(
  'quantity' => 1,                         // required
  'weight' => 5,                           // required
  'eta' => '448.5',                        // required
  'distance' => '0.64',                    // required
  'price' => '13.99',                      // required
  'ready_date' => time(),                  // required
  'type' => 'two_hr',                      // required
  'reference_name' => 'Reference Name',    // optional
  'reference_code' => 'Reference Code'     // optional
);

Details Parameters

Parameter Description Required
quantity the number of packages in the order
weight the weight of the packages in the order. A heavier order could be subject to a price adjustment.
eta the eta from the origin to the destination. Should use the value retrieved in the getEstimate call
distance the distance from the origin to the destination. Should use the value retrieved in the getEstimate call
price the price for the order. Should use the value retrieved in the getEstimate call
ready_date the unix timestamp (seconds) indicating when the order can be picked up. Can be up to 60 days into the future
type the order window. Can be asap, two_hr, four_hr, or all_day depending on the ready_date
reference_name a field for your internal referencing
reference_code a field for your internal referencing
Parameter Description Required
Quantity the number of packages in the order
Weight the weight of the packages in the order. A heavier order could be subject to a price adjustment.
ETA the eta from the origin to the destination. Should use the value retrieved in the getEstimate call
Distance the distance from the origin to the destination. Should use the value retrieved in the getEstimate call
Price the price for the order. Should use the value retrieved in the getEstimate call
ReadyDate the unix timestamp (seconds) indicating when the order can be picked up. Can be up to 60 days into the future
Type the order window. Can be asap, two_hr, four_hr, or all_day depending on the ready_date
ReferenceName a field for your internal referencing
ReferenceCode a field for your internal referencing

Order Items Data

var items = [
  {
    "sku": "128UV9",
    "quantity": 3,
    "weight": 10,
    "height": 1.4,
    "width": 1.2,
    "depth": 2.3,
    "unit": "ft",
    "container": brawndo.CONTAINERS.BOX,
    "description": "Box of t-shirts",
    "price": "59.99",
    "temperature": brawndo.TEMPERATURES.NA,
    "person_name": "T. Shirt"
  },
  {
    "sku": "128UV8",
    "height": 9.4,
    "width": 6.2,
    "depth": 3.3,
    "unit": "in",
    "container": brawndo.CONTAINERS.BOX,
    "description": "Box of socks",
    "price": "9.99",
    "temperature": brawndo.TEMPERATURES.NA,
    "person_name": "Jim"
  }
];
OrderLineItems lineItem1 = new OrderLineItems();
lineItems.setContainer(Order.CONTAINER_BOX);
lineItems.setDescription("Please be descriptive about your description");
lineItems.setWidth("50");
lineItems.setHeight("10");
lineItems.setDepth("5");
lineItems.setPerson_name("Johnny Is");
lineItems.setPrice("10000");
lineItems.setQuantity(2);
lineItems.setSku("4343434343");
lineItems.setTemperature(Order.TEMP_REFRIGERATED);
lineItems.setWeight("12");
lineItems.setUnit("ft");

OrderLineItems[] allItems = new OrderLineItems[] {lineItem1};
orderCreateParams.setItems(allItems);
order_items = [
  {
    "sku": "123456123456",
    "container": Order.CONTAINER_BAG,
    "weight": 5,
    "person_name": "milller jack",
    "quantity": 2,
    "description": "this order is very important",
    "unit": "ft",
    "height": 4,
    "width": 4,
    "depth": 5,
    "price": "10.55",
    "temperature": Order.TEMP_NA
  },
  {
    "sku": "1234561523456",
    "container": Order.CONTAINER_BOX,
    "weight": 5,
    "person_name": "milller jack2",
    "quantity": 2,
    "description": "this order is very important",
    "unit": "ft",
    "height": 4,
    "width": 4,
    "depth": 5,
    "price": "10.55",
    "temperature": Order.TEMP_FROZEN
  }
]
OrderCreateItem item1 = new OrderCreateItem();
item1.sku = "128UV9";
item1.quantity = 3;
item1.weight = 10;
item1.height = 1.4;
item1.width = 1.2;
item1.depth = 2.3;
item1.unit = "ft";
item1.container = brawndo.order.ContainerBox;
item1.description = "Box of t-shirts";
item1.price = "59.99";
item1.temperature = brawndo.order.TempNa;
item1.person_name = "T. Shirt";

OrderCreateItem item2 = new OrderCreateItem();
item2.sku = "128UV8";
item2.height = 9.4;
item2.width = 6.2;
item2.depth = 3.3;
item2.unit = "in";
item2.container = brawndo.order.ContainerBox;
item2.description = "Box of socks";
item2.price = "9.99";
item2.temperature = brawndo.order.TempNa;
item2.person_name = "Jim";

orderCreateParams.items = new OrderCreateItem[2];
orderCreateParams.items[0] = item1;
orderCreateParams.items[1] = item2;
items = [
  {
    'sku' => '128UV9',
    'quantity' => 3,
    'weight' => 10,
    'height' => 1.4,
    'width' => 1.2,
    'depth' => 2.3,
    'unit' => 'ft',
    'container' => brawndo.order.containers[:BOX],
    'description' => 'Box of t-shirts',
    'price' => 59.99,
    'temperature' => brawndo.order.temperatures[:NA],
    'person_name' => 'T. Shirt'
  },
  {
    'sku' => '128UV8',
    'height' => 9.4,
    'width' => 6.2,
    'depth' => 3.3,
    'unit' => 'in',
    'container' => brawndo.order.containers[:BOX],
    'description' => 'Box of socks',
    'price' => 9.99,
    'temperature' => brawndo.order.temperatures[:NA],
    'person_name' => 'Jim'
  }
]
var cor_item1 brawndo.CreateOrderItem

cor_item1.Container=brawndo.CONTAINER_TRAY
cor_item1.Description="Please handle gently"
cor_item1.Width="5"
cor_item1.Height="5"
cor_item1.Depth="5"
cor_item1.PersonName="John Locke"
cor_item1.Price="15.99"
cor_item1.Quantity=2
cor_item1.Sku="123456123456"
cor_item1.Temperature=brawndo.TEMP_AMBIENT
cor_item1.Weight="10"
cor_item1.Unit="in"

items := []brawndo.CreateOrderItem {cor_item1}
$items = array(
  array(
    'sku' => '128UV9',
    'quantity' => 3,
    'weight' => 10,
    'height' => 1.4,
    'width' => 1.2,
    'depth' => 2.3,
    'unit' => 'ft',
    'container' => $brawndo->order->containers['BOX'],
    'description' => 'Box of t-shirts',
    'price' => 59.99,
    'temperature' => $brawndo->order->temperatures['NA'],
    'person_name' => 'T. Shirt'
  ),
  array(
    'sku' => '128UV8',
    'height' => 9.4,
    'width' => 6.2,
    'depth' => 3.3,
    'unit' => 'in',
    'container' => $brawndo->order->containers['BOX'],
    'description' => 'Box of socks',
    'price' => 9.99,
    'temperature' => $brawndo->order->temperatures['NA'],
    'person_name' => 'Jim'
  )
);

The items section is an array of line items that meet the conditions specified when getting client's order item preferences.

Some notes about items, here are all possible options that can be included but which are setup for your client must be determined when getting your order items:

Passing fields that are disabled for the client will automatically fail creating the order and NOT passing required fields will automatically fail creating the order.

If height, depth, width, or unit is used, then all 4 must be set. These are all related to order_item_allow_dimensions. That option must be either required or optional to use height, depth, width, or unit.

Qunatity and weight passed in the details data above will be overwritten by the quantity and weight of your items if they are included. If quantity or weight is optional and only included on some items then those without quantity or weight will increment by 1. The example would have a total order weight of 11 and quantity of 4.

Items Parameters

Parameter Description
sku Must be a string
quantity Must be a positive integer
weight Must be a number greater than 0
height Must be a number greater than 0
depth Must be a number greater than 0
width Must be a number greater than 0
unit Must be in the array, ['in','ft','cm','mm','m']
container Must be in the array, ['NA','BAG','BOX','TRAY','PALLET','BARREL','BASKET','BUCKET','CARTON','CASE','COOLER','CRATE','TOTE']
description Must be a string
price Must be a valid price format in dollars and cents, ex. 10, 10.5, 10.50, 10.0, 10.00
temperature Must be in the array, ['NA','AMBIENT','REFRIGERATED','FROZEN']
person_name Must be a string
Parameter Description
Sku Must be a string
Quantity Must be a positive integer
Weight Must be a number greater than 0
Height Must be a number greater than 0
Depth Must be a number greater than 0
Width Must be a number greater than 0
Unit Must be in the array, ['in','ft','cm','mm','m']
Container Must be in the array, ['NA','BAG','BOX','TRAY','PALLET','BARREL','BASKET','BUCKET','CARTON','CASE','COOLER','CRATE','TOTE']
Description Must be a string
Price Must be a valid price format in dollars and cents, ex. 10, 10.5, 10.50, 10.0, 10.00
Temperature Must be in the array, ['NA','AMBIENT','REFRIGERATED','FROZEN']
PersonName Must be a string

Order Properties Data

var properties = [ 2, 3 ];
int[] createOrderProps = {2,3};
orderCreateParams.setProperties(createOrderProps);
properties = [2, 3]
orderCreateParams.details.properties = new Int32[] { 2, 3 };
properties = [ 2, 3 ]
cor.Properties = [2]int64[2,3]
$properties = array( 2, 3 );

The properties section is an array of property ids to add to the order.

Creating an Order

Once this data is created, you can create the order.

brawndo.order.create({
    origin : origin,
    destination : destination,
    details : details,
    properties : properties,
    items: items
}, function(error, data) {
});
JsonObject createResponse = brawndo.order.create(orderCreateParams);
create_params = {
  'origin': origin_params,
  'destination': destination_params,
  'details': details_params,
  'properties': properties,
  'items': order_items
  }
 	
order_create = json.loads(api.order.create(create_params))
JObject createResponse = brawndo.order.Create(orderCreateParams);
order = {
  origin => origin,
  destination => destination,
  details => details,
  properties => properties,
  items => items
}

order_create_response = brawndo.order.create(order)
type CreateOrderRequest struct {
	Details     *CreateOrderDetails
	Origin      *CreateOrderAddress
  Destination *CreateOrderAddress
  Items       []CreateOrderItem
	Properties  []int64
	CompanyId   string
}

var cor brawndo.CreateOrderRequest

cor.Details = &cor_det
cor.Destination = &cor_d
cor.Origin = &cor_o
cor.Items = items
cor.Properties =

res,err := b.CreateOrder(&cor)
$new_order = array(
  'origin' => $origin,
  'destination' => $destination,
  'details' => $details,
  'properties' => $properties,
  'items' => $items
);

$result = $brawndo->order->create($new_order);

Note that if you want to create this order on behalf of a managed client as an enterprise client user you will need to specify the company_id.

brawndo.order.create({
    origin : origin,
    destination : destination,
    details : details,
    properties : properties,
    items: items,
    company_id : '1111111111111'
}, function(error, data) {
});
orderCreateParams.setCompanyId("1111111111111");
JsonObject createResponse = brawndo.order.create(orderCreateParams);
create_params = {
  'origin': origin_params,
  'destination': destination_params,
  'details': details_params,
  'company_id': '1111111111111',
  'items': order_items

}
 	
order_create = json.loads(api.order.create(create_params))
orderCreateParams.company_id = "1111111111111";
JObject createResponse = brawndo.order.Create(orderCreateParams);
order = {
  origin => origin,
  destination => destination,
  details => details,
  items => items,
  company_id => '1111111111111'
}

order_create_response = brawndo.order.create(order)
var cor brawndo.CreateOrderRequest

cor.Details = &cor_det
cor.Destination = &cor_d
cor.Origin = &cor_o
cor.Items = items
cor.Properties = []int64[2,3]
cor.CompanyId = "1111111111111"

res,err := b.CreateOrder(&cor)
$new_order = array(
  'origin' => $origin,
  'destination' => $destination,
  'details' => $details,
  'items' => $items,
  'company_id' => '1111111111111'
);

$result = $brawndo->order->create($new_order);

The data in the callback will contain the id of the new order as well as the url where you can track the order progress.

String created_order_id = createResponse.get("data").getAsJsonObject().get("order_id").getAsString();
String created_order_url = createResponse.get("data").getAsJsonObject().get("url").getAsString();
created_order_id = order_create['data']['order_id']
created_order_url = order_create['data']['url']
string created_order_id = (string)createResponse["data"]["order_id"];
string created_order_url = (string)createResponse["data"]["url"];
order_id = order_response_data['data']['order_id']
url = order_response_data['data']['url']
response.Data.OrderId
response.Data.URL
$order_id = $result['data']['order_id']
$url = $result['data']['url']

Cancelling an Order

brawndo.order.cancel(order_id, function(error, data) {});
OrderCancelParameters cancelParams = new OrderCancelParameters();
cancelParams.setOrderId(created_order_id);
JsonObject cancelResponse = brawndo.order.cancel(cancelParams);
order_cancel_params = {
  'order_id': created_order_id}
	
cancel = json.loads(api.order.cancel(order_cancel_params))
OrderCancelParameters cancelParameters = new OrderCancelParameters();
cancelParameters.order_id = created_order_id;
JObject cancelResult = brawndo.order.Cancel();
order_cancel_response = brawndo.order.cancel(order_id)
var req brawndo.OrderRequest

req.OrderId = "abcdef1234567890fedcba"
req.CompanyId = ""

res, err := b.CancelOrder(&req)
//Cancel an order created for the client that your keys represent
$order_id = '12345fedcba67890abcdef';
$result = $brawndo->order->cancel($order_id);

Note that if you want to cancel this order on behalf of a managed client as an enterprise client user you will need to specify the company_id.

  brawndo.order.cancel({
    order_id : 'zzzz-zzzz-zzz',
    company_id : '1111111111111'
  },
  function(error, data) {
  });
OrderCancelParameters cancelParams = new OrderCancelParameters();
cancelParams.setOrderId(created_order_id);
cancelParams.setCompanyId("1111111111111");
JsonObject cancelResponse = brawndo.order.cancel(cancelParams);
order_cancel_params = {
  'order_id': created_order_id,
  'company_id': '1111111111111'}
	
cancel = json.loads(api.order.cancel(order_cancel_params))
OrderCancelParameters cancelParameters = new OrderCancelParameters();
cancelParameters.order_id = created_order_id;
cancelParameters.company_id = "1111111111111";
JObject cancelResult = brawndo.order.Cancel();
order_cancel_data = { 
  order_id => '61AE-Ozd7-L12',
  company_id => '1111111111111'
}

order_cancel_response = brawndo.order.cancel(order_cancel_data)
var req brawndo.OrderRequest

req.OrderId = "abcdef1234567890fedcba"
req.CompanyId = "1111111111111"

res, err := b.CancelOrder(&req)
//Cancel an order created for a managed client that is a descendant of your enterprise client that your keys represent
$order_id = '123321abcdeffedcba6789';
$company_id = '1111111111111';
$result = $brawndo->order->cancel($order_id, $company_id);

Example JSON Response:

{
	"success": true,
	"timestamp": "2017-06-06T13:15:32Z"
}

Cancel Parameters

Parameter Description Required
order_id the id of the order to cancel
company_id if you are using Brawndo as an enterprise client that manages other dropoff clients you can specify the managed client id who you would like to cancel an order for. This only works for enterprise clients
Parameter Description Required
OrderId the id of the order to cancel
CompanyId if you are using Brawndo as an enterprise client that manages other dropoff clients you can specify the managed client id who you would like to cancel an order for. This only works for enterprise clients

An order can be cancelled in these situations:

Getting a Specific Order

brawndo.order.read({order_id : 'zzzz-zzzz-zzz'}, function(error, data) {
});
OrderGetParameters orderGetParams = new OrderGetParameters();
orderGetParams.setOrderId("06ex-r3zV-BMb");
order_get_params = {
  'order_id': '06ex-r3zV-BMb'}
	
order = json.loads(api.order.get(order_get_params))
OrderGetParameters orderGetParams = new OrderGetParameters();
orderGetParams.order_id = "06ex-r3zV-BMb";
order_read_params = {
  order_id => '06ex-r3zV-BMb'
}

order_data = brawndo.order.read(order_read_params)
var req brawndo.OrderRequest

req.OrderId = order_id
req.CompanyId = company_id

res, err := b.GetOrder(&req)
//Read an order created for the client that your keys represent
$order_id = '12345fedcba67890abcdef';
$result = $brawndo->order->read($order_id);

Example JSON Response:

{
	"data": {
		"destination": {
			"order_id": "ac156e24a24484a382f66b8cadf6fa83",
			"short_id": "06ex-r3zV-BMb",
			"createdate": 1425653646,
			"updatedate": 1425653646,
			"order_status_code": 0,
			"company_name": "Dropoff",
			"first_name": "Jason",
			"last_name": "Kastner",
			"address_line_1": "901 S MoPac Expy",
			"address_line_2": "#150",
			"city": "Austin",
			"state": "TX",
			"zip": "78746",
			"phone_number": "512-555-5555",
			"email_address": "jkastner+java+dropoff@dropoff.com",
			"lng": -97.782073,
			"lat": 30.264573
		},
		"details": {
			"order_id": "ac156e24a24484a382f66b8cadf6fa83",
			"short_id": "06ex-r3zV-BMb",
			"createdate": 1425653646,
			"customer_name": "Jason Kastner",
			"type": "ASAP",
			"market": "austin",
			"timezone": "America/Chicago",
			"price": "15.00",
			"signed": "false",
			"distance": "0.62",
			"order_status_code": 0,
			"wait_time": 0,
			"order_status_name": "Submitted",
			"pickupETA": "TBD",
			"deliveryETA": "243.1",
			"signature_exists": "NO",
			"quantity": 10,
			"weight": 20,
			"readyforpickupdate": 1425578400,
			"updatedate": 1425653646
		},
		"origin": {
			"order_id": "ac156e24a24484a382f66b8cadf6fa83",
			"short_id": "06ex-r3zV-BMb",
			"createdate": 1425653646,
			"updatedate": 1425653646,
			"order_status_code": 0,
			"company_name": "Gus's Fried Chicken",
			"first_name": "Napoleon",
			"last_name": "Bonner",
			"address_line_1": "117 San Jacinto Blvd",
			"city": "Austin",
			"state": "TX",
			"zip": "78701",
			"phone_number": "5124744877",
			"email_address": "orders@gussfriedchicken.com",
			"lng": -97.741703,
			"lat": 30.263706,
			"market": "austin",
			"remarks": "Be nice to napoleon"
		}
	},
	"success": true,
	"timestamp": "2015-03-09T18:42:15+00:00"
}

Getting a Page of Orders

Get the first page of orders.

brawndo.order.read(function(error, data) {
});
OrderGetParameters orderGetParams = new OrderGetParameters();
JsonObject page = brawndo.order.get(orderGetParams);
order_get_params = {}
page = json.loads(api.order.get(order_get_params))
OrderGetParameters orderGetParams = new OrderGetParameters();
JObject page = brawndo.order.Get(orderGetParams);
brawndo.order.read({})
//  Get an the first order page for the client your keys represent
  var req brawndo.OrderRequest
  res, err := b.GetOrderPage(&req)
// Get the first page of orders for your client
$result = $brawndo->order->readPage();

Get a page of orders after the last_key from a previuous response.

brawndo.order.read({last_key : 'zhjklzvxchjladfshjklafdsknvjklfadjlhafdsjlkavdnjlvadslnjkdas'}, function(error, data) {
});
OrderGetParameters nextPageParams = new OrderGetParameters();
String page1LastKey = page.get("last_key").getAsString();

if (page.get("last_key") != null) {
    nextPageParams.setLastKey(page.get("last_key").getAsString());
}
        
JsonObject page = brawndo.order.get(nextPageParams);
if 'last_key' in page:
  order_get_params = {
    'last_key': page['last_key']}
        
page = json.loads(api.order.get(order_get_params))
OrderGetParameters nextPageParams = new OrderGetParameters();
string page1LastKey = (string)page["last_key"];

if (page["last_key"] != null) {
    nextPageParams.last_key = (string) page["last_key"];
}

JObject nextPage = brawndo.order.Get(nextPageParams);
order_read_params = {
  last_key => 'zhjklzvxchjladfshjklafdsknvjklfadjlhafdsjlkavdnjlvadslnjkdas'
}

order_data = brawndo.order.read(order_read_params)
//  Get an the order page after the given key for the client your keys represent
  var req brawndo.OrderRequest
  req.LastKey = "1234567890abcdeffedcbakdjsaynzcvjkdsauiadfsjkfasdkjfsadkjadfshk"
  res, err := b.GetOrderPage(&req)
// Get the page of orders for your client following the given last key.
$last_key = 'adfsjlhksadfjklfdasjklfadsjklfadsjklafsdjhk'
$result = $brawndo->order->readPage($last_key);

Get the first page of orders as an enterprise client user for a managed client.

brawndo.order.read({company_id : '1111111111111'}, function(error, data) {
});
OrderGetParameters orderGetParams = new OrderGetParameters();
orderGetParams.setCompanyId("1111111111111");
JsonObject page = brawndo.order.get(orderGetParams);
order_get_params = {
  'company_id': '1111111111111'}
	
page = json.loads(api.order.get(order_get_params))
OrderGetParameters orderGetParams = new OrderGetParameters();
orderGetParams.company_id = "1111111111111";
JObject page = brawndo.order.Get(orderGetParams);
order_read_params = {
  company_id => '1111111111111'
}

order_data = brawndo.order.read(order_read_params)
//  Get an the first order page for a managed client if you are an enterprise client
  var req brawndo.OrderRequest
  req.CompanyId = "1111111111111"
  res, err := b.GetOrderPage(&req)
// Get the first page of orders for a managed client
$company_id = '1111111111111';
$result = $brawndo->order->readPage(NULL, $company_id);

Get a page of orders after the last_key from a previous response as an enterprise client user for a managed client.

brawndo.order.read({
  last_key : 'zhjklzvxchjladfshjklafdsknvjklfadjlhafdsjlkavdnjlvadslnjkdas'
  company_id : '1111111111111'
},
function(error, data) {
});
OrderGetParameters nextPageParams = new OrderGetParameters();
nextPageParams.setCompanyId("1111111111111");
String page1LastKey = page.get("last_key").getAsString();

if (page.get("last_key") != null) {
    nextPageParams.setLastKey(page.get("last_key").getAsString());
}
        
JsonObject page = brawndo.order.get(nextPageParams);
if 'last_key' in page:
  order_get_params = {
    'last_key': page['last_key'],
    'company_id': '1111111111111'}
        
page = json.loads(api.order.get(order_get_params))
OrderGetParameters nextPageParams = new OrderGetParameters();
nextPageParams.company_id = "1111111111111";

string page1LastKey = (string)page["last_key"];

if (page["last_key"] != null) {
    nextPageParams.last_key = (string) page["last_key"];
}

JObject nextPage = brawndo.order.Get(nextPageParams);
order_read_params = {
  company_id => '1111111111111',
  last_key => 'zhjklzvxchjladfshjklafdsknvjklfadjlhafdsjlkavdnjlvadslnjkdas'
}

order_data = brawndo.order.read(order_read_params)
//  Get an the order page after the given key for a managed client if you are an enterprise client
  var req brawndo.OrderRequest
  req.CompanyId = "1234567890abcdeffedcba"
  req.LastKey = "1234567890abcdeffedcbakdjsaynzcvjkdsauiadfsjkfasdkjfsadkjadfshk"
  res, err := b.GetOrderPage(&req)
// Get the page of orders for a managed client following the given last key.
$last_key = 'adfsjlhksadfjklfdasjklfadsjklfadsjklafsdjhk'
$company_id = '1111111111111';
$result = $brawndo->order->readPage($last_key, $company_id);

Example JSON Response:

{
	"data": [ ... ],
	"count": 10,
	"total": 248,
	"last_key": "zhjklzvxchjladfshjklafdsknvjklfadjlhafdsjlkavdnjlvadslnjkdas",
	"success": true,
	"timestamp": "2015-03-09T18:42:15+00:00"
}

Signature Image URL

Getting a signature image URL

var signature_params = {};
signature_params.order_id = "Rr0W-e1OL-Lr0"; // required
signature_params.company_id = ""; //optional
brawndo.order.signature(signature_params, function(error, data) {
});
OrderGetParameters signatureGetParams = new OrderGetParameters();
signatureGetParams.setOrderId("Rr0W-e1OL-Lr0");
JsonObject signature = brawndo.order.getSignature(signatureGetParams);
order_get_params = {'order_id': '01de44f7a46be2d6cda526dda87742a0'}
signature = json.loads(api.order.signature(order_get_params))
OrderGetParameters ogp = new OrderGetParameters();
ogp.order_id = "Rr0W-e1OL-Lr0";
ogp.company_id = ""; //optional
JObject order = brawndo.order.GetSignature(ogp);
sig_params = {}
sig_params['order_id'] = 'gV1z-NVVE-O8w'
sig_data = brawndo.order.signature(sig_params)
var req brawndo.GetSignatureRequest
req.CompanyId = "" // optional
req.OrderId = "gV1z-NVVE-O8w"

res, err := b.GetSignature(&req)
$result = $brawndo->order->signature("zzzz-zzzz-zzz");

Some orders will contain signatures. If you want to get a url to an image of the signature you can call the GetSignature method. Note that the signature may not always exist, for example when the delivery was left at the door of the destination.

Example JSON Response:

{
	success: true,
	url: https://s3.amazonaws.com/...
}

Tips

You can create, delete, and read tips for individual orders. Please note that tips can only be created or deleted for orders that were delivered within the current billing period. Tips are paid out to our agents and will appear as an order adjustment charge on your invoice after the current billing period has expired. Tip amounts must not be zero or negative. You are limited to one tip per order.

Creating a Tip

brawndo.order.tip.create({ order_id :'61AE-Ozd7-L12', amount : 4.44 }, function(error, data) {
});
TipParameters tipParams = new TipParameters();
tipParams.setOrderId(created_order_id);
tipParams.setAmount(4.44);            
JsonObject tipResponse = brawndo.order.tip.create(tipParams);
tip_params = {
  'order_id': created_order_id,
  'amount': 4.44}

tip = json.loads(api.order.tip.create(tip_params))
TipParameters tipParameters = new TipParameters();
tipParameters.order_id = created_order_id;
tipParameters.amount = 4.44;
JObject tipResponse = brawndo.order.tip.Create(tipParameters);
tip_params = {
  order_id =>'61AE-Ozd7-L12', 
  amount => 4.44
}

tip_create_response = brawndo.order.tip.create(tip_params)
var req brawndo.OrderTipRequest
req.OrderId = "12345abcdef67890fedcba"
req.Amount = "7.50"
req.CompanyId = ""

res, err := b.CreateOrderTip(&req)
$order_id = 'abcdef0987654321fedcba';
$amount = 13.33;
$result = $brawndo->order->tip->create($order_id, $amount);

Tip Create Parameters

Parameter Description Required
order_id the id of the order to add a tip to
amount the amount of the tip
Parameter Description Required
OrderId the id of the order to add a tip to
Amount the amount of the tip

Deleting a Tip

brawndo.order.tip.delete('61AE-Ozd7-L12', function(error, data) {
});
TipParameters tipParams = new TipParameters();
tipParams.setOrderId(created_order_id);
JsonObject tipResponse = brawndo.order.tip.delete(tipParams);
tip_params = {
	'order_id': created_order_id}
	
tip = json.loads(api.order.tip.delete(tip_params))
TipParameters tipParameters = new TipParameters();
tipParameters.order_id = created_order_id;
JObject tipResponse = brawndo.order.tip.Delete(tipParameters);
tip_delete_response = brawndo.order.tip.delete('61AE-Ozd7-L12')
var req brawndo.OrderTipRequest
req.OrderId = "12345abcdef67890fedcba"
req.CompanyId = ""

res, err := b.DeleteOrderTip(&req)
$order_id = 'abcdef0987654321fedcba';
$result = $brawndo->order->tip->delete($order_id);

Note that if you are trying to delete a tip on a managed client order as an enterprise client user, include the company_id in the argument parameters

brawndo.order.tip.delete({
  order_id : '61AE-Ozd7-L12',
  company_id : '1111111111111'
},
function(error, data) {
});
TipParameters tipParams = new TipParameters();
tipParams.setOrderId(created_order_id);
tipParams.setCompanyId("1111111111111");
JsonObject tipResponse = brawndo.order.tip.delete(tipParams);
tip_params = {
	'order_id': created_order_id,
	'company_id': '1111111111111'}
	
tip = json.loads(api.order.tip.delete(tip_params))
TipParameters tipParameters = new TipParameters();
tipParameters.order_id = created_order_id;
tipParameters.company_id = "1111111111111";
JObject tipResponse = brawndo.order.tip.Delete(tipParameters);
tip_delete_params = { 
  order_id => '61AE-Ozd7-L12',
  company_id => '1111111111111'
}

tip_delete_response = brawndo.order.tip.delete(tip_delete_params)
var req brawndo.OrderTipRequest
req.OrderId = "12345abcdef67890fedcba"
req.CompanyId = "1111111111111"

res, err := b.DeleteOrderTip(&req)
$order_id = '1234567890abcdef54321';
$company_id = '1111111111111';
$result = $brawndo->order->tip->delete($order_id, $company_id);

Tip Delete Parameters

Parameter Description Required
order_id the id of the order to add a tip to
company_id if you are trying to delete a tip on a managed client order as an enterprise client user, include the company_id in the argument parameters. This only works for enterprise clients
Parameter Description Required
OrderId the id of the order to add a tip to
CompanyId if you are trying to delete a tip on a managed client order as an enterprise client user, include the CompanyId in the argument parameters. This only works for enterprise clients

Reading a Tip

brawndo.order.tip.read('61AE-Ozd7-L12', function(error, data) {
});
TipParameters tipParams = new TipParameters();
tipParams.setOrderId(created_order_id);
JsonObject tipResponse = brawndo.order.tip.get(tipParams);
tip_params = {
  'order_id': created_order_id}
	
tip = json.loads(api.order.tip.get(tip_params))
TipParameters tipParameters = new TipParameters();
tipParameters.order_id = created_order_id;
JObject tipResposne = brawndo.order.Get(tipParameters);
tip_read_response = brawndo.order.tip.read('61AE-Ozd7-L12')
var req brawndo.OrderTipRequest
req.OrderId = "12345abcdef67890fedcba"
req.CompanyId = ""

res, err := b.GetOrderTip(&req)
$order_id = 'abcdef0987654321fedcba';
$result = $brawndo->order->tip->read($order_id);

Note that if you are trying to read a tip on a manage client order as an enterprise client user, include the company_id in the argument parameters

brawndo.order.tip.read({
  order_id : '61AE-Ozd7-L12',
  company_id : '1111111111111'
},
function(error, data) {
});
TipParameters tipParams = new TipParameters();
tipParams.setOrderId(created_order_id);
tipParams.setCompanyId("1111111111111");
JsonObject tipResponse = brawndo.order.tip.get(tipParams);
tip_params = {
	'order_id': created_order_id,
	'company_id': '1111111111111'}
	
tip = json.loads(api.order.tip.get(tip_params))
TipParameters tipParameters = new TipParameters();
tipParameters.order_id = created_order_id;
tipParameters.company_id = "1111111111111";
JObject tipResposne = brawndo.order.Get(tipParameters);
tip_read_params = { 
  order_id => '61AE-Ozd7-L12',
  company_id => '1111111111111'
}

tip_read_response = brawndo.order.tip.read(tip_read_params)
var req brawndo.OrderTipRequest
req.OrderId = "12345abcdef67890fedcba"
req.CompanyId = "1111111111111"

res, err := b.GetOrderTip(&req)
$order_id = '1234567890abcdef54321';
$company_id = '1111111111111';
$result = $brawndo->order->tip->read($order_id, $company_id);

Example JSON Response:

{
	"amount": "4.44",
	"createdate": "2016-02-18T16:46:52+00:00",
	"description": "Tip added by Dropoff(Jason Kastner)",
	"updatedate": "2016-02-18T16:46:52+00:00"
}

Tip Get Parameters

Parameter Description Required
order_id the id of the order to add a tip to
company_id if you are trying to read a tip on a managed client order as an enterprise client user, include the company_id in the argument parameters. This only works for enterprise clients
Parameter Description Required
OrderId the id of the order to add a tip to
CompanyId if you are trying to read a tip on a managed client order as an enterprise client user, include the CompanyId in the argument parameters. This only works for enterprise clients

Webhooks

Endpoint Requirements

You may register a server route with Dropoff to receive real time updates related to your orders.

Your endpoint must handle a post, and should verify the X-Dropoff-Key with the client key given to you when registering the endpoint.

The body of the post should be signed using the HMAC-SHA-512 hashing algorithm combined with the client secret given to you when registering the endpoint.

The format of a post from Dropoff will be:

{
	"count": 2,
	"data": []
}

Dropoff Message

Attribute Description
count the number of items in the data array
data array of events regarding orders and drivers prcoessing those orders

Backoff Algorithms

If your endpoint is unavailable Dropoff will try to resend the events in this manner:

If all retries have failed then the cached events will be forever gone from this plane of existence.

Event Handling

There are two types of events that your webhook will receive, order update events and agent location events.

All events follow this structure:

{
	"event_name": "",
	"data": {}
}

Event Attributes

Attribute Description
event_name either ORDER_UPDATED or AGENT_LOCATION
data event specific information

Order Update Event

This event will be triggered when the order is either:

Example of an order update event:

{
	"event_name": "ORDER_UPDATED",
	"data": {
		"order_status_code": 1000,
		"company_id": "7df2b0bdb418157609c0d5766fb7fb12",
		"timestamp": "2015-05-15T12:52:55+00:00",
		"order_id": "klAb-zwm8-mYz",
		"agent_id": "b7aa983243ccbfa43410888dd205c298"
	}
}

Order Update Event Attributes

Attribute Description
order_status_code can be -1000 (cancelled), 1000 (accepted), 1500 (arrived at pickup), 2000 (picked up), 2500 (arrived at destination), or 3000 (delivered)
company_id your company id
timestamp utc timestamp of when the order update event occured
order_id id of the order
agent_id id of the agent that is carrying out your order

Agent Location Update Event

This event is triggered when the location of an agent that is carrying out your order has changed.

Example of an agent location update event:

{
	"event_name": "AGENT_LOCATION",
	"data": {
		"agent_avatar": "https://s3.amazonaws.com/com.dropoff.alpha.app.workerphoto/b7aa983243ccbfa43410888dd205c298/worker_photo.png?AWSAccessKeyId=AKIAJN2ULWKTZXXEOQDA&Expires=1431695270&Signature=AFKNQdT33lhlEddrGp0kINAR4uw%3D",
		"latitude": 30.2640713,
		"longitude": -97.7469492,
		"order_id": "klAb-zwm8-mYz",
		"timestamp": "2015-05-15T12:52:50+00:00",
		"agent_id": "b7aa983243ccbfa43410888dd205c298"
	}
}

Agent Location Update Event Attributes

Attribute Description
agent_avatar an image url you can use to show the agent. It expires in 15 minutes
latitude new latitude of agent location
longitude new longitude of agent location
timestamp utc timestamp of when the location update event occured
order_id id of the order
agent_id id of the agent that is carrying out your order

Managed Client Events

If you have registered a webhook with an enterprise client that can manager other clients, then the webhook will also receive all events for any managed clients.

So in our hierarchical example at the start, if a webhook was registered for EnterpriseCo Global, it would receive all events for:

Simulation

Simulating an Order

brawndo.order.simulate({ market : 'austin' }, function(error, result) {});
brawndo.order.simulate({ order_id : 'klAb-zwm8-mYz' }, function(error, result) {});
SimulateParameters simulateParameters = new SimulateParameters();

simulateParameters.setOrderId("klAb-zwm8-mYz");

// OR

simulateParameters.setMarket("austin");

JsonObject simulate = brawndo.order.simulate(simulateParameters);
simulate_params = {
    'order_id': 'klAb-zwm8-mYz'
}

// OR
simulate_params = {
    'market': 'austin'
}

simulate_response = json.loads(api.order.simulate(simulate_params))
SimulateParameters simulateParameters = new SimulateParameters();

simulateParameters.order_id = "klAb-zwm8-mYz";

// OR

simulateParameters.market = "austin";

JObject simulateResponse = brawndo.order.Simulate(simulateParameters);
return simulateResponse;
simulate_params = {
    'order_id' => 'klAb-zwm8-mYz'
}

// OR

simulate_params = {
    'market' => 'austin'
}

simulate_data = brawndo.order.simulate(simulate_params)
var req brawndo.SimulateRequest

req.OrderId = "klAb-zwm8-mYz"

// OR

req.Market = "austin"

res, err := b.SimulateOrder(&req)
$result = $brawndo->$order->$simulate('austin');
$result = $brawndo->order->simulate(NULL, 'klAb-zwm8-mYz');

You can simulate an order via the Brawndo API in order to test your webhooks.

If starting the simulation in a market, the simulation will create an order, assign it to a simulation agent, and move the agent from pickup to the destination.

Otherwise you can run the simulation with an order that you created, just pass on the order id, and then it will assign it to a simulation agent, and move the agent from pickup to the destination.

Language Specific Notes

Java

Version

DropoffApi-v1-0.jar compiled using JDK 1.6.0_65. Jar tested against application (/ScalaTest/DropoffApp.scala) using Scala 2.11.11

google-gson

The Java client API has a depedency on google-gson library which is included in the DropoffApi.jar. You can get more information on that here.

Shutdown

brawndo.shutdown();

When you are done using the client, a shutdown is required to stop the executor from holding on to resources

.NET

Json .NET

The .NET Brawndo API has a dependency on Newtonsoft Json.NETframework. You can get more information on that here.

Support

Technical Issues

If you have questions or get stuck, feel free to email us at api-support@dropoff.com.

Changelog

Policies

Dropoff API Terms of Use

Last Updated: January 26th, 2018

INTRODUCTION

This document sets forth the terms on which Dropoff makes the Dropoff API available for us by approved licensees on applications approved by Dropoff. By using the Dropoff API, you and the organization identified in your [developer application] for the Dropoff API ("Developer" or "you") agree to be bound by the following terms of use ("API Terms of Use").

Under the API Terms of Use, "Dropoff" means Dropoff, Inc., with offices at 901 S Mopac Expressway, Building 2, Suite 250, Austin, TX 78746. We may refer to "Dropoff" as "we", "our", or "us" in the API Terms of Use.

REGISTRATION

Before using the Dropoff API, you must provide accurate information identifying your organization and the individual representative who will serve as a point of contact for Dropoff. Upon successful registration, Dropoff shall make Access Credentials available to you. “Access Credentials” means the necessary security keys, secrets, tokens, and other credentials to access the Dropoff API. All activities that occur using your Access Credentials are your responsibility. Access Credentials are specific to you and are the confidential information of Dropoff. You must not sell, transfer, or sublicense the Access Credentials or attempt to circumvent them.

By registering with Dropoff, you agree to be bound by the API Terms of Use. If you disagree with any of the API Terms of Use, Dropoff does not grant you a license to use the Dropoff API. If you are using the Dropoff API on behalf of a company or any other entity, you represent and warrant that you have full legal authority to register on behalf of that entity and bind it to the API Terms of Use. If you are not authorized, you may not accept the API Terms of Use or register for Access Credentials for someone else.

DEFINITION

"API" By registering with Dropoff, you agree to be bound by the API Terms of Use. If you disagree with any of the API Terms of Use, Dropoff does not grant you a license to use the Dropoff API. If you are using the Dropoff API on behalf of a company or any other entity, you represent and warrant that you have full legal authority to register on behalf of that entity and bind it to the API Terms of Use. If you are not authorized, you may not accept the API Terms of Use or register for Access Credentials for someone else.

"Application" means one or more software programs developed by you and used by you to facilitate delivery orders from your customers. An Application includes any content provided or otherwise made available by you through such Application.

"Developer Materials" means any technical data, specifications, documentation, software development kits (SDKs) and other materials that Dropoff may provide to you in connection with the API or the Dropoff Platform.

"Dropoff Platform" means Dropoff’s proprietary software platform through which individuals and entities seeking same-day courier services can connect with registered couriers to deliver such services.

"Intellectual Property Rights" means any and all intellectual property and proprietary rights, including, without limitation, those under patent law, copyright law, trade secret law, and trademark law.

"Open Source Software" means any software that is subject to terms that, as a condition of use, copying, modification or redistribution, requires such software or derivative works thereof to be disclosed or distributed in source code form, to be licensed for the purpose of making derivative works, or to be redistributed free of charge or requires Intellectual Property Rights in or to such software or derivative works to be licensed or not asserted, including, without limitation, software distributed under the GNU General Public License.

API License FROM DROPOFF

API License from Dropoff. Subject to the terms and conditions of the API Terms of Use, Dropoff hereby grants you a limited, personal, revocable, non-exclusive, royalty free, non-sublicensable and non-transferable license: (i) to use the API in accordance with the Developer Materials and to use the Developer Materials, in each case, for the sole purposes of developing and testing the Application for use with the API; (ii) to access the Dropoff Platform through the API; and (iii) to make a reasonable number of copies of the Developer Materials for your internal use only in accordance with the API Terms of Use. The API may be distributed or made available to a third party only if permitted in writing by Dropoff (in Dropoff’s sole discretion).

License Restrictions. Except as permitted hereunder, you will not and will not allow any of your directors, officers, employees, agents or contractors (collectively, “Personnel”) to:

(i) reverse engineer, disassemble, decompile or otherwise attempt to derive the source code or the underlying ideas, algorithms, structure or organization of the API or the Dropoff Platform, or any part of any of the foregoing;

(ii) sublicense, transfer, distribute or otherwise make available the API or any Developer Materials or the Dropoff Platform, or any part of any of the foregoing, in any form;

(iii) lease, loan or sell the API or any Developer Materials or the Dropoff Platform, or any part of the foregoing;

(iv) create derivative works of or otherwise modify the API or any Developer Materials or the Dropoff Platform, or any part of any of the foregoing;

(v) except as expressly permitted by the API Terms of Use with respect to Developer Materials, make any copies of the API or any Developer Materials or the Dropoff Platform, or any part of any of the foregoing, in any form; or

(vi) attempt to defeat, avoid, bypass, remove, deactivate or otherwise circumvent any software protection mechanisms in the API or the Dropoff Platform, including without limitation, any such mechanism used to restrict or control the functionality of any of the foregoing.

Reservation of Rights. Dropoff does not grant you any rights in or to the API, Developer Materials and Dropoff Platform except as expressly set forth above, and as between the you and Dropoff, Dropoff owns and retains ownership of the API, Developer Materials and Dropoff Platform, including all Intellectual Property Rights in and to the foregoing. You own and retain ownership of the Application, except to the extent any Dropoff Intellectual Property is incorporated therein, including all Intellectual Property Rights in and to the foregoing.

OPERATION OF THE API

Compliance with Laws. You must comply, and you will require your end users to comply, with all applicable laws, rules, regulations and third-party contracts in your performance of the API Terms of Use, including without limitation the development, marketing, distribution and operation of the Application.

API Limitations. Dropoff may set limits on the number of API requests that you can make, at Dropoff’s sole discretion. You agree to such limitations and will not attempt to circumvent such limitations.

Monitoring. Dropoff may monitor the use of the APIs to ensure quality, improve Dropoff products and services, and verify your compliance with these terms. You will not interfere with such monitoring. Dropoff may use any technical means to overcome such interference.

No Interference. You must not, and the Application must not, and neither you nor such Application shall enable others to (i) disable, hack, disrupt, damage, interfere or otherwise access in an unauthorized manner the Dropoff Platform or any technology or service of Dropoff, any Dropoff customer or any third party, or any part of any of the foregoing, including without limitation monitoring of sensors and peripherals, alarm event detection, alarm communications or alarm transmissions, or (ii) violate, tamper with, or circumvent the security of any computer network, software, passwords, encryption codes or technological protection measures.

Attribution. You agree to display any attribution(s) required by Dropoff as described in the Developer Materials. Dropoff hereby grants to you a non-transferable, non-sublicenseable, non-exclusive license during the term to display the Dropoff trademarks that Dropoff may, from time to time, provide Partner and authorize Partner to use for the purpose of promoting or advertising that Partner uses the API.

Open Source. If the Application includes any Open Source Software, (i) you have complied and will comply with all applicable Open Source Software licensing terms and (ii) you have not and will not use any Open Source Software in such a manner that would cause any software or Intellectual Property Rights of Dropoff or of any Dropoff customer to be subject to any Open Source Software licensing terms, restrictions or obligations.

No Endorsement. You must not, either directly or indirectly, promote or advertise Application(s) as being endorsed or recommended by any Dropoff customer, nor may you associate the Application or your business or technology in any manner with any Dropoff customer in any advertisement, promotional material or publication, including your website, without the prior written consent of such Dropoff customer.

PROPIETARY RIGHTS

Ownership. As between you and Dropoff, all Intellectual Property Rights in all technology developed solely by you under the API Terms of Use is owned solely by you. As between you and Dropoff, all Intellectual Property Rights in all technology developed by Dropoff, whether solely or jointly with you, under the API Terms of Use is owned solely by Dropoff, and you hereby assign to Dropoff all of your right, title, and interest in and to such Intellectual Property Rights. Nothing in the API Terms of Use will impair Dropoff’s right to develop, acquire, license, market, promote or distribute products, software or technologies that perform the same or similar functions as, or otherwise compete with, any other products, software or technologies that you may develop, produce, market or distribute.

Feedback. Dropoff will be free to use any information or suggestions you provide to Dropoff pursuant to the API Terms of Use for any purpose, subject to any applicable patents or copyrights.

CONFIDENTIAL INFORMATION

YOU AGREE THAT THE CONTENT OF THE API, AND ANY DROPOFF CONTENT THAT BY ITS NATURE SHOULD REASONABLY BE KNOWN TO BE CONFIDENTIAL, IS DEEMED TO BE CONFIDENTIAL INFORMATION OF DROPOFF AND YOU MAINTAIN THE SAME IN STRICT CONFIDENCE AND NOT DISCLOSE THE SAME TO ANY THIRD PARTY (OTHER THAN YOUR EMPLOYEES, AGENTS AND CONTRACTORS FOR THE SOLE PURPOSE OF PROVIDING SERVICES TO YOU TO COMPLETE WORK PERMITTED HEREUNDER) OR USE THE SAME FOR ANY PURPOSE OTHER THAN YOUR PERFORMANCE UNDER THE AGREEMENT. TO THE EXTENT THAT YOU RETAIN ANY DROPOFF CONTENT AFTER THE TERMINATION OR EXPIRATION OF THE API TERMS, THIS PARAGRAPH WILL SURVIVE THE TERMINATION OR EXPIRATION OF THE API TERMS.

CHANGES Dropoff reserves the right to change the API Terms of Use, and you are responsible for regularly reviewing these API Terms of Use. Your continued use of the API after the effective date of such changes will constitute acceptance of and agreement to any such changes.

TERMINATION

Dropoff may change, suspend or discontinue the Dropoff API and suspend or terminate your use of the API at any time for any reason, without notice. You may also terminate by ceasing to use the API and removing implementation of the API from your Application.

NO WARRANTY

DROPOFF PROVIDES THE API, DROPOFF DATA, AND ANY DROPOFF LOGOS OR TRADEMARKS “AS IS,” “WITH ALL FAULTS” AND “AS AVAILABLE,” AND THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH YOU. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, DROPOFF MAKES NO REPRESENTATIONS, WARRANTIES OR CONDITIONS, EXPRESS OR IMPLIED. DROPOFF EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OR CONDITIONS, EXPRESS, STATUTORY AND IMPLIED, INCLUDING WITHOUT LIMITATION (A) WARRANTIES OR CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, ACCURACY, TITLE, QUIET ENJOYMENT, NO ENCUMBRANCES, NO LIENS AND NON-INFRINGEMENT, (B) WARRANTIES OR CONDITIONS ARISING THROUGH COURSE OF DEALING OR USAGE OF TRADE, AND (C) WARRANTIES OR CONDITIONS OF UNINTERRUPTED OR ERROR-FREE ACCESS OR USE.

LIABILITY LIMITATION; EXCLUSIVE REMEDY

IN NO EVENT WILL DROPOFF BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, OR PUNITIVE DAMAGES ARISING OUT OF, BASED ON, OR RESULTING FROM THESE API TERMS OF USE OR YOUR USE OF THE API, DROPOFF DATA, OR ANY DROPOFF LOGOS OR TRADEMARKS, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE EXCLUSION OF DAMAGES UNDER THIS PARAGRAPH IS INDEPENDENT OF YOUR EXCLUSIVE REMEDY AND SURVIVES IN THE EVENT SUCH REMEDY FAILS OF ITS ESSENTIAL PURPOSE OR IS OTHERWISE DEEMED UNENFORCEABLE. THESE LIMITATIONS AND EXCLUSIONS APPLY WITHOUT REGARD TO WHETHER THE DAMAGES ARISE FROM (A) BREACH OF CONTRACT, (B) BREACH OF WARRANTY, (C) NEGLIGENCE, OR (D) ANY OTHER CAUSE OF ACTION, TO THE EXTENT SUCH EXCLUSION AND LIMITATIONS ARE NOT PROHIBITED BY APPLICABLE LAW. IF YOU DO NOT AGREE WITH ANY PART OF THESE API TERMS OF USE, OR YOU HAVE ANY DISPUTE OR CLAIM AGAINST DROPOFF OR ITS SUPPLIERS WITH RESPECT TO THESE TERMS OF USE OR THE SERVICES, THEN YOUR SOLE AND EXCLUSIVE REMEDY IS TO DISCONTINUE USING THE API, DROPOFF DATA, AND THE DROPOFF LOGOS AND TRADEMARKS.

GENERAL

Severability. If any provision of the API Terms of Use is found by a court of competent jurisdiction to be invalid or unenforceable, then that provision will be removed from the API Terms of Use without affecting the rest of the API Terms of Use. The remaining provisions of the API Terms of Use will continue to be valid and enforceable.

No Waiver. You agree that if Dropoff does not exercise or enforce any legal right or remedy that is contained in the API Terms of Use (or which Dropoff has the benefit of under any applicable law), this will not be taken to be a waiver of Dropoff’s rights and that those rights or remedies will still be available to Dropoff.

Assignability. The API Terms of Use may not be delegated, assigned or transferred by you without prior written approval of Dropoff. Any assignment in violation of the foregoing shall be null and void.

Governing Law; Venue. The API Terms of Use, and all the rights and duties of the parties arising from or relating in any way to the subject matter of the API Terms of Use or the transaction(s) contemplated by it, will be governed by, construed and enforced in accordance with the law of the State of Texas, without regard to any conflict of laws provisions that would refer to and apply the substantive laws of another jurisdiction. Any suit or proceeding relating to the API Terms of Use will be brought only in the state courts located in Travis County or federal courts located in the Western District of Texas. You consent to the exclusive personal jurisdiction and venue of such courts.