Initial Setup
The first sync: the vendor creates property, room type, rate plan model, and rate plan content with POST, then pushes rates and availability (ARI) to make the property sellable. Content always flows vendor → ONDA; lookups (GET) are a fallback.
Step by step
- Fetch the code catalog —
GET /gds/vendor/meta(tag codes such as_tagsused when creating properties and rooms) - Create the property —
POST /gds/vendor/properties - Create room types —
POST .../{vendor_property_id}/roomtypes - Create rate plan models —
POST .../{vendor_property_id}/rateplan-models - Create rate plans —
POST .../roomtypes/{vendor_roomtype_id}/rateplans(bound viavendor_rateplan_model_id) - Push rates and business days —
POST .../ari(per rate plan) - Push availability —
POST .../ari/avails(consolidated per room type)
Checklist
- Fetch the code catalog (
_tagsand similar) withGET /gds/vendor/metaand build the mapping table into your system - Create in order: property → room type → rate plan model → rate plan
- Use tag codes from the meta lookup for
_tagswhen creating properties and rooms - Verify the
vendor_rateplan_model_idbinding when creating rate plans - Push rates and business days per rate plan with
POST .../ari, and availability per room type withPOST .../ari/avails - Send the shared value (
default) and the full per-channel declaration (channels[]) together in a single call - Use partial pushes: include only what changed in
ari(business dayis_business_day, or ratesbasic_price,sale_price,net_price) - Align
ari/availsavailability to room-only (room type) counts; each from-to range spans at most 730 days - (Optional) Verify the fallback content lookups (
GET)
Using the code catalog (meta)
Code-based fields on properties and rooms (_tags and similar) must use tag codes defined by ONDA, not arbitrary strings.
- Lookup:
GET /gds/vendor/metareturns the available codes - Fetch meta and build the code mapping table before the first sync (content creation)
- Reference the same code system when setting
_tagson content updates - Establish a policy for periodically re-fetching meta so code additions and removals are picked up
Sending content in languages other than Korean
To include languages other than Korean, provide per-language values in the i18n field.
- Applies to the
i18nfield on properties, room types, rate plan models, and rate plans - Define the set of supported language codes (for example
ko,en,ja,zh) - Decide the per-language content mapping and the fallback language rule
- Apply the same rules for stripping characters that cannot be displayed
Rate plan model and rate plan structure
A rate plan is a room type combined with a rate plan model. Both room types and rate plan models live beneath a property.
typeThe number you may create differs by type, per property.
standalone: exactly one required per property; no more than onepackage: no limit
channels field on a rate plan modelThe optional channels field on POST .../rateplan-models restricts a model to specific channels.
- Omitted, it sells on all channels; supplied, it sells only on the channels listed in
channels - On channel opening, rate plan mappings are created only for the channels listed in
channels(and only where a room mapping exists and is open on that channel) - Editing it after opening
- Adding (
[131] → [131, 132]): a mapping is created for 132 only - Removing (
[131, 132] → [131]): existing mappings are kept; rate plans created afterwards get no mapping for 132 - Empty (
[131, 132] → []): mappings are created on every eligible channel
- Adding (
Property default extra adult charge (settings.extra_adult_price)
A property-level default extra adult charge, sent in the settings object of the property create or update request.
- Value: integer (KRW). Sending
nullclears it. - Legacy channels: included in occupancy-based rates on Agoda and Trip.com. Not included in per-room rates.
- Plus channels: used as the extra occupancy charge.
Content endpoints
All paths are prefixed with /gds/vendor.
| Object | Method | Path | Required fields and notes |
|---|---|---|---|
| Property | POST | /properties | Requires id and i18n (ko-kr); supports settings.extra_adult_price |
| Property | PATCH | /properties/{vendor_property_id} | Update; clear extra_adult_price with null |
| Property | GET | /properties · /{vendor_property_id} | Fallback lookup |
| Room type | POST | /properties/{vendor_property_id}/roomtypes | Requires id and i18n (ko-kr) |
| Room type | PATCH | .../roomtypes/{vendor_roomtype_id} | Update |
| Room type | GET | .../roomtypes · /{vendor_roomtype_id} | Fallback lookup |
| Rate plan model | POST | /properties/{vendor_property_id}/rateplan-models | Requires id and i18n (ko-kr); optional channels |
| Rate plan model | PATCH | .../rateplan-models/{vendor_rateplan_model_id} | Update |
| Rate plan model | GET | .../rateplan-models · /{vendor_rateplan_model_id} | Fallback lookup |
| Rate plan | POST | .../roomtypes/{vendor_roomtype_id}/rateplans | Requires id and vendor_rateplan_model_id |
| Rate plan | PATCH | .../rateplans/{vendor_rateplan_id} | Update |
| Rate plan | GET | .../rateplans · /{vendor_rateplan_id} | Fallback lookup |
When creating a rate plan, always verify that the required vendor_rateplan_model_id in the request body binds it to a rate plan model.
Pushing rates and business days (ARI) and availability (Avails)
Pushing is split into rates and business days on one side and availability on the other.
| Method | Path | Description |
|---|---|---|
POST | .../ari | Rates and business days (per rate plan, vendor_rateplan_id) |
POST | .../ari/avails | Availability, vacancy (consolidated per room type; at most 730 days per item) |
Both endpoints carry the shared value and the per-channel values (the channels[] array) in a single call. channels[] is a complete declaration of per-channel settings, so settings for channels absent from the array are deleted within the item's from-to range.
Rates and business days — overnight (overnight)
[
{
"vendor_roomtype_id": "VRT-001",
"vendor_rateplan_id": "VRP-001",
"type": "overnight",
"from": "2026-01-01",
"to": "2026-01-31",
"basic_price": 0,
"net_price": 0,
"sale_price": 12000,
"is_business_day": 0,
"channels": [
{ "channel_id": 1, "basic_price": 0, "net_price": 0, "sale_price": 10000, "is_business_day": 0 },
{ "channel_id": 2, "basic_price": 0, "net_price": 0, "sale_price": 11000 }
]
}
]
Rates and business days — day-use (dayuse)
[
{
"vendor_roomtype_id": "VRT-001",
"vendor_rateplan_id": "VRP-001",
"type": "dayuse",
"from": "2026-01-01",
"to": "2026-01-31",
"basic_price": 0,
"net_price": 0,
"sale_price": 12000,
"is_business_day": 0,
"use_from": "14:00",
"use_to": "20:00",
"use_time": 240,
"channels": [
{ "channel_id": 1, "sale_price": 10000, "use_from": "14:00", "use_to": "20:00", "use_time": 240 }
]
}
]
Availability — consolidated per room type
[
{
"vendor_roomtype_id": "VRT-001",
"from": "2026-01-01",
"to": "2026-01-31",
"vacancy": 5,
"channels": [
{ "channel_id": 1, "vacancy": 3 },
{ "channel_id": 2, "vacancy": 5 }
]
}
]
POST .../ari— pushes rates and business days per rate plan. Settings for channels absent fromchannelsare deleted within the item's range (omitting the field or sending an empty array deletes settings for all channels), and each channel object must carry at least one value field (channel_idalone returns400). Omitted fields keep their existing values.use_from,use_to, anduse_time(in minutes) may be sent only on day-use items.POST .../ari/avails— applies availability as a consolidated per-room-type count.channels[]is a complete declaration of per-channel availability, so availability for channels absent from the array is deleted within the range. Each from-to range spans at most 730 days.
type field (overnight or day-use)Both ari and bookings (/bookings) use type to distinguish product types.
| Channel type | type used |
|---|---|
| Plus channel | overnight |
| Direct channel | overnight (channels that support day-use also send dayuse) |
- Partial push: include only the items you want to change
- Fields per item: business day =
is_business_day; rates =basic_price,sale_price,net_price; availability =vacancy(viaari/avails) - Day-use only:
use_from,use_to, anduse_timemay be sent only for day-use - One call per push: shared values at the top level, per-channel values in the
channels[]array
Channels differ in what availability is counted against.
- Room-only (room type): Booking.com, Agoda, Trip.com
- Rate plan: Expedia, Plus channels (with some optional cases)
ONDA counts availability per room type, so send availability aligned to room-only counts, and send package availability identical to standalone availability.