HOTELA API Documentation
Integrate booking, availability, and property management into your applications.
Base URL
Quick Start
Get your API credentials
Request API keys from the Developer section in your admin dashboard.
Authenticate your requests
Include your API key in the Authorization header.
Authorization: Bearer your_api_key_here
Make your first request
Check availability for a property:
curl -X GET "https://api.hotelacorp.com/v1/availability" \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{"property_id": "prop_123", "check_in": "2026-03-01", "check_out": "2026-03-05"}'
Response Format
All API responses are returned in JSON format with the following structure:
{
"success": true,
"data": { ... },
"meta": {
"page": 1,
"per_page": 20,
"total": 100
}
}
Authentication
Secure your API requests with API keys.
API Keys
All API requests must be authenticated using an API key. Include your key in the Authorization header:
Authorization: Bearer sk_live_your_api_key_here
Key Types
| Type | Prefix | Description |
|---|---|---|
| Live | sk_live_ |
Production API key for live transactions |
| Test | sk_test_ |
Sandbox API key for development and testing |
Rate Limits
API requests are rate limited to ensure fair usage:
- Standard: 100 requests per minute
- Enterprise: 1,000 requests per minute
Rate limit headers are included in all responses:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200
Error Handling
Understanding API error responses.
Error Response Format
When an error occurs, the API returns a JSON response with error details:
{
"success": false,
"error": {
"code": "invalid_request",
"message": "The check_in date must be in the future",
"field": "check_in"
}
}
HTTP Status Codes
| Status | Description |
|---|---|
| 200 | Request successful |
| 201 | Resource created successfully |
| 400 | Bad request - invalid parameters |
| 401 | Unauthorized - invalid or missing API key |
| 404 | Resource not found |
| 500 | Internal server error |
Error Codes
| Code | Description |
|---|---|
invalid_request |
The request was malformed or missing required fields |
authentication_failed |
Invalid API key or insufficient permissions |
resource_not_found |
The requested resource does not exist |
rate_limit_exceeded |
Too many requests - slow down |
booking_conflict |
The requested dates are no longer available |
List Bookings
Retrieve a paginated list of bookings.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| property_id | string | Filter by property ID |
| status | string | Filter by status: confirmed, pending, cancelled |
| check_in_from | date | Filter bookings with check-in on or after this date |
| check_in_to | date | Filter bookings with check-in on or before this date |
| page | integer | Page number (default: 1) |
| per_page | integer | Results per page (default: 20, max: 100) |
Example Request
curl -X GET "https://api.hotelacorp.com/v1/bookings?status=confirmed&per_page=10" \
-H "Authorization: Bearer sk_live_xxx"
Example Response
{
"success": true,
"data": [
{
"id": "bkg_abc123",
"property_id": "prop_xyz",
"room_id": "room_456",
"guest": {
"name": "Tanaka Taro",
"email": "tanaka@example.com",
"phone": "+81-90-1234-5678"
},
"check_in": "2026-03-01",
"check_out": "2026-03-05",
"nights": 4,
"total_amount": 120000,
"currency": "JPY",
"status": "confirmed",
"created_at": "2026-01-15T10:30:00Z"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 45
}
}
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Documentation Coming Soon
This endpoint documentation is being prepared. Check back soon for complete details.
Supabase Overview
Backend-as-a-Service powering HOTELA's database, authentication, and storage.
Project Configuration
| Project URL | https://rdqwmnsrtvnfskrgnyfh.supabase.co |
| Region | Tokyo (ap-northeast-1) |
| Database | PostgreSQL 15 |
Services Used
RESTful API auto-generated from PostgreSQL schema. Supports filtering, pagination, and joins.
Email/password authentication for admin users. JWT tokens with Row Level Security (RLS).
Object storage for media assets. Bucket: inventory for room images, floor plans, etc.
Serverless functions for GMO payment processing, webhooks, and custom logic.
Database API
PostgREST auto-generated REST API from PostgreSQL schema.
Base URL
Authentication
// Required headers
apikey: YOUR_ANON_KEY
Authorization: Bearer YOUR_JWT_TOKEN
Key Tables
| Table | Description |
|---|---|
bookings |
Guest reservations |
rooms |
Bookable units/rooms |
properties |
Hotel properties |
owners |
Unit owners |
payments |
Payment transactions |
media_assets |
Images, videos, documents |
admin_users |
Admin portal users |
Example: Query Bookings
// Get confirmed bookings with guest info
const { data, error } = await supabase
.from('bookings')
.select(`
id, check_in, check_out, status,
rooms(name, property_id),
guests(first_name, last_name, email)
`)
.eq('status', 'confirmed')
.gte('check_in', '2026-01-01')
.order('check_in', { ascending: true })
.limit(50);
PostgREST Query Syntax
| Operation | Syntax |
|---|---|
| Equal | ?column=eq.value |
| Not Equal | ?column=neq.value |
| Greater Than | ?column=gt.value |
| Less Than | ?column=lt.value |
| In List | ?column=in.(a,b,c) |
| Like | ?column=like.*pattern* |
| Order | ?order=column.desc |
| Limit | ?limit=10 |
| Select Fields | ?select=col1,col2 |
Authentication
Supabase Auth with email/password for admin users.
Sign In
const { data, error } = await supabase.auth.signInWithPassword({
email: 'admin@hotelacorp.com',
password: 'your-password'
});
// Returns session with access_token (JWT)
Get Current Session
const { data: { session } } = await supabase.auth.getSession();
if (session) {
console.log('User ID:', session.user.id);
console.log('Email:', session.user.email);
}
Sign Out
await supabase.auth.signOut();
Row Level Security (RLS)
All tables use RLS policies to control access. Users can only access data they're authorized to see based on their role and organization.
Storage
Object storage for media assets.
Buckets
| Bucket | Purpose | Public |
|---|---|---|
inventory |
Room images, floor plans, property media | Yes |
Upload File
const { data, error } = await supabase.storage
.from('inventory')
.upload(`rooms/${roomId}/${filename}`, file, {
cacheControl: '3600',
upsert: false
});
Get Public URL
const { data } = supabase.storage
.from('inventory')
.getPublicUrl('rooms/123/image.jpg');
console.log(data.publicUrl);
// https://rdqwmnsrtvnfskrgnyfh.supabase.co/storage/v1/object/public/inventory/rooms/123/image.jpg
Delete File
const { error } = await supabase.storage
.from('inventory')
.remove(['rooms/123/image.jpg']);
Edge Functions
Serverless functions running on Deno.
Base URL
Available Functions
| Function | Purpose |
|---|---|
gmo-payment |
Credit card payments via GMO |
gmo-webhook |
Payment status webhooks from GMO |
admin-auth |
Admin user authentication |
Calling Edge Functions
const { data, error } = await supabase.functions.invoke('gmo-payment', {
body: {
action: 'charge',
amount: 50000,
cardToken: 'token_xxx',
cardholderName: 'TARO TANAKA',
payerEmail: 'customer@example.com'
}
});
GMO Payment Gateway
Japan's #1 payment processor for credit card transactions.
API Environments
| Environment | Base URL |
|---|---|
| Production | https://p01.mul-pay.jp |
| Sandbox | https://pt01.mul-pay.jp |
Supported Payment Methods
Visa, Mastercard, JCB, American Express, Diners Club - with 3D Secure 2.0
Authentication
// Basic Auth with ShopID:ShopPass
Authorization: Basic base64(ShopID:ShopPass)
Edge Function Endpoint
Test Cards
| Card Number | Brand | Result |
|---|---|---|
4111111111111111 |
Visa | Success |
5111111111111118 |
Mastercard | Success |
3530111333300000 |
JCB | Success |
4111111111111112 |
Visa | Declined |
Create Charge
Process a credit card payment.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | integer | Required | Amount in JPY |
| cardToken | string | Required | Token from GMO Multipayment.js |
| cardholderName | string | Required | Name on card (uppercase) |
| payerEmail | string | Required | Customer email |
| bookingId | uuid | Optional | Link to booking record |
| authorizationMode | string | Optional | AUTH (hold) or CAPTURE (immediate) |
| use3DS | boolean | Optional | Enable 3D Secure (default: true) |
| returnUrl | string | Optional | 3DS redirect return URL |
Example Request
const { data, error } = await supabase.functions.invoke('gmo-payment', {
body: {
action: 'charge',
amount: 50000,
cardToken: 'tok_abc123...',
cardholderName: 'TARO TANAKA',
payerEmail: 'tanaka@example.com',
bookingId: 'bkg_xyz789',
authorizationMode: 'CAPTURE',
use3DS: true,
returnUrl: 'https://hotelacorp.com/payment/complete'
}
});
Success Response
{
"success": true,
"paymentId": "pay_abc123",
"orderId": "HTL-20260122-XYZ789",
"status": "captured",
"transactionId": "TXN-98765",
"cardBrand": "VISA",
"cardLast4": "1111",
"approvalCode": "123456"
}
3DS Redirect Response
{
"success": true,
"requires3DS": true,
"redirectUrl": "https://acs.cardissuer.com/3ds/...",
"paymentId": "pay_abc123",
"orderId": "HTL-20260122-XYZ789"
}
Error Response
{
"success": false,
"error": "Card number is invalid",
"errorCode": "E01040002",
"paymentId": "pay_abc123",
"orderId": "HTL-20260122-XYZ789"
}
Capture Payment
Capture a previously authorized payment.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| paymentId | uuid | Required | Payment ID from charge response |
| amount | integer | Optional | Capture amount (can be less than authorized) |
Example Request
const { data, error } = await supabase.functions.invoke('gmo-payment', {
body: {
action: 'capture',
paymentId: 'pay_abc123',
amount: 45000 // Partial capture
}
});
Response
{
"success": true,
"paymentId": "pay_abc123",
"status": "captured",
"capturedAmount": 45000
}
Get Payment Status
Check the current status of a payment.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| paymentId | uuid | Payment ID |
| orderId | string | Alternative: Order ID (HTL-...) |
Response
{
"success": true,
"payment": {
"id": "pay_abc123",
"orderId": "HTL-20260122-XYZ789",
"amount": 50000,
"status": "captured",
"paymentMethod": "credit",
"cardBrand": "VISA",
"cardLast4": "1111",
"transactionId": "TXN-98765",
"authorizedAt": "2026-01-22T10:30:00Z",
"capturedAt": "2026-01-22T10:30:05Z",
"createdAt": "2026-01-22T10:30:00Z"
}
}
Payment Statuses
| Status | Description |
|---|---|
pending |
Payment initiated, awaiting processing |
3ds_pending |
Awaiting 3D Secure authentication |
authorized |
Card authorized, not yet captured |
captured |
Payment completed successfully |
failed |
Payment failed (declined, error) |
cancelled |
Payment voided/refunded |
Cancel Payment
Void an authorized or captured payment.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| paymentId | uuid | Required | Payment ID to cancel |
| reason | string | Optional | Reason for cancellation |
Example Request
const { data, error } = await supabase.functions.invoke('gmo-payment', {
body: {
action: 'cancel',
paymentId: 'pay_abc123',
reason: 'Customer requested cancellation'
}
});
Response
{
"success": true,
"paymentId": "pay_abc123",
"status": "cancelled"
}
RoomBoss API
Property management system integration for availability, rates, and reservations.
Base URL
Available APIs
| API | Purpose | Use Case |
|---|---|---|
| Hotel API | Accommodation management | Hotels, villas, lodges, apartments |
| GS Purchasing API | Guest services management | Rentals, lessons, transfers, activities |
| iCal | Simple availability sync | Calendar integrations |
Features
- Real-time availability and pricing
- Multi-property management
- Room type and rate plan configuration
- Reservation creation and management
- Guest services booking (rentals, lessons, etc.)
- Channel management integration
Documentation
Full RoomBoss API documentation: developers.roomboss.com
RoomBoss Authentication
Authenticate API requests using your RoomBoss credentials.
Authentication Method
RoomBoss API uses HTTP Basic Authentication or API Key authentication.
Option 1: API Key Header
GET /v1/locations HTTP/1.1
Host: api.roomboss.com
X-API-Key: your_roomboss_api_key
Content-Type: application/json
Option 2: Basic Auth
GET /v1/locations HTTP/1.1
Host: api.roomboss.com
Authorization: Basic base64(username:password)
Content-Type: application/json
JavaScript Example
// Using fetch with API Key
const response = await fetch('https://api.roomboss.com/v1/locations', {
method: 'GET',
headers: {
'X-API-Key': process.env.ROOMBOSS_API_KEY,
'Content-Type': 'application/json'
}
});
const locations = await response.json();
Required Credentials
| Credential | Description | Where to Get |
|---|---|---|
| API Key | Your RoomBoss API key | RoomBoss Admin Portal |
| Account ID | Your RoomBoss account identifier | RoomBoss Admin Portal |
Get Locations
Retrieve all locations (properties) from RoomBoss.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| active | boolean | Optional | Filter by active status |
| region | string | Optional | Filter by region code |
Example Request
const response = await fetch('https://api.roomboss.com/v1/locations?active=true', {
headers: {
'X-API-Key': ROOMBOSS_API_KEY
}
});
const { data } = await response.json();
Response
{
"success": true,
"data": [
{
"id": "loc_12345",
"name": "Niseko Mountain Resort",
"code": "NMR",
"region": "niseko",
"address": {
"street": "123 Ski Lane",
"city": "Kutchan",
"prefecture": "Hokkaido",
"postal_code": "044-0081",
"country": "JP"
},
"coordinates": {
"lat": 42.8048,
"lng": 140.6874
},
"amenities": ["wifi", "parking", "ski_storage", "onsen"],
"images": [
"https://cdn.roomboss.com/locations/loc_12345/main.jpg"
],
"active": true,
"created_at": "2024-01-15T00:00:00Z"
}
],
"meta": {
"total": 15,
"page": 1,
"per_page": 20
}
}
Get Room Types
Retrieve room types for a location.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| location_id | string | Required | Location/property ID |
Example Request
const response = await fetch('https://api.roomboss.com/v1/locations/loc_12345/room-types', {
headers: {
'X-API-Key': ROOMBOSS_API_KEY
}
});
const { data } = await response.json();
Response
{
"success": true,
"data": [
{
"id": "rt_001",
"location_id": "loc_12345",
"name": "Deluxe Suite",
"code": "DLX",
"description": "Spacious suite with mountain views",
"max_occupancy": 4,
"bedrooms": 2,
"bathrooms": 1,
"size_sqm": 65,
"amenities": ["kitchen", "washer", "balcony", "mountain_view"],
"images": [
"https://cdn.roomboss.com/room-types/rt_001/main.jpg",
"https://cdn.roomboss.com/room-types/rt_001/bedroom.jpg"
],
"inventory_count": 5,
"active": true
},
{
"id": "rt_002",
"location_id": "loc_12345",
"name": "Standard Room",
"code": "STD",
"description": "Comfortable room for couples",
"max_occupancy": 2,
"bedrooms": 1,
"bathrooms": 1,
"size_sqm": 35,
"amenities": ["kitchen", "washer"],
"images": [],
"inventory_count": 10,
"active": true
}
]
}
Check Availability
Query real-time availability for dates and room types.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| location_id | string | Required | Location to check |
| check_in | date | Required | Check-in date (YYYY-MM-DD) |
| check_out | date | Required | Check-out date (YYYY-MM-DD) |
| guests | integer | Optional | Number of guests (default: 2) |
| room_type_id | string | Optional | Filter by specific room type |
Example Request
const params = new URLSearchParams({
location_id: 'loc_12345',
check_in: '2026-02-01',
check_out: '2026-02-05',
guests: 2
});
const response = await fetch(`https://api.roomboss.com/v1/availability?${params}`, {
headers: {
'X-API-Key': ROOMBOSS_API_KEY
}
});
const { data } = await response.json();
Response
{
"success": true,
"data": {
"location_id": "loc_12345",
"check_in": "2026-02-01",
"check_out": "2026-02-05",
"nights": 4,
"available_rooms": [
{
"room_type_id": "rt_001",
"room_type_name": "Deluxe Suite",
"available_units": 3,
"rates": [
{
"rate_plan_id": "rp_standard",
"rate_plan_name": "Standard Rate",
"total_price": 120000,
"currency": "JPY",
"price_per_night": 30000,
"breakdown": [
{ "date": "2026-02-01", "price": 30000 },
{ "date": "2026-02-02", "price": 30000 },
{ "date": "2026-02-03", "price": 30000 },
{ "date": "2026-02-04", "price": 30000 }
],
"cancellation_policy": "free_until_7_days"
}
]
},
{
"room_type_id": "rt_002",
"room_type_name": "Standard Room",
"available_units": 5,
"rates": [
{
"rate_plan_id": "rp_standard",
"rate_plan_name": "Standard Rate",
"total_price": 60000,
"currency": "JPY",
"price_per_night": 15000
}
]
}
]
}
}
Get Rates
Retrieve rate plans and pricing for room types.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| location_id | string | Required | Location ID |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| start_date | date | Required | Start of date range |
| end_date | date | Required | End of date range |
| room_type_id | string | Optional | Filter by room type |
Example Request
const response = await fetch(
'https://api.roomboss.com/v1/locations/loc_12345/rates?start_date=2026-02-01&end_date=2026-02-28',
{
headers: { 'X-API-Key': ROOMBOSS_API_KEY }
}
);
const { data } = await response.json();
Response
{
"success": true,
"data": {
"location_id": "loc_12345",
"rate_plans": [
{
"id": "rp_standard",
"name": "Standard Rate",
"description": "Best available rate",
"rates": [
{
"room_type_id": "rt_001",
"room_type_name": "Deluxe Suite",
"daily_rates": [
{ "date": "2026-02-01", "price": 30000, "min_stay": 1 },
{ "date": "2026-02-02", "price": 30000, "min_stay": 1 },
{ "date": "2026-02-07", "price": 45000, "min_stay": 2 }
]
}
]
},
{
"id": "rp_early_bird",
"name": "Early Bird",
"description": "Book 30+ days in advance",
"discount_percent": 15,
"rates": []
}
]
}
}
Create Reservation
Book a room in RoomBoss.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| location_id | string | Required | Location ID |
| room_type_id | string | Required | Room type ID |
| rate_plan_id | string | Required | Rate plan ID |
| check_in | date | Required | Check-in date |
| check_out | date | Required | Check-out date |
| guest | object | Required | Guest details (name, email, phone) |
| guests_count | integer | Required | Number of guests |
| special_requests | string | Optional | Special requests or notes |
Example Request
const response = await fetch('https://api.roomboss.com/v1/reservations', {
method: 'POST',
headers: {
'X-API-Key': ROOMBOSS_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
location_id: 'loc_12345',
room_type_id: 'rt_001',
rate_plan_id: 'rp_standard',
check_in: '2026-02-01',
check_out: '2026-02-05',
guests_count: 2,
guest: {
first_name: 'Taro',
last_name: 'Yamada',
email: 'taro@example.com',
phone: '+81-90-1234-5678',
country: 'JP'
},
special_requests: 'Late check-in around 8pm'
})
});
const { data } = await response.json();
Response
{
"success": true,
"data": {
"id": "res_abc123",
"confirmation_number": "RB-2026-00123",
"status": "confirmed",
"location_id": "loc_12345",
"room_type_id": "rt_001",
"check_in": "2026-02-01",
"check_out": "2026-02-05",
"nights": 4,
"guests_count": 2,
"guest": {
"first_name": "Taro",
"last_name": "Yamada",
"email": "taro@example.com"
},
"pricing": {
"subtotal": 120000,
"taxes": 12000,
"total": 132000,
"currency": "JPY"
},
"cancellation_policy": {
"type": "free_until_7_days",
"free_cancel_until": "2026-01-25T15:00:00Z",
"penalty_amount": 30000
},
"created_at": "2026-01-20T10:30:00Z"
}
}
Modify Reservation
Cancel Reservation
// Cancel a reservation
const response = await fetch('https://api.roomboss.com/v1/reservations/res_abc123', {
method: 'DELETE',
headers: { 'X-API-Key': ROOMBOSS_API_KEY }
});
// Response: { success: true, cancellation_fee: 0 }
Guest Services (GS API)
Book rentals, lessons, transfers, and activities.
List Services
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| category | string | Optional | Filter by category: rentals, lessons, transfers, activities |
| location_id | string | Optional | Filter by location |
| date | date | Optional | Check availability for date |
Example: Get Ski Rentals
const response = await fetch(
'https://api.roomboss.com/v1/services?category=rentals&location_id=loc_12345',
{ headers: { 'X-API-Key': ROOMBOSS_API_KEY } }
);
const { data } = await response.json();
Response
{
"success": true,
"data": [
{
"id": "svc_ski_001",
"category": "rentals",
"name": "Ski & Boot Package",
"description": "Premium ski and boot rental",
"duration_type": "daily",
"pricing": {
"adult": 5500,
"child": 3500,
"currency": "JPY"
},
"options": [
{ "id": "opt_helmet", "name": "Helmet", "price": 1000 },
{ "id": "opt_poles", "name": "Poles", "price": 500 }
],
"available": true
},
{
"id": "svc_lesson_001",
"category": "lessons",
"name": "Private Ski Lesson",
"description": "1-on-1 instruction",
"duration_type": "hourly",
"duration_hours": 2,
"pricing": {
"per_session": 18000,
"currency": "JPY"
},
"max_participants": 1,
"available": true
}
]
}
Book Service
const response = await fetch('https://api.roomboss.com/v1/service-bookings', {
method: 'POST',
headers: {
'X-API-Key': ROOMBOSS_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
service_id: 'svc_ski_001',
date: '2026-02-02',
quantity: {
adult: 2,
child: 1
},
options: ['opt_helmet'],
guest: {
first_name: 'Taro',
last_name: 'Yamada',
email: 'taro@example.com'
},
reservation_id: 'res_abc123' // Optional: link to accommodation
})
});
Webhooks
Receive real-time notifications for payment events.
GMO Webhook Endpoint
Webhook Events
| Event | Description |
|---|---|
charge.success |
Payment completed successfully |
charge.failed |
Payment failed |
3ds.complete |
3D Secure authentication completed |
refund.success |
Refund processed |