Attention this is Unofficial AirBnb API based on Android Application. Use this API at you own risk and only for educational purposes
- Manage listings
- Manage calendar
- Manage reservations
- Manage own profile
- Manage conversations
- Other things related to AirBnb
- Everything is returned in JSON format
- Improve documentation
- Support more endpoints
- Store session in redis(currently in json file)
- Add tests
- Installation
- Usage
- Examples
- Options
Possible errors
- If there will be let me know
Install from NPM
$ npm i airbnb-private-api
Install from YARN
$ yarn add airbnb-private-api
const { AirBnbClient } = require('airbnb-private-api');
- If the request was successful then you don't need to execute this method anymore. All required AUTH data will be saved to a JSON file
- Authorization by using email and password
- New device credentials will be generated
- To make it convenient the login token and the device details will be saved to a file {session_path}/{email}.json for the future usage
let airbnb = new AirBnbClient({
email: 'email@example.com',
password: 'password',
session_path: '/user/bob/Downloads',
});
(async() => {
try {
let response = await airbnb._authentication_by_email();
console.log('Login details: ', response);
} catch (error) {
console.log('Error: ', error);
}
})()
- This is the best way to authorize to the AirBnb. In that case chances of receiving checkpoint are drastically lower
- If the request was successful then you don't need to execute this method anymore. All required AUTH data will be saved to a JSON file
- Authorization by using phone
- New device credentials will be generated
- To make it convenient the login token and the device details will be saved to a file {session_path}/{email}.json for the future usage
let airbnb = new AirBnbClient({
phone: '18009009899',
session_path: '/user/bob/Downloads',
});
(async() => {
try {
// First you need to send request to receive the SMS code
await airbnb._send_auth_code_to_phone();
// After receiving the SMS code you need to submit it in order to receive the login credentials
let response = await airbnb._authentication_by_phone(SMS_CODE);
console.log('Login details: ', response);
} catch (error) {
console.log('Error: ', error);
}
})()
- Before calling any other method, we need to load an active session
- Method _load_session() will load the device credentials and auth token from the a {session_path}/{email}.json
(async() => {
try {
await airbnb._load_session();
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is returning all your profile information
(async() => {
try {
let response await airbnb._get_my_profile();
console.log('My profile information: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is returning public user details
- USER_ID - positive number(>0)
(async() => {
try {
let response = await airbnb._get_user_profile(USER_ID);
console.log('User information: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is returning items that are located in the Saved section of your profile
- Method is accepting an object with _limit and _offset values
- _limit - limit of items to display. Defaut value: 10
- _offset - number of items to skip. Default value: 0
(async() => {
try {
let response = await airbnb._get_wishlists({ _limit: 10, _offset: 0});
console.log('Saved Items: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will return ARRAY of home listings from a search result
- Method is accepting an object:
{
// Number of items to return: {number default: 30}
_limit,
// Number of items to skip: {number default: 0}
_offset,
// Number of adults: {number default: 0}
adults,
// Number of children: {number default: 0}
children,
// Number of infants: {number default: 0}
infants,
// ISO Check In date. For example: '2020-02-17': {string default: ''}
checkin,
// ISO Check Out date. For example: '2020-02-20': {string default: ''}
checkout,
// Search query. For example: Boston, MA, USA : {string default: ''}
query,
// Array of amenities ID's: {array default: number[]}
// Some of the ID's that i figured out
// 30 - Heating
// 44 - Hangers
// 4 - WiFi
// 8 - Kitchen
// 45 - Hair Drier
// 41 - Shampoo
// 5 - AC
// 33 - Washer
// 34 - Dryer
// 27 - Fireplace
// 46 - Iron
// 47 - Laptop friendly workspace
// 58 - Tv
// 64 - High chair
// 58 - Self check in
// 35 - Smoke alarm
// 36 - Carbon monoxide alarm
// 78 - Private bathroom
// 12 - Pets allowed
// 9 - Free parking on premises
// 25 - Hot Tub
amenities,
// Array of room types: {array default: string[]}
// Possible values: "Entire home/apt", "Private room", "Hotel room", "Shared room"
room_types,
// Show only instant bookings: {boolean default: false}
ib,
// Show only superhosts: {boolean default: false}
superhost,
// Minimum price: {number default: }
price_min,
// Maximum price: {number default: }
price_max,
// Minimum bathrooms: {number default: }
min_bathrooms,
// Minimum bedrooms: {number default: }
min_bedrooms,
// Minimum beds: {number default: }
min_beds,
}
- If some values are empty then you will receive an empty array
(async () => {
try {
let response = await airbnb._get_listings_from_search({
adults: 2,
checkin: '2020-03-07',
checkout: '2020-03-12',
query: 'Boston, MA, USA',
_limit: 50,
amenities: [30, 44, 4, 8, 45, 12, 25],
price_max: 689,
price_min: 25,
room_types: ['Private room'],
});
console.log('Saved Items: ', response);
} catch (error) {
console.log('Error: ', error);
}
})();
- Method is returning a list of your listed properties
- Method is accepting an object with id and _limit values
- id - listing id. If not specified then method will return _limit number of listings. Defaut value: 0
- _limit - number of listings to return. Default value: 10
(async() => {
try {
let response = await airbnb._get_listings({ _limit: 20 });
console.log('My listings: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is updating the price on the listing_id on the specified dates
- Method is accepting an object with the listing_id , daily_price and dates
- listing_id: number - listing id
- daily_price: number - new price
- dates: Array[ISO_DATE] - array of ISO dates. Date should be in ISO format. For example ['2020-02-18', '2020-02-19', '2020-02-28']
(async() => {
try {
let response = await airbnb._update_calendar_price({
dates: ['2020-02-18', '2020-02-19', '2020-02-28'],
listing_id: 1,
daily_price: 12,
});
console.log('Result: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is updating availablity for the listing_id
- Method is accepting an object with the listing_id , availability and dates
- listing_id: number - listing id
- availability: boolean - true available, false not available
- dates: Array[ISO_DATE] - array of iso dates. Date should be in ISO format. For example ['2020-02-18', '2020-02-19', '2020-02-28']
(async() => {
try {
let response = await airbnb._update_calendar_availability({
dates: ['2020-02-18'],
listing_id: 1,
availability: true,
});
console.log('Result: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is updating note on the listing_id for the specified dates
- Method is accepting an object with the listing_id , notes and dates
- listing_id: number - listing id
- notes: string - any string
- dates: Array[ISO_DATE] - array of iso dates. Date should be in ISO format. For example ['2020-02-18', '2020-02-19', '2020-02-28']
(async() => {
try {
let response = await airbnb._update_calendar_note({
dates: ['2020-02-18','2020-02-25'],
listing_id: 1,
notes: "Blah blah blah",
});
console.log('Result: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method is enabling or disabled smart pricing on the listing_id for the specified dates
- Method is accepting an object with listing_id , active and dates
- listing_id: number - listing id
- active: boolean - true enabled, false disabled
- dates: Array[ISO_DATE] - array of iso dates. Date should be in ISO format. For example ['2020-02-18', '2020-02-19', '2020-02-28']
(async() => {
try {
let response = await airbnb._update_calendar_smart_pricing({
dates: ['2020-02-18','2020-02-25'],
listing_id: 1,
notes: "Blah blah blah",
});
console.log('Result: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will synchronize latest messages from your profile
- Method is accepting an object:
{
//Profile type 'guest', 'host', 'experience_host' or 'guest_and_host': {string default: 'host'}
type,
//Number of items to return: {number default: 10}
_limit,
}
- If someone will send you a message then you can retrieve details of the message(thread) by calling this method. Airbnb App is calling this method once in a while to sync all new messages with the App.
(async() => {
try {
let response = await airbnb._messaging_syncs({ type:'guest_and_host' });
console.log('Result: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will return thread id's
- Method is accepting an object with the _limit , _offset and type
- _limit: number - number of items to return: Default 10
- _offset: number - number of items to skip: Default 0
- type: string - inbox type. Can be 'guest', 'host', 'experience_host' or 'guest_and_host'. Default 'host'
(async() => {
try {
let response = await airbnb._get_threads_ids({ type:'guest_and_host', _limit: 20});
console.log('List of thread ids: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will return conversations from a specific thread id(conversation id)
- Method is accepting an object:
{
//Thread id: {number default: null}
id,
}
(async() => {
try {
let response = await airbnb._get_thread_by_id({ id: 1212 });
console.log('Conversation details: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- The more threads you request the longer request will execute
- Method will return full thread(conversation) data for the last _limit threads
- Method is accepting an object with the _limit , _offset and type
- _limit: number - number of items to return: Default 10
- _offset: number - number of items to skip: Default 0
- type: string - inbox type. Can be 'guest', 'host', 'experience_host' or 'guest_and_host'. Default 'host'
(async() => {
try {
let response = await airbnb._get_threads_full({ type:'guest', _limit: 5});
console.log('Threads: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will return a (_limit ) number of reservations
- Method is accepting an object:
{
//Number of items to return: {number default: 30}
_limit,
//Number of items to skip: {number default: 0}
_offset,
//ISO date. For example '2020-02-17': {string default: CURRENT_DATE}
//Show only reservation from start_date
start_date,
//ISO date. For example '2020-02-17': {string default: ''}
//Show only reservation till end_date
end_date,
//You can sort list by 'start_date', 'nights', 'number_of_guests' and 'status': {string default: 'start_date'}
order_by,
//Include accepted reservations: {boolean default: true}
include_accept,
//Include canceled reservations: {boolean default: false}
include_canceled,
//Include reservations with additional verification request: {boolean default: false}
include_checkpoint,
//Include canceled reservations: {boolean default: false}
include_pending;
}
(async() => {
try {
let response = await airbnb._get_reservations({
_limit: 20,
_offset: 0,
order_by: 'nights',
end_date: '2020-04-17'
});
console.log('Reservation list: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
- Method will return details from the specified RESERVATION_ID
- RESERVATION_ID - string
(async() => {
try {
let response = await airbnb._get_reservation_details(RESERVATION_ID);
console.log('Reservation details: ', response)
} catch (error) {
console.log('Error: ', error);
}
})()
const { AirBnbClient } = require('airbnb-private-api');
let airbnb = new AirBnbClient({
email: 'email@example.com',
password: 'password',
session_path: '/user/bob/Downloads',
});
// If we do not have an active session then we need to call _authentication_by_email() or _authentication_by_phone() method
// If authorization was succesfull(no errors) then Do Not Use this method anymore in the future
(async() => {
try {
await airbnb._authentication_by_email();
let my_listings = await airbnb._get_listings({});
console.log("My listings: ", my_listings)
} catch (error) {
console.log('Error: ', error);
}
})()
// If we already have an active session then we need to load session details with method _load_session()
(async() => {
try {
await airbnb._load_session();
let my_listings = await airbnb._get_listings({});
console.log("My listings: ", my_listings)
} catch (error) {
console.log('Error: ', error);
}
})()
let options = {
//Email: {string default: ""}
email: "exampl@mail.com",
//Password: {string default: ""}
password: 'bob',
//Set proxy: {string default: ""}
proxy: "",
//Set currency: {string default: "USD"}
currency: 'USD',
//Set locale: {string default: "en-US"}
locale: 'en-US',
// Session is stored in json file and file it self should be stored somewhere
// Set session file location: {string default: "{HOME_DIR}/Downloads}
session_path:'/user/bob/Downloads',
};
MIT
Free Software