Introduction
Welcome to the Outdoorsy partner API! You can use this API to search for available rentals, initiate booking requests and create new listings using your Partner API token.
Staging & Development
Before you can go live with your integration, you'll want to develop against our staging server to enable test bookings and search requests without requiring API Authentication. To leverage staging, you'll want to replace our production endpoints listed below with the following domains:
Search
For generating search and availability requests on staging, you'll want to leverage https://search.staging.outdoorsy.com
instead of https://search.outdoorsy.com
Bookings and Management
For creating and managing bookings on staging, you'll want to leverage https://api.staging.outdoorsy.com
instead of https://api.outdoorsy.com
Authentication
Outdoorsy users tokens to allow access to the API. You can request access by contacting us here.
To authorize your requests, please pass the following header with all requests
Make sure to replace
your-partner-token
with your token.
Partner-ID: your-partner-token
Rentals
The Rental Object
Attributes
Attribute | Type | Description |
---|---|---|
id | Integer | The identifier for the rental |
active_options | Object | This is an object of relevant booking settings based on provided dates in search |
name | String | The name of the vehicle, created by owner |
type | String | Vehicle type, such as a, b, c, trailer, folding-trailer |
description | String | Longform vehicle description, created by owner |
summary | String | Vehicle summary / highlights, created by owner |
vehicle_make | String | Vehicle make/manufacturer |
vehicle_model | String | Vehicle model |
vehicle_year | Integer | Year manufactured |
vehicle_length | Integer | Length of vehicle (Unit found in locale.length_unit ) |
slug | String | Vehicle url path on Outdoorsy.com, useful for link redirects |
owner_user_id | Integer | ID for user that owns this rental |
dealer | Boolean | Is this vehicle owned by a Wheelbase dealer |
pro | Boolean | Is this vehicle owned by an Outdoorsy pro |
published | Boolean | Is this vehicle published, can it be rented |
hidden | Boolean | Is this vehicle accessible on external markets (Like Outdoorsy) |
features | Object | Object where keys are specific features, and values are indicators of if that feature exists for this rental |
sleeps | integer | How many people the vehicle sleeps |
seatbelts | integer | How many seatbelts the vehicle has |
sleeps_adults | integer | How many adults the vheicle sleeps |
sleeps_children | integer | How many children the vehicle sleeps |
delivery | Boolean | Does this vehicle offer delivery |
delivery_radius | Integer | how far will this vehicle deliver? |
delivery_radius_unit | String | What unit is used to calculate delivery radius |
images | Array | An array of Image Objects |
items | Array | An array of Item Objects |
position | Integer | Owner provided sort ranking for this rental |
score | Integer | 1-5 value indicating average rating from renters |
reviews_num | Integer | Count of how many reviews this specific rental has received |
group_reviews_score | Integer | 1-5 value indicating average rating for this group of vehicles for renters. Only valid if vehicle has children |
group_reviews_num | Integer | Count of how many reviews have been submitted for this group of vehicles |
favorite_count | Integer | Indicates how many renters have favorited this vehicle |
location | Object | Location object |
locale | Object | Locale object |
cancel_text | String | If custom cancelation policy, this explains terms |
house_rules | String | Indicates any additional rules from owner |
insurance_eligible | Boolean | Indicates if the vehicle qualifies for insurance coverage |
custom_insurance_text | String | If insurance is custom, displays insurance criteria |
security_deposit | Integer | Indicates how much this owner is charging for a security deposit, in cents |
use_day_pricing | Boolean | If true, vehicle is priced per day instead of per night |
coachnet_required | Boolean | Indicates if Roadside assistance is required |
coachnet_ready | Boolean | Indicates if a rental qualifies for roadside assistance |
instant_book | Boolean | Indicates if a rental can be reserved immediately without owner approval |
instant_book_leeway | Integer | If greater than 0, it means a listing can be reserved immediately up to x days before departure, then it must be owner approved |
pickup_unavailable | Object | Indicates if any days of the week are unavailable for pickup |
dropoff_unavailable | Object | Indicates if any days of the week are unavailable for dropoff |
children_count | Integer | Indicates how many vehicles are in this group, 0 bound |
mileage_usage_item | Object | Mileage Item - indicates charges for mileage driven |
generator_usage_item | Object | Generator Item - indicates charges for generator usage |
Active Options Object
Attribute | Type | Description |
---|---|---|
date | Date | Date used to calculate active options |
day_price | Integer | Price per night/day for the vehicle, in cents |
week_price | Integer | Price for a week rental, in cents |
month_price | Integer | Price for a month rental, in cents |
cancel_policy | String | Cancelation policy for this date range |
minimum_days | Integer | Minimum booking length during selected date raneg |
use_day_pricing | Boolean | Indicates if charges are per day or per night for this date range |
use_tax_inclusive_pricing | Boolean | Indicates if prices include taxes |
instant_book | Boolean | Indicates if this rental can be reserved without owner approval |
Mileage / Generator Item Object
Attribute | Type | Description |
---|---|---|
id | Integer | Identifier for item |
name | String | Name of charge |
unit | String | Unit of fee, mile , kilometer or hour |
included | Integer | How many units are included in a booking |
unlimited | Boolean | If true, then unlimited units are included |
tax_rate_id | Integer | What tax rate item is used to calculate taxes for this item |
tiers | Array | Array of tiers used to calculate charges - not often used directly by users |
Location Object
Attribute | Type | Description |
---|---|---|
city | String | City where this vehicle resides |
state | String | State where this vehicle resides |
county | String | County where this vehicle resides |
country | String | Country where this vehicle resides |
zip | String | Zip code for this vehicle |
lat | Double | Latitude of vehicle |
lng | Double | Longitude of vehicle |
Locale Object
Attribute | Type | Description |
---|---|---|
base_currency | String | Currency the vehicle was listed in, useful for determining if a currency conversion is being performed |
distance_unit | String | miles or kilometers |
weight_unit | String | Indicates unit to display for weight features, kg or lbs |
length_unit | String | Indicates unit to display for length features, meter or feet |
liquid_unit | String | Indicates unit to display for liquid features, gallons or liters |
Image Object
Attribute | Type | Description |
---|---|---|
id | Integer | The identifier for the image |
rental_id | Integer | The rental the image belongs to |
primary | Boolean | Indicates if this image is the vehicles primary image |
position | Integer | Sortable field to indicate owners prefered image order |
tags | String | Location tag for the image |
description | String | Owner provided description of the image |
skip_enhance | Boolean | Indicates if the owner opted to remove image enhancements on this image |
video | Boolean | If true, then url is a youtube or vimeo video link |
url | String | URL for the image or video asset |
best | Boolean | Internal image quality score for this listing |
Working with images
By default, image URLs are full resolution, which is very rarely something you'd want to leverage in production. You have access to the following image manipulations to speed up render times and resolve image rotation issues.
To render optimized images, you'll want to perform a string replace with the following. replace {{FORMAT_OPTIONS}}
with a selection from the table below:
imageUrl.replace('/outdoorsy/image/upload', '/outdoorsy/image/upload/{{FORMAT_OPTIONS}}')
Format String | Description |
---|---|
a_exif,q_auto,f_auto,w_auto,h_300,w_300,c_fill |
300x300 image thumbnail |
a_exif,q_auto,f_auto,w_auto,h_300,w_450,c_fill |
300x450 image - useful for search result pages |
a_exif,q_auto,f_auto,w_auto,h_600,w_900,c_fill |
600x900 image - useful for larger images on listing pages |
Add-on / Item Object
Attribute | Type | Description |
---|---|---|
id | Integer | The identifier for the add-on |
rental_id | Integer | The rental the add-on belongs to |
name | String | Owner provided name of this add-on |
description | String | Owner provided description for this add-on |
required | Boolean | Indicates if this add-on is required for a booking |
daily | Boolean | If true, then the add-on price is charged per day instead of per trip |
Search Rentals
curl "https://search.outdoorsy.com/rentals"
-H "Partner-ID: your-partner-token"
Rentals can be filtered by the following features:
"features": {
"air_conditioner": false,
"audio_inputs": false,
"awning": false,
"backup_camera": false,
"beds_full": 1,
"beds_king": 1,
"beds_queen": 1,
"beds_twin": 1,
"bike_rack": false,
"burning_man_friendly": true,
"cd_player": false,
"ceiling_fan": false,
"dining_table": true,
"extra_storage": false,
"fuel_tank": 0,
"fuel_type": "false",
"generator": false,
"gray_tank": 0,
"handicap_accessible": false,
"heater": true,
"hitch_weight": 0,
"hot_water_tank": false,
"inside_shower": false,
"inverter": false,
"kitchen_sink": true,
"leveling_jacks": false,
"microwave": true,
"minimum_age": 0,
"mpg": 0,
"one_way_rentals": true,
"outside_shower": true,
"oven": false,
"pet_friendly": false,
"propane_tank": 0,
"radio": false,
"refrigerator": true,
"satellite": false,
"sewage_tank": 0,
"skylight": true,
"slide_outs": 0,
"smoking_allowed": false,
"solar": false,
"stove": true,
"tailgate_friendly": true,
"toilet": true,
"tow_hitch": false,
"trailer_weight": 0,
"transmission": false,
"tv_dvd": false,
"washer_dryer": false,
"water_tank": 0,
"wifi": false
}
The above command returns JSON structured like this:
{
"data": [{
"id": "1916",
"type": "rentals",
"attributes": {
"active_options": {
"cancel_policy": "flexible",
"date": "2019-01-29",
"instant_book": false,
"minimum_days": 0,
"price_per_day": 10000,
"price_per_month": 0,
"price_per_week": 0,
"use_day_pricing": false
},
"availability_set": true,
"cancel_policy": "flexible",
"cancel_text": "",
"children_count": 0,
"coachnet_ready": false,
"coachnet_required": false,
"created": "2015-07-15T20:48:16.584649Z",
"current_location_id": 0,
"dealer": false,
"deposit_percentage": 0,
"description": "...",
"favorite_count": 33,
"features": { ... },
"generator_usage_item_id": 7479,
"group_on_map": false,
"group_reviews_num": 0,
"group_reviews_score": 0,
"hidden": false,
"house_rules": "",
"instant_book": false,
"instant_book_leeway": 0,
"insurance_coverage": "",
"insurance_eligible": false,
"insurance_plan": {
"comprehensive_coverage": true,
"comprehensive_maximum": "$75,000",
"id": 2,
"label": "Outdoorsy Motorhome No Liability",
"liability_maximum": "$0",
"owner_comprehensive_deductible": "$0",
"owner_liability_deductible": "$0",
"renter_comprehensive_deductible": "$1,500",
"renter_liability_deductible": "$0",
"requires_driver_verification": true
},
"insurance_renter_adjustable": false,
"insurance_state": "",
"last_published": "2017-08-16T07:29:03.478138Z",
"location": {
"city": "Broomfield",
"country": "US",
"county": "",
"lat": 39.934,
"lng": -105.105,
"state": "CO",
"zip": "80020"
},
"low_price_per_day": 0,
"low_price_per_month": 0,
"low_price_per_week": 0,
"mileage_usage_item_id": 7480,
"minimum_days": 0,
"minimum_deposit": 0,
"name": "91 Vansion",
"original_url": "",
"parent_id": 0,
"position": 0,
"price_per_day": 10000,
"price_per_month": 0,
"price_per_week": 0,
"pro": false,
"published": true,
"reviews_num": 0,
"score": 0,
"seatbelts": 0,
"security_deposit": 100000,
"sleeps": 3,
"sleeps_adults": 0,
"sleeps_kids": 0,
"slug": "/rv-rental/broomfield_co/1991_ford_econoline_1916-listing",
"sort": 0.0974074074074074,
"tags": [],
"type": "b",
"updated": "2018-01-30T06:07:34.269714Z",
"use_day_pricing": false,
"user_slug": "ryan",
"vehicle_class": "",
"vehicle_length": 19,
"vehicle_make": "Ford",
"vehicle_model": "Econoline",
"vehicle_year": 1991
},
"relationships": {
"generator_usage_item": {
"data": {
"id": "7479",
"type": "usage_based_item"
}
},
"images": {
"data": [
{
"id": "25342",
"type": "images"
}, ...
]
},
"mileage_usage_item": {
"data": {
"id": "7480",
"type": "usage_based_item"
}
},
"owner": {
"data": {
"id": "3",
"type": "users"
}
},
"primary_image": {
"data": {
"id": "25342",
"type": "images"
}
}
}
}],
"included": [
{
"id": "25342",
"type": "images",
"attributes": {
"description": "",
"position": 0,
"primary": true,
"rental_id": 1916,
"skip_enhance": false,
"tags": "",
"url": "https://res.cloudinary.com/outdoorsy/image/upload/v1444694359/p/rentals/1916/images/sqreusdqos4tphvjhynn.jpg",
"video": false
}
}, ...
]
}
This endpoint lets you search for rentals
HTTP Request
GET https://search.outdoorsy.com/rentals
Filter Parameters
Parameter | Type | Description |
---|---|---|
owner_id | CSV | Limit results to a specific owner, useful for creating sites for a specific user |
location_ids | CSV | Limit results to a specific location, must be used with an owner_id filter |
filter[keywords] | CSV | Filter results by comma seperated keywords. filter[keywords]=airstream,mercedes sprinter,westfalia |
filter[type] | CSV | Filter results by comma seperated vehicle types, filter[type]=a,b,c,camper-van |
filter[exclude_type] | CSV | Exclude results by comma seperated vehicle types, filter[exclude_type]=a,b,c,camper-van |
filter[style] | string | Filter results by drive vs tow , filter[style]=drive |
filter[feature] | CSV | Filter results by included features, available features can be to the right |
filter[vehicle_make] | CSV | Filter by specific vehicle makes. keyword search is often better for this |
fitler[vehicle_model] | CSV | Filter by specific vehicle models. keyword search is often better for this |
filter[owner_type] | String | dealer to include only professionally owned results |
price[min] | Integer | Min price for rentals, in cents. price[min]=10000 for $100 min |
price[max] | Integer | Max price for rentals, in cents. price[max]=20000 for $200 max |
date[from] | YYYY-MM-DD |
Return only rentals available over specific dates, also returns accurate pricing for those dates date[from]=YYYY-MM-DD |
date[to] | YYYY-MM-DD |
Return only rentals available over specific dates, also returns accurate pricing for those dates date[to]=YYYY-MM-DD |
page[limit] | Integer | How many results to return in a single query (Max 100) |
page[offset] | Integer | Offset to filter rentals by, useful for pagination |
sleeps | Integer | Filter rentals by how many travelers the vehicle sleeps |
sleeps[adults] | Integer | Filter by how many adults a rental sleeps |
sleeps[kids] | Integer | Filter by how many kids a rental sleeps |
sort | String | Defaults to Outdoorsy's recommended search, but can take -price and price |
length[lte] | Integer | Return rentals less than or equal to a given length |
length[gte] | Integer | Return rentals larger than or equal to a given length |
exclude | CSV | Filter out specific rentals, useful for showing similar rentals on a rental display page exclude=1916,3 |
ids | CSV | Return specific rentals only |
instant_book | Bool | Instantly bookable rentals only |
hidden | Bool | Defaults to false, if true we'll return hidden rentals as well (users who don't wish to be featured on external platforms) |
locale | String | Defaults to en-us , allows you to request additional languages |
currency | String | Defaults to the listings home currency, we currently support usd , cad , eur , gbp |
include_unavailable | Bool | Return unavailable units as well |
full_description | Bool | Return full rental descriptions. Otherwise you get a shortened version |
raw_json | Bool | when true, json-format api is converted to more traditional json |
Location Parameters
The following parameters are used to locate rentals nearest your users - You can use any combination of them, not all are necessary.
Parameter | Type | Description |
---|---|---|
recommended | Bool | If true, we'll locate rentals nearest your user using GeoIP Lookups |
near | String | lat,lng for your request |
bounds[ne] | String | lat,lng for the northeast bounds, must include ne and sw bounds if you want bounds querying |
bounds[sw] | String | lat,lng for the northeast bounds, must include ne and sw bounds if you want bounds querying |
address | String | If included, we'll geocode the string and base results on your query. address=Denver, CO |
radius | Integer | How much of a radius in miles to include in your query, default to radius=50 |
auto_radius | Bool | If true, we'll continue expanding the radius until your page[limit] is reached |
Filtering by features
Features are treated as Booleans for rentals. To filter results to only those which include specific features, you would pass in the parameters listed above with a list of features you wish to include.
filter[feature]=wifi,air_conditioner
would return units including both wifi and an air conditioner.
Include Parameters
Because the search api leverages JSON-API spec, you have the ability to include relations in your query as well.
Relationship | Description |
---|---|
images | Included by default, all search queries include images |
users | If included, we'll return owner data as well include=users |
reviews | If included, we'll return reviews as well include=reviews |
You also have the ability to include multiple relationships, example: include=users,reviews
Working with images
By default, image URLs are full resolution, which is very rarely something you'd want to leverage in production. You have access to the following image manipulations to speed up render times and resolve image rotation issues.
To render optimized images, you'll want to perform a string replace with the following. replace {{FORMAT_OPTIONS}}
with a selection from the table below:
imageUrl.replace('/outdoorsy/image/upload', '/outdoorsy/image/upload/{{FORMAT_OPTIONS}}')
Format String | Description |
---|---|
a_exif,q_auto,f_auto,w_auto,h_300,w_300,c_fill |
300x300 image thumbnail |
a_exif,q_auto,f_auto,w_auto,h_300,w_450,c_fill |
300x450 image - useful for search result pages |
a_exif,q_auto,f_auto,w_auto,h_600,w_900,c_fill |
600x900 image - useful for larger images on listing pages |
Response Headers
Parameter | Type | Description |
---|---|---|
Total-Results | Integer | How many results were found matching your query |
Min-Price | Integer | Minimum price that matches your query in cents |
Max-Price | Integer | Maximum price that matches your query in cents |
Linking to Outdoorsy listings
If you're building a search integration, but want to leverage Outdoorsy landing pages for each listing/checkout, then you'll want to levarage deep linking abilities. You can get a partner ID by emailing partners@outdoorsy.co. You can learn more on the deep linking guide, but the basic idea is that you'll construct a link with the following format:
https://redirect.outdoorsy.com?odc_partner={{PARTNER_ID}}&odc_url={{DESTINATION}}&odc_locale={{LOCALE}}
odc_partner
= Your partner ID provided for integrationodc_url
The rental slug, this is theslug
value on the rental objectodc_locale
By default, this will been-us
. You have the option of passing additional locales to direct users to specific translations/currencies. View the localities section for more options
Get a Specific Rental
curl "https://search.outdoorsy.com/rentals/1916"
-H "Partner-ID: your-api-token"
The above command returns JSON structured like this:
{
"data": {
"id": "1916",
"type": "rentals",
"attributes": {
"active_options": {
"cancel_policy": "flexible",
"date": "2019-01-29",
"instant_book": false,
"minimum_days": 0,
"price_per_day": 10000,
"price_per_month": 0,
"price_per_week": 0,
"use_day_pricing": false
},
"availability_set": true,
"cancel_policy": "flexible",
"cancel_text": "",
"children_count": 0,
"coachnet_ready": false,
"coachnet_required": false,
"created": "2015-07-15T20:48:16.584649Z",
"current_location_id": 0,
"dealer": false,
"deposit_percentage": 0,
"description": "...",
"favorite_count": 33,
"features": { ... },
"generator_usage_item_id": 7479,
"group_on_map": false,
"group_reviews_num": 0,
"group_reviews_score": 0,
"hidden": false,
"house_rules": "",
"instant_book": false,
"instant_book_leeway": 0,
"insurance_coverage": "",
"insurance_eligible": false,
"insurance_plan": {
"comprehensive_coverage": true,
"comprehensive_maximum": "$75,000",
"id": 2,
"label": "Outdoorsy Motorhome No Liability",
"liability_maximum": "$0",
"owner_comprehensive_deductible": "$0",
"owner_liability_deductible": "$0",
"renter_comprehensive_deductible": "$1,500",
"renter_liability_deductible": "$0",
"requires_driver_verification": true
},
"insurance_renter_adjustable": false,
"insurance_state": "",
"last_published": "2017-08-16T07:29:03.478138Z",
"location": {
"city": "Broomfield",
"country": "US",
"county": "",
"lat": 39.934,
"lng": -105.105,
"state": "CO",
"zip": "80020"
},
"low_price_per_day": 0,
"low_price_per_month": 0,
"low_price_per_week": 0,
"mileage_usage_item_id": 7480,
"minimum_days": 0,
"minimum_deposit": 0,
"name": "91 Vansion",
"original_url": "",
"parent_id": 0,
"position": 0,
"price_per_day": 10000,
"price_per_month": 0,
"price_per_week": 0,
"pro": false,
"published": true,
"reviews_num": 0,
"score": 0,
"seatbelts": 0,
"security_deposit": 100000,
"sleeps": 3,
"sleeps_adults": 0,
"sleeps_kids": 0,
"slug": "/rv-rental/broomfield_co/1991_ford_econoline_1916-listing",
"sort": 0.0974074074074074,
"tags": [],
"type": "b",
"updated": "2018-01-30T06:07:34.269714Z",
"use_day_pricing": false,
"user_slug": "ryan",
"vehicle_class": "",
"vehicle_length": 19,
"vehicle_make": "Ford",
"vehicle_model": "Econoline",
"vehicle_year": 1991
},
"relationships": {
"generator_usage_item": {
"data": {
"id": "7479",
"type": "usage_based_item"
}
},
"images": {
"data": [
{
"id": "25342",
"type": "images"
}, ...
]
},
"mileage_usage_item": {
"data": {
"id": "7480",
"type": "usage_based_item"
}
},
"owner": {
"data": {
"id": "3",
"type": "users"
}
},
"primary_image": {
"data": {
"id": "25342",
"type": "images"
}
}
}
},
"included": [
{
"id": "4797",
"type": "breadcrumbs",
"attributes": {
"admin_level1_name": "Colorado",
"admin_level1_slug": "rv-rental/colorado",
"admin_level2_name": "Broomfield County",
"admin_level2_slug": "rv-rental/colorado/broomfield-county",
"locality_name": "Broomfield",
"locality_slug": "rv-rental/colorado/broomfield"
}
},
{
"id": "3",
"type": "users",
"attributes": {
"avatar_url": "https://res.cloudinary.com/outdoorsy/image/upload/v1444695094/p/users/3/images/fyxneiexjsce8dqi5axr.jpg",
"business_description": "",
"business_name": "Ryan's Rentals",
"business_phone": "303-819-9941",
"business_website": "https://www.outdoorsy.co/ryan",
"cancel_policy": "flexible",
"dealer": false,
"description": "Grew up in a 31' class C Winnebago, now traveling full time with my wife in a 19' Coachmen van.",
"experience": "5",
"first_name": "Ryan",
"guest": false,
"last_name": "Quinn",
"logo_url": "",
"mast_image_url": "https://res.cloudinary.com/outdoorsy/image/upload/v1452757275/p/users/3/images/zj8bbfrfbijaxqffpwyg.jpg",
"owner_reviews_count": 0,
"owner_score": 0,
"pro": false,
"reviews_count": 0,
"score": 0,
"slug": "ryan",
"social": [
{
"count": 0,
"link": "http://www.rvillage.com/profile/mazondo",
"rating": 0,
"site": "RVillage"
},
{
"count": 0,
"link": "https://www.twitter.com/mazondo",
"rating": 0,
"site": "Twitter"
}
],
"time_to_first_action": 441006,
"total_bookings": 95,
"years_owned": 2,
"years_r_ving": 0
}
},
{
"id": "25342",
"type": "images",
"attributes": {
"description": "",
"position": 0,
"primary": true,
"rental_id": 1916,
"skip_enhance": false,
"tags": "",
"url": "https://res.cloudinary.com/outdoorsy/image/upload/v1444694359/p/rentals/1916/images/sqreusdqos4tphvjhynn.jpg",
"video": false
}
}, ...
]
}
This endpoint retrieves a specific rental.
HTTP Request
GET https://search.outdoorsy.com/rentals/<ID>
URL Parameters
Parameter | Description |
---|---|
ID | The ID of the rental to retrieve |
Get Rental Availability
curl "https://api.outdoorsy.com/v0/availability"
-H "Partner-ID: your-partner-token"
The above command returns JSON structured like this:
[{
"rental_id":6948,
"from":"2018-01-01",
"to":"2018-02-28",
"next_available":"2018-03-01"
}, ... ]
This endpoint returns the unavailable dates for a specific rental or all of a user's rentals.
HTTP Request
GET https://api.outdoorsy.com/v0/availability
URL Parameters
Parameter | Type | Description |
---|---|---|
from | YYYY-MM-DD |
The date to start querying from for availability |
to | YYYY-MM-DD |
The date to end querying to for availability |
rental_id | Integer | The rental ID to fetch availability for |
owner_id | Integer | The owner ID to fetch availability for, returns all rentals for this owner |
Get Rental Add-Ons
curl 'https://api.outdoorsy.com/v0/items?available_for_rental_id=6973'
-H "Partner-ID: your-partner-token"
The above command returns JSON structured like this:
[
{
"available":0,
"category_id":0,
"daily":false,
"deferred":true,
"description":"Add-on description goes here",
"hidden":false,
"id":35291,
"image_url":"https://res.cloudinary.com/outdoorsy/image/upload/v1518818658/p/add-ons/addon/images/jzkrtlanbwfxqh2xlbz7.jpg",
"name":"Cleaning Supply Kit",
"position":0,
"price":10000,
"required":true,
"tax_rate_id":null,
"travelers":3,
"user_id":17075
}, ...
]
This endpoint returns optional and required add-ons for a given rental.
HTTP Request
GET https://api.outdoorsy.com/v0/items
URL Parameters
Parameter | Type | Description |
---|---|---|
available_for_rental_id | Integer | rental_id you want to pull add-ons for |
Get Locations
curl 'https://api.outdoorsy.com/v0/locations?owner_id={{OWNER_ID}}'
The above command returns JSON structured like this:
[
{
"id": 1, // this ID is useful for location filtering
"name": "Your location", // a name for the location set by the user
"availability": { /* Weekday availability for a location*/},
"street": "1234 Somestreet Lane",
"city": "Denver",
"state": "CO",
"zip": "80023",
"country": "US",
"owner_id": 1,
},
{ /* ... */}
]
Professional accounts have the ability to define multiple business locations for their rentals. In these cases, it can be useful to pull a list of locations for future filtering.
HTTP Request
GET https://api.outdoorsy.com/v0/locations?owner_id={{OWNER_ID}}
URL Parameters
Parameter | Description |
---|---|
owner_id | The ID of the user you want locations for |
Quotes & Bookings
Quotes can be generated as often as needed for any rental, the endpoint returns full pricing including insurance options, required add-ons, and taxes for any date range up to 2 years out. Once you're ready, you can create a booking request to initiate a booking for a user.
Get a Quote
curl 'https://api.outdoorsy.com/v0/quotes'
-H "Partner-ID: your-partner-token"
--data-binary '{"rental_id":"1916","from":"2018-03-14","to":"2018-03-22","items":[]}'
The above command returns JSON structured like this:
{
"calculated_day_price":10000,
"discount_code":"",
"discount_code_amount":0,
"discount_code_applied_to":"",
"discount_code_message":"",
"duration":8,
"final_payment_amount":60000,
"final_payment_due_date":"2018-02-28",
"items":[
{
"count":1,
"daily":false,
"deferred":false,
"description":"",
"generator":false,
"id":0,
"image_url":"",
"mileage":false,
"name":"Rental Amount",
"price":80000,
"rental_amount":true,
"required":false,
"tax_amount":0,
"tax_name":"",
"total":80000
}
],
"outdoorsy_fee":0,
"renter_credits_applied":0,
"reserve_amount":32000,
"security_deposit":100000,
"service_fee":12000,
"subtotal":80000,
"tax":0,
"total":92000,
"use_day_price":false
}
This endpoint returns an accurate quote for any specific rental
HTTP Request
POST https://api.outdoorsy.com/v0/quotes
Body Parameters
Parameter | Type | Description |
---|---|---|
from | YYYY-MM-DD |
The date to start querying from for availability |
to | YYYY-MM-DD |
The date to end querying to for availability |
rental_id | Integer | The rental ID to fetch availability for |
items | Array | Array of optional add-on ids to include with your quote |
Create a Booking Request
curl 'https://api.outdoorsy.com/v0/bookings'
-H "Partner-ID: your-partner-token"
-X POST
--data-binary '{"status":"negotiating","from":"2018-04-10","to":"2018-04-17","travelers":4,"message":"Your message here","rental_id":id,"renter":{"first_name":"John","last_name":"Smith","email":"test-email@test.com","phone":null},"items":[]}}'
The above command returns JSON structured like this:
{
"id": 1
... full booking object
}
This endpoint returns a full booking object, which can be used to redirect the user to complete the checkout process.
Once you've created the booking, you'll redirect the user to:
https://www.outdoorsy.com/dashboard/checkout/{{ID}}?token={{Anon-Token}}&user_id={{Anon-User-Id}}
HTTP Request
POST https://api.outdoorsy.com/v0/bookings
Body Parameters
Parameter | Type | Description |
---|---|---|
from | YYYY-MM-DD |
The date to start querying from for availability |
to | YYYY-MM-DD |
The date to end querying to for availability |
rental_id | Integer | The rental ID to fetch availability for |
items | Array | Array of optional add-on ids to include with your quote, example: items: [{id: 1, count: 2}] |
renter | Object | Renter information renter: {first_name: "Name", last_name: "Name", email: "email@email.com", phone: "333-333-3333"} |
message | String | A message the renter would like to include to the owner, useful for things like where they're going |
status | String | should always be negotiating |
travelers | Integer | how many travelers will be on the trip |
Response Headers
Parameter | Type | Description |
---|---|---|
Anon-Token | String | User ID used to continue checkout process |
Anon-User-Id | String | User ID used to continue checkout process |
X-Ppp-Token | String | Payment token used for storing card information |
Adding items to a Booking Request
curl 'https://api.staging.outdoorsy.com/v0/bookings/{{ID}}/items/copy'
-H "Partner-ID: your-partner-token"
-X POST
--data-binary '{"rental_item_id": {{ITEM_ID}}, "count": 1}'
The above command returns an item JSON structure
{
"booking_id":933900,
"count":2,
"daily":false,
"deferred":false,
"description":"Item description goes here",
"generator":false,
"id":1839808,
"image_url":"image-url",
"mileage":false,
"name":"Mobile Internet (while driving)",
"original_tax_rate_id":0,
"parent_item_id":39442,
"premium_amount":0,
"price":1500,
"rental_amount":false,
"required":false,
"tax_amount":0,
"tax_description":"",
"tax_name":"",
"tax_rate":0,
"tax_rates":[],
"total":3000
}
This endpoint takes an existing item from the Items for rental
endpoint and lets you copy them into an existing booking.
HTTP Request
POST https://api.staging.outdoorsy.com/v0/bookings/{{ID}}/items/copy
Body Parameters
Parameter | Type | Description |
---|---|---|
rental_item_id | Integer | Item ID for an existing rental addon, you get these using the rental items endpoint |
count | Integer | How many of the add-on to add |
Editing a Booking Request
curl 'https://api.outdoorsy.com/v0/bookings'
-H "Partner-ID: your-partner-token"
-X POST
--data-binary '{"status":"negotiating","from":"2018-04-10","to":"2018-04-17","travelers":4,"message":"Your message here","rental_id":id,"renter":{"first_name":"John","last_name":"Smith","email":"test-email@test.com","phone":null},"items":[]}}'
The above command returns JSON structured like this:
{
"id": 1
... full booking object
}
This endpoint requires an authentication token for the user who owns the booking, or an admin. returns a full booking object.
HTTP Request
PATCH https://api.outdoorsy.com/v0/bookings/{{ID}}
Body Parameters
Parameter | Type | Description |
---|---|---|
from | YYYY-MM-DD |
The date to start querying from for availability |
to | YYYY-MM-DD |
The date to end querying to for availability |
rental_id | Integer | The rental ID to fetch availability for |
items | Array | Array of optional add-on ids to include with your quote, example: items: [{id: 1, count: 2}] |
renter | Object | Renter information renter: {first_name: "Name", last_name: "Name", email: "email@email.com", phone: "333-333-3333"} |
message | String | A message the renter would like to include to the owner, useful for things like where they're going |
status | String | should always be negotiating |
travelers | Integer | how many travelers will be on the trip |
Response Headers
Parameter | Type | Description |
---|---|---|
X-Ppp-Token | String | Payment token used for storing card information |
Paying for a Booking
Example request body
{
"status": "approved",
"details": "Looking forward to the trip!",
"save_card_token": "asdf",
"rental_charge": {
"card_token": ""
},
"security_deposit_charge": {
"card_token": ""
}
}
Outdoorsy leverages Stripe for payment processing. When creating or updating a booking, you'll receive a public Stripe token as part of the header response. You can use that token to pass payment information into our system.
- Create a booking/quote to retrieve the Stripe Public Key for your partner account
- Follow the Stripe documentation listed here to create 2-3 Card tokens for the users card
- Hit the Status endpoint with the relevant tokens for your payment information
The endpoint will return a full booking object in response. If the booking has been pre-approved by an owner, or is an instantbookable listing, then the status should be returned as approved
or imminent
if the booking is scheduled to depart within 2 days. If the rental is not instant bookable, then the status will be negotiating
and the renter_approved
field will be true.
HTTP Request
PATCH https://api.outdoorsy.com/v0/bookings/{{id}}/status
Body Parameters
Parameter | Type | Description |
---|---|---|
status | String | approved is the most common, see statuses for more info |
details | String | A message you want to include to the owner of the vehicle being rented |
save_card_token | String required | Card token used to pay for the booking, including payments before departure |
rental_charge | Object | Charge Object (see below) |
security_deposit_charge | Object | Charge Object (see below) |
Charge Object
Charge objects allow you to specify a payment method other than the users default method for a specific charge. For example, if you want to charge a different card for a reservation deposit and a security deposit.
Parameter | Type | Description |
---|---|---|
card_token | String | Stripe token for the card |
Cancelling a booking
Withdrawing a rental request that hasn't been approved
{
"status": "renter_withdrew",
"details": "Can't make it!"
}
Canceling an approved booking
{
"status": "renter_cancelled",
"details": "Can't make it!"
}
HTTP Request
PATCH https://api.outdoorsy.com/v0/bookings/{{id}}/status
Body Parameters
Parameter | Type | Description |
---|---|---|
status | String | renter_withdrew or renter_cancelled |
details | String | A message you want to include to the owner of the vehicle being cancelled |
Booking statuses
During the lifecycle of a booking, it will pass through several states, here's a quick overview of the more common ones.
HTTP Request
PATCH https://api.outdoorsy.com/v0/bookings/{{id}}/status
Body Parameters
Status | Description |
---|---|
draft |
Quote has been created by the owner, but not yet sent to the renter |
negotiating |
Quote has been seen by both parties, but not yet approved by both, you can use the owner_accepted and renter_accepted fields to get a more detailed view |
approved |
The booking has been approved |
imminent |
The booking is approved and will depart within 2 days |
handed_off |
The booking is currently on vacation |
returned |
The booking has completed |
renter_withdrew |
The renter has withdrawn their request prior to approval |
renter_cancelled |
The renter has cancelled after their initial deposit has been paid |
owner_declined |
The owner has rejected a request from the renter |
owner_cancelled |
The owner has cancelled a request after the initial deposit has been paid |
Locales and Currencies
There are several API params that support locales and currencies - the following is a list of possible values supported by the platform.
Code | Locale |
---|---|
en-us | English - United States |
en-gb | English - United Kingdom |
en-ca | English - Canada |
en-au | English - Australia |
en-nz | English - New Zealand |
fr-fr | French - France |
fr-ca | French - Canada |
es-es | Spanish - Spain |
de-de | German - Germany |
it-it | Italian - Italy |
Code | Currency |
---|---|
usd | US Dollar |
gbp | British Pounds |
cad | Canadian Dollar |
eur | Euro |
aud | Australian Dollar |
nzd | New Zealand Dollars |
Errors
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- Your API key is wrong. |
403 | Forbidden -- The endpoint requested is hidden for administrators only. |
404 | Not Found -- The specified endpoint could not be found. |
406 | Not Acceptable -- You requested a format that isn't json. |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |