Admin / API Documentation
v1.0

HOTELA API Documentation

Integrate booking, availability, and property management into your applications.

API Access: The HOTELA API is currently in beta. Contact your account manager to request API credentials.

Base URL

https://api.hotelacorp.com/v1

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
Keep your API keys secure! Never expose API keys in client-side code, public repositories, or browser requests.

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.

GET /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.

Supabase Console: supabase.com/dashboard

Project Configuration

Project URL https://rdqwmnsrtvnfskrgnyfh.supabase.co
Region Tokyo (ap-northeast-1)
Database PostgreSQL 15

Services Used

Database (PostgREST)

RESTful API auto-generated from PostgreSQL schema. Supports filtering, pagination, and joins.

Authentication

Email/password authentication for admin users. JWT tokens with Row Level Security (RLS).

Storage

Object storage for media assets. Bucket: inventory for room images, floor plans, etc.

Edge Functions

Serverless functions for GMO payment processing, webhooks, and custom logic.

Database API

PostgREST auto-generated REST API from PostgreSQL schema.

Base URL

https://rdqwmnsrtvnfskrgnyfh.supabase.co/rest/v1

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.

Service Role Key: Bypasses RLS. Only use in server-side code (Edge Functions). Never expose in client-side code.

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

https://rdqwmnsrtvnfskrgnyfh.supabase.co/functions/v1

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.

GMO Documentation: gmo-pg.com | OpenAPI Reference

API Environments

Environment Base URL
Production https://p01.mul-pay.jp
Sandbox https://pt01.mul-pay.jp

Supported Payment Methods

Credit Cards

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

POST /functions/v1/gmo-payment?action={action}

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.

POST /functions/v1/gmo-payment?action=charge

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.

POST /functions/v1/gmo-payment?action=capture

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.

POST /functions/v1/gmo-payment?action=inquiry&paymentId={id}

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.

POST /functions/v1/gmo-payment?action=cancel

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"
}
Same-day vs Next-day: Same-day cancellations are voids (no fee). After settlement, cancellations become refunds (may incur fees).

RoomBoss API

Property management system integration for availability, rates, and reservations.

External API: RoomBoss is a third-party PMS. API access requires a RoomBoss account and API credentials. Contact RoomBoss for API access.

Base URL

https://api.roomboss.com/v1

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.

GET /v1/locations

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.

GET /v1/locations/{location_id}/room-types

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.

GET /v1/availability

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.

GET /v1/locations/{location_id}/rates

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.

POST /v1/reservations

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

PUT /v1/reservations/{reservation_id}

Cancel Reservation

DELETE /v1/reservations/{reservation_id}
// 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.

GS Purchasing API: This API handles non-accommodation services like ski rentals, lessons, airport transfers, and activities.

List Services

GET /v1/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

POST /v1/service-bookings
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

POST /functions/v1/gmo-webhook

Webhook Events

Event Description
charge.success Payment completed successfully
charge.failed Payment failed
3ds.complete 3D Secure authentication completed
refund.success Refund processed
Webhooks must be configured in the GMO merchant console. Contact support for webhook URL setup.