OCTO (Open Connectivity for Tours
and OTAs) is an open standard for distributing activity and experience inventory.
Seyaha implements OCTO as its inbound catalog protocol — if your platform exposes an
OCTO-compatible API, Seyaha can sync it with minimal configuration.
What Seyaha reads from your OCTO endpoint
During a sync, Seyaha calls GET {base_url}/products on your endpoint and maps the
response to its internal data model:
| OCTO concept | Seyaha concept | Notes |
|---|
product | Activity | One-to-one mapping |
option (booking option) | Variation | Variations represent different packages/options for an activity |
availability | Slot | Each availability record becomes a bookable time slot |
product.internalName | Internal reference | Not displayed to end customers; used for deduplication |
product.title | activity_title | Shown to customers |
option.title | Variation title | |
option.pricing[].unitType | Guest pricing unit type | e.g. ADULT, CHILD |
internalName is used as the deduplication key across syncs. If you rename a product’s
internalName, Seyaha treats it as a new product and creates a duplicate. Always
keep internalName stable; use title for display-facing renames.
Authentication to your endpoint
Seyaha authenticates to your OCTO endpoint using the auth_type you configured:
auth_type | Header sent by Seyaha |
|---|
bearer | Authorization: Bearer <auth_key> |
api_key | Authorization: <auth_key> |
Make sure your OCTO endpoint accepts one of these formats.
Hash deduplication
Seyaha computes a hash of your full products payload on each sync. If the hash matches
the previous sync’s last_sync_hash, the sync is marked skipped: true and no
database writes occur. This keeps sync operations cheap for large catalogs that change infrequently.
{
"success": 1,
"data": { "synced": 0, "skipped": true }
}
Minimal OCTO products response
Your GET /products endpoint must return at minimum:
[
{
"id": "product_abc",
"internalName": "desert-safari-standard",
"title": "Desert Safari Adventure",
"options": [
{
"id": "option_xyz",
"internalName": "standard-option",
"title": "Standard Package",
"pricing": [
{ "unitType": "ADULT", "original": 25000 },
{ "unitType": "CHILD", "original": 15000 }
]
}
]
}
]
OCTO prices are in the smallest currency unit (e.g. halalas for SAR). Seyaha
converts to display units when showing prices to customers.
Availability
Seyaha also reads GET /availability for each product/option pair to populate time
slots. The availability response maps to Seyaha’s slot model:
| OCTO field | Seyaha slot field |
|---|
id | availability_id |
localDateTimeStart | date + time |
status | status (AVAILABLE / LIMITED / SOLD_OUT / CLOSED) |
vacancies | vacancies |
capacity | capacity |