Appearance
GraphQL reference
The full Developer API schema below is generated from the SDL that backs the endpoint, so it always matches what the endpoint serves.
All operations are sent as POST to the dated GraphQL endpoint with your install's runtime token as a bearer credential:
Authorization: Bearer <runtime-token>The runtime token is issued once when you run stayblox app install --team <slug>. See Getting started for the full install step.
Core API
Beyond the payment and channel mutations, the API exposes queries over the installing team's data (plus rate and booking writes), gated by scopes your app declares in app.toml:
| Scope | Unlocks |
|---|---|
read_bookings | booking, bookings |
read_contacts | contact: guest PII |
read_conversations | conversation, message |
read_properties | property, properties, unitTypes: inventory discovery |
read_rates | unitTypeRates, bookingQuote: per-day rates, restrictions, availability, and priced stay quotes |
write_rates | ratesUpdate: set nightly rates and stay restrictions |
create_bookings | bookingCreate: place an instant booking or file a booking request |
read_tasks | task, tasks, propertyTaskCalendar: operational work, checklists, custom fields |
write_tasks | taskCreate, taskUpdate, taskAssign, taskTransitionStatus, taskComplete, taskCancel, taskAddChecklistItem, taskSetChecklistItemDone, taskSetCustomField |
provide_inbox_channel | Provide a messaging channel: inject inbound guest messages via inboundMessageCreate and receive outbound delivery commands at your message_send endpoint. |
provide_channel | channelIntegrations, channelIntegrationCreate, channelIntegrationDisconnect, channelListingLink, channelListingUnlink, reservationUpsert: register OTA connections, receive ARI pushes at your ari_push endpoint, and submit reservations. See Channel apps. |
An operation without its scope fails with a GraphQL error naming the missing scope. PII is gated separately: Booking.contact requires read_contacts in addition to read_bookings, so a bookings-only app never sees guest details.
Mechanics worth knowing:
bookings,properties, andunitTypesare forward-paginated by id cursor; passfirstand feedpageInfo.endCursorback asafteruntilhasNextPageisfalse.unitTypeRatesserves forward-looking windows of at most 366 days per call; page longer ranges by date.- Discover inventory with
properties/unitTypes(each unit type carries aunitsCount), then feed aunitTypeIdintounitTypeRatesorratesUpdate. unitTypes[].kindisstandardfor an ordinary room type orentire_propertyfor a listing that books the whole property; both kinds support the same queries and mutations.
Writing rates
ratesUpdate sets the nightly rate and stay restrictions (minStay, maxStay, closedToArrival, closedToDeparture, stopSell) for one unit type across an inclusive date range of at most 366 days. It goes through the same pipeline as host edits, so connected channels sync and a rates.updated webhook digest is emitted.
Field semantics: a field you omit keeps its current value; a field you send as null clears that override back to the unit type's base value. Invalid input is returned in userErrors (with the offending field path) rather than as a GraphQL error.
Note that your own app also receives the resulting rates.updated digest; deliveries are not filtered by which actor caused the change. Guard against update loops by not reacting to digests for changes you just wrote.
Creating bookings
bookingQuote prices and validates a stay, returning itemised fees and taxes plus any blocking violations, without committing it; gated by read_rates. To transact, bookingCreate (scope create_bookings) reuses the host's own booking pipeline: on instant-book storefronts it places a held, unpaid booking and returns a paymentUrl where the guest pays; on review storefronts it files a booking request the host approves. outcome (HELD or INQUIRY) tells you which ran, and instantBook on the quote lets you label the action ahead of time. Pass a stable idempotencyKey so a retried call returns the original booking instead of a duplicate.
The generated reference below carries every type and field. These queries pair with webhooks: the event tells you what changed, these queries return its current state.
Try it
Run queries against the live endpoint right here. Paste your install's runtime token, adjust the endpoint if needed, and explore the schema with autocomplete.
GraphQL API — 2026-01
The complete schema for the 2026-01 Developer API, generated from the SDL in the app repo (graphql/developer/2026-01/). All operations are served from POST /developer/api/2026-01/graphql.
Queries
channelIntegrations
OTA integrations owned by this app, with listing links and sync status.
graphql
channelIntegrations(first: Int = 50, after: ID): ChannelIntegrationConnection!| Argument | Type | Default | Description |
|---|---|---|---|
first | Int | 50 | |
after | ID |
contact
A guest contact by id. Requires the read_contacts scope.
graphql
contact(id: ID!): Contact| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
booking
A booking by id. Requires the read_bookings scope.
graphql
booking(id: ID!): Booking| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
bookings
Bookings, oldest id first, forward-paginated by id cursor. Requires read_bookings.
graphql
bookings(status: String, checkInFrom: String, checkInTo: String, first: Int! = 50, after: ID): BookingConnection!| Argument | Type | Default | Description |
|---|---|---|---|
status | String | ||
checkInFrom | String | ||
checkInTo | String | ||
first | Int! | 50 | |
after | ID |
conversation
A conversation with its messages (latest 100, oldest first). Requires read_conversations.
graphql
conversation(id: ID!): Conversation| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
message
A single message by id. Requires read_conversations.
graphql
message(id: ID!): Message| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
unitTypeRates
Per-day rate, restrictions and available-unit count for a unit type. Window max 366 days. Requires read_rates.
graphql
unitTypeRates(unitTypeId: ID!, from: String!, to: String!): [UnitTypeRateDay!]!| Argument | Type | Default | Description |
|---|---|---|---|
unitTypeId | ID! | ||
from | String! | ||
to | String! |
property
A property by id with its unit types. Requires read_properties.
graphql
property(id: ID!): Property| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
properties
Properties, oldest id first, forward-paginated by id cursor. Requires read_properties.
graphql
properties(first: Int! = 50, after: ID): PropertyConnection!| Argument | Type | Default | Description |
|---|---|---|---|
first | Int! | 50 | |
after | ID |
unitTypes
Unit types with unit counts, oldest id first, forward-paginated by id cursor. Requires read_properties.
graphql
unitTypes(propertyId: ID, first: Int! = 50, after: ID): UnitTypeConnection!| Argument | Type | Default | Description |
|---|---|---|---|
propertyId | ID | ||
first | Int! | 50 | |
after | ID |
bookingQuote
Price and validate a stay without committing it. Returns itemized totals (mandatory fees and added taxes included) plus any stay-restriction violations that would block a booking. instantBook reflects the host's booking mode, so a caller can label the action "Book now" vs "Request to book". Requires read_rates.
graphql
bookingQuote(input: BookingQuoteInput!): BookingQuote!| Argument | Type | Default | Description |
|---|---|---|---|
input | BookingQuoteInput! |
task
A task by id. Requires read_tasks.
graphql
task(id: ID!): Task| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
tasks
Tasks, oldest id first, forward-paginated by id cursor. Filterable; pass filter.updatedSince to resync after downtime (returns everything changed at/after that instant, still id-ordered). Requires read_tasks.
graphql
tasks(filter: TaskFilterInput, first: Int! = 50, after: ID): TaskConnection!| Argument | Type | Default | Description |
|---|---|---|---|
filter | TaskFilterInput | ||
first | Int! | 50 | |
after | ID |
propertyTaskCalendar
Tasks for one property within a due-date window (inclusive, max 366 days), ordered by due time — for calendar rendering. Requires read_tasks.
graphql
propertyTaskCalendar(propertyId: ID!, from: String!, to: String!): [Task!]!| Argument | Type | Default | Description |
|---|---|---|---|
propertyId | ID! | ||
from | String! | ||
to | String! |
aiModels
Models available for aiGenerate: active, priced catalog models. Requires ai_inference.
graphql
aiModels: [AiModelInfo!]!apiVersion
The API version served by this endpoint.
graphql
apiVersion: String!currentApp
The app making the request, resolved from the bearer token. Null if unauthenticated.
graphql
currentApp: AppMutations
paymentSessionResolve
Mark a payment session as successfully paid.
graphql
paymentSessionResolve(id: ID!, providerReference: String, amount: Float): PaymentSessionMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! | ||
providerReference | String | ||
amount | Float |
paymentSessionReject
Mark a payment session as failed/declined.
graphql
paymentSessionReject(id: ID!, reason: String): PaymentSessionMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! | ||
reason | String |
paymentSessionPending
Mark a payment session as still pending an asynchronous outcome.
graphql
paymentSessionPending(id: ID!, providerReference: String): PaymentSessionMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! | ||
providerReference | String |
channelIntegrationCreate
Register (or re-activate) an OTA connection for a property this app manages.
graphql
channelIntegrationCreate(input: ChannelIntegrationCreateInput!): ChannelIntegrationResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | ChannelIntegrationCreateInput! |
channelIntegrationDisconnect
Disconnect an OTA connection. Sync stops; history is preserved.
graphql
channelIntegrationDisconnect(id: ID!): ChannelIntegrationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
channelListingLink
Link a unit type to an external room type / rate plan. Triggers an initial full ARI push.
graphql
channelListingLink(input: ChannelListingLinkInput!): ChannelListingResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | ChannelListingLinkInput! |
channelListingUnlink
Unlink a unit type from its external listing.
graphql
channelListingUnlink(id: ID!): ChannelListingResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
reservationUpsert
Create or revise a reservation that originated on the external channel. Idempotent per externalId; stale revisions are ignored.
graphql
reservationUpsert(input: ReservationInput!): ReservationResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | ReservationInput! |
ratesUpdate
Set the nightly rate and/or stay restrictions for a unit type across a date range (inclusive, max 366 days). Omitted fields keep their current value; an explicit null clears that override back to the unit type's base value. Changes sync to connected channels and emit a rates.updated webhook digest. Requires write_rates.
graphql
ratesUpdate(input: RatesUpdateInput!): RatesUpdateResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | RatesUpdateInput! |
metafieldSet
Set an app-owned metafield on a booking, property or contact. Key must be declared in the app manifest; rides on the owner's read scope.
graphql
metafieldSet(ownerType: String!, ownerId: ID!, key: String!, value: String!): MetafieldMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
ownerType | String! | ||
ownerId | ID! | ||
key | String! | ||
value | String! |
metafieldDelete
Delete an app-owned metafield.
graphql
metafieldDelete(ownerType: String!, ownerId: ID!, key: String!): MetafieldDeleteResult!| Argument | Type | Default | Description |
|---|---|---|---|
ownerType | String! | ||
ownerId | ID! | ||
key | String! |
messageSend
Send a guest-facing message in a conversation. Requires write_conversations.
graphql
messageSend(conversationId: ID!, body: String): MessageSendResult!| Argument | Type | Default | Description |
|---|---|---|---|
conversationId | ID! | ||
body | String |
bookingFlagSet
Set (or replace) this app's flag on a booking, shown to the host as a badge. Requires write_bookings.
graphql
bookingFlagSet(bookingId: ID!, level: String!, message: String): BookingFlagResult!| Argument | Type | Default | Description |
|---|---|---|---|
bookingId | ID! | ||
level | String! | ||
message | String |
bookingChargeAdd
Add a charge line to a booking through the fees engine. Rejected once an invoice is issued. Requires write_charges.
graphql
bookingChargeAdd(bookingId: ID!, label: String!, amount: String!, currency: String!): BookingChargeResult!| Argument | Type | Default | Description |
|---|---|---|---|
bookingId | ID! | ||
label | String! | ||
amount | String! | ||
currency | String! |
bookingCreate
Create a booking for a unit type and date range. On instant-book hosts this holds a PENDING, unpaid booking and returns paymentUrl (the guest pays on the host's own storefront); on review hosts it files an inquiry the host approves manually. outcome says which path ran. Pass a stable idempotencyKey so retries return the original result instead of double-booking. Requires create_bookings.
graphql
bookingCreate(input: BookingCreateInput!): BookingCreatePayload!| Argument | Type | Default | Description |
|---|---|---|---|
input | BookingCreateInput! |
taskCreate
Create a task. Requires write_tasks.
graphql
taskCreate(input: TaskCreateInput!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | TaskCreateInput! |
taskUpdate
Update a task's non-status fields. Requires write_tasks.
graphql
taskUpdate(input: TaskUpdateInput!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | TaskUpdateInput! |
taskAssign
Assign a task to an actor and write back identifiers. The provider-app write-back path of the assignment handshake. Returns userErrors[].code ALREADY_ASSIGNED when the task is already assigned by anyone other than the calling app (host, fallback, or another app) — re-assigning your own assignment is allowed. Requires write_tasks.
graphql
taskAssign(input: TaskAssignInput!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | TaskAssignInput! |
taskTransitionStatus
Transition a task to a canonical status. Invalid transitions return userErrors[].code INVALID_TRANSITION. Requires write_tasks.
graphql
taskTransitionStatus(id: ID!, status: TaskStatus!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! | ||
status | TaskStatus! |
taskComplete
Mark a task completed. Returns userErrors[].code INVALID_TRANSITION when COMPLETED isn't reachable from the task's current status. Requires write_tasks.
graphql
taskComplete(id: ID!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
taskCancel
Cancel a task. Returns userErrors[].code INVALID_TRANSITION when CANCELLED isn't reachable from the task's current status. Requires write_tasks.
graphql
taskCancel(id: ID!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
id | ID! |
taskAddChecklistItem
Append a checklist item to a task. Requires write_tasks.
graphql
taskAddChecklistItem(taskId: ID!, label: String!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
taskId | ID! | ||
label | String! |
taskSetChecklistItemDone
Mark a checklist item done or not. Requires write_tasks.
graphql
taskSetChecklistItemDone(itemId: ID!, done: Boolean!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
itemId | ID! | ||
done | Boolean! |
taskSetCustomField
Set a namespaced, typed custom field on a task (e.g. turno.project_id). value is parsed per type. Requires write_tasks.
graphql
taskSetCustomField(taskId: ID!, namespace: String!, key: String!, type: String!, value: String!): TaskMutationResult!| Argument | Type | Default | Description |
|---|---|---|---|
taskId | ID! | ||
namespace | String! | ||
key | String! | ||
type | String! | ||
value | String! |
aiGenerate
Run a text completion billed to the store's AI credits. The app composes its own context into the prompt; the response reports the exact fractional credits charged. Refusals come back as coded userErrors. Requires ai_inference.
graphql
aiGenerate(input: AiGenerateInput!): AiGeneratePayload!| Argument | Type | Default | Description |
|---|---|---|---|
input | AiGenerateInput! |
inboundMessageCreate
Inject an inbound guest message received on a channel this app provides.
graphql
inboundMessageCreate(input: InboundMessageInput!): InboundMessageResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | InboundMessageInput! |
messageStatusUpdate
Report a delivery/read status change for a message this app sent.
graphql
messageStatusUpdate(input: MessageStatusInput!): MessageStatusResult!| Argument | Type | Default | Description |
|---|---|---|---|
input | MessageStatusInput! |
Object types
PaymentSessionMutationResult
| Field | Type | Description |
|---|---|---|
paymentSession | PaymentSession | The affected session, or null when the input was invalid. |
userErrors | [UserError!]! | Per-field problems with the request; empty on success. |
PaymentSession
| Field | Type | Description |
|---|---|---|
id | ID! | |
status | String! | |
amount | String! | |
currency | String! | |
providerReference | String |
UserError
| Field | Type | Description |
|---|---|---|
field | [String!] | Path to the offending argument. |
message | String! | |
code | String | Machine-readable error code, when the mutation provides one. |
ChannelIntegration
| Field | Type | Description |
|---|---|---|
id | ID! | |
propertyId | ID! | |
externalPropertyId | String! | |
status | String! | active, disabled, error or pending. |
lastSyncedAt | String | |
lastError | String | |
listings | [ChannelListing!]! |
ChannelListing
| Field | Type | Description |
|---|---|---|
id | ID! | |
unitTypeId | ID! | |
externalRoomTypeId | String! | |
externalRatePlanId | String |
ChannelIntegrationConnection
| Field | Type | Description |
|---|---|---|
nodes | [ChannelIntegration!]! | |
pageInfo | PageInfo! |
ChannelIntegrationResult
| Field | Type | Description |
|---|---|---|
integration | ChannelIntegration | |
userErrors | [UserError!]! |
ChannelListingResult
| Field | Type | Description |
|---|---|---|
listing | ChannelListing | |
userErrors | [UserError!]! |
Reservation
| Field | Type | Description |
|---|---|---|
id | ID! | |
externalId | String! | |
status | String! | synced, unmapped or cancelled. |
bookingId | ID | The platform booking created for this reservation, once mapped. |
ReservationResult
| Field | Type | Description |
|---|---|---|
reservation | Reservation | |
userErrors | [UserError!]! |
RatesUpdateResult
| Field | Type | Description |
|---|---|---|
ok | Boolean! | |
userErrors | [UserError!]! |
MessageSendResult
| Field | Type | Description |
|---|---|---|
message | Message | |
userErrors | [UserError!]! |
Metafield
An app-owned metafield value on a record.
| Field | Type | Description |
|---|---|---|
key | String! | |
value | String | |
type | String! | |
visibility | String! |
MetafieldMutationResult
| Field | Type | Description |
|---|---|---|
metafield | Metafield | |
userErrors | [UserError!]! |
MetafieldDeleteResult
| Field | Type | Description |
|---|---|---|
deleted | Boolean! | |
userErrors | [UserError!]! |
BookingFlag
| Field | Type | Description |
|---|---|---|
level | String! | |
message | String |
BookingFlagResult
| Field | Type | Description |
|---|---|---|
flag | BookingFlag | |
userErrors | [UserError!]! |
BookingChargeLine
| Field | Type | Description |
|---|---|---|
id | ID! | |
label | String | |
amount | String! | |
currency | String! |
BookingChargeResult
| Field | Type | Description |
|---|---|---|
charge | BookingChargeLine | |
userErrors | [UserError!]! |
Property
A property, scoped to the installing team.
| Field | Type | Description |
|---|---|---|
id | ID! | |
name | String! | |
type | String! | hotel or rental. |
address | String | |
city | String | |
country | String | |
countryCode | String | ISO 3166-1 alpha-2. |
lat | Float | |
lng | Float | |
active | Boolean! | |
description | String | Listing content for channel apps. |
cancellationPolicy | String | |
checkInTime | String | HH:MM, property local convention. |
checkOutTime | String | |
imageUrl | String | |
facilities | [FacilityItem!]! | |
unitTypes | [UnitType!]! | |
metafields | [Metafield!]! | This app's own metafields on this record. |
PropertyConnection
| Field | Type | Description |
|---|---|---|
nodes | [Property!]! | |
pageInfo | PageInfo! |
UnitType
A bookable unit type; pass its id to unitTypeRates / ratesUpdate.
| Field | Type | Description |
|---|---|---|
id | ID! | |
propertyId | ID! | |
name | String | |
kind | String! | Sellable kind: standard room type, or entire_property (books the whole property). |
maxGuests | Int | |
baseRate | Float | |
unitsCount | Int! | Number of physical units of this type. |
active | Boolean! | |
description | String | Listing content for channel apps. |
occAdults | Int! | |
occChildren | Int! | |
occInfants | Int! | |
photoUrls | [String!]! | Ordered public photo URLs. |
facilities | [FacilityItem!]! | |
bedConfigurations | [BedConfigurationItem!]! |
UnitTypeConnection
| Field | Type | Description |
|---|---|---|
nodes | [UnitType!]! | |
pageInfo | PageInfo! |
Booking
A booking, scoped to the installing team. Guest PII lives on the contact field (read_contacts).
| Field | Type | Description |
|---|---|---|
id | ID! | |
status | String! | |
checkIn | String | |
checkOut | String | |
totalAmount | String | |
currency | String | |
paymentStatus | String | |
createdAt | String! | |
units | [BookingUnitLine!]! | |
contactId | ID | |
contact | Contact | Guest PII — requires the read_contacts scope in addition to read_bookings. |
metafields | [Metafield!]! | This app's own metafields on this record. |
BookingUnitLine
A distinct unit line on a booking (bookings store one row per unit per night).
| Field | Type | Description |
|---|---|---|
unitTypeId | ID! | |
unitId | ID | |
unitTypeName | String |
BookingConnection
| Field | Type | Description |
|---|---|---|
nodes | [Booking!]! | |
pageInfo | PageInfo! |
PageInfo
| Field | Type | Description |
|---|---|---|
hasNextPage | Boolean! | |
endCursor | ID | The last node's id; pass as after for the next page. |
Conversation
| Field | Type | Description |
|---|---|---|
id | ID! | |
channel | String! | |
status | String! | |
contactId | ID | |
createdAt | String! | |
messages | [Message!]! |
Message
| Field | Type | Description |
|---|---|---|
id | ID! | |
conversationId | ID! | |
direction | String! | |
body | String | |
deliveryStatus | String | Delivery lifecycle: queued, sent, delivered, read, failed, draft, discarded. 'draft' means the host's autonomy policy held this app's send for approval. |
createdAt | String! |
UnitTypeRateDay
| Field | Type | Description |
|---|---|---|
date | String! | |
rate | Float | |
available | Int! | |
minStay | Int | |
maxStay | Int | |
closedToArrival | Boolean | |
closedToDeparture | Boolean | |
stopSell | Boolean |
Contact
A guest contact, scoped to the installing team.
| Field | Type | Description |
|---|---|---|
id | ID! | |
fullName | String | |
email | String | |
phone | String | |
metafields | [Metafield!]! | This app's own metafields on this record. |
FacilityItem
| Field | Type | Description |
|---|---|---|
name | String! | |
scope | String! | property, unit or both. |
icon | String |
BedConfigurationItem
| Field | Type | Description |
|---|---|---|
bedType | String! | Canonical bed type key, e.g. double, single, sofa_bed. |
quantity | Int! | |
sleeps | Int! | Total sleeping capacity for this row. |
BookingQuote
Itemized price + validation for a stay. Amounts are decimal strings in the storefront currency.
| Field | Type | Description |
|---|---|---|
currency | String! | |
nights | Int! | |
units | Int! | |
subtotal | String! | Accommodation subtotal before fees and taxes. |
discount | String! | |
fees | [QuoteFee!]! | Mandatory fees, one line each. |
taxes | [QuoteTax!]! | Taxes; an included tax is already inside the nightly rate, not added on top. |
total | String! | Grand total the guest pays (subtotal - discount + fees + added taxes). |
perNight | [NightRate!]! | Per-night nightly rate. |
instantBook | Boolean! | True when this host instant-books; false means bookingCreate files an inquiry. |
bookingMode | String! | The host's raw booking mode, e.g. 'instant' or 'request'. |
violations | [StayViolation!]! | Stay-restriction problems that would block a booking; empty when bookable. |
QuoteFee
| Field | Type | Description |
|---|---|---|
label | String! | |
amount | String! | |
basis | String | How the fee is charged, e.g. per_stay, per_night, per_person, per_person_per_night. |
QuoteTax
| Field | Type | Description |
|---|---|---|
name | String! | |
amount | String! | |
rate | Float | Percentage rate when applicable; null for fixed taxes. |
included | Boolean! | True when already included in the nightly rate (not added on top). |
NightRate
| Field | Type | Description |
|---|---|---|
date | String! | |
rate | String! |
StayViolation
A stay-restriction violation. code mirrors the platform restriction codes.
| Field | Type | Description |
|---|---|---|
code | String! | One of: min_stay, max_stay, closed_to_arrival, closed_to_departure, stop_sell, no_availability, invalid_range. |
message | String! | |
date | String | The date the violation applies to, if any. |
BookingCreatePayload
| Field | Type | Description |
|---|---|---|
outcome | BookingOutcome | Which path ran. Null when the request failed validation (see userErrors). |
booking | BookingRef | The held booking, when outcome is HELD. |
inquiry | InquiryRef | The inquiry, when outcome is INQUIRY. |
paymentUrl | String | Where the guest pays to confirm a held booking. Present only for HELD. |
totals | BookingQuote | The itemized totals the booking/inquiry was priced at. |
userErrors | [UserError!]! |
BookingRef
A created booking, held and awaiting payment.
| Field | Type | Description |
|---|---|---|
id | ID! | |
reference | String! | Human booking number, e.g. K7MP-Q9RT. |
status | String! | |
paymentStatus | String! | |
checkIn | String! | |
checkOut | String! | |
total | String! | |
currency | String! |
InquiryRef
A filed booking request awaiting host review.
| Field | Type | Description |
|---|---|---|
id | ID! | |
status | String! | |
checkIn | String! | |
checkOut | String! | |
total | String! | |
currency | String! |
Task
A task instance, scoped to the installing team.
| Field | Type | Description |
|---|---|---|
id | ID! | |
type | String! | Registry type slug (cleaning, maintenance, ... or an app-defined key). |
canonicalStatus | TaskStatus! | Canonical lifecycle status. |
displayLabel | String | Optional app-attached label rendered on top of canonical status. |
substatus | String | |
title | String! | |
notes | String | |
priority | String! | |
propertyId | ID | |
reservationId | ID | The reservation (booking) this task belongs to, if any. |
assigneeType | String | Actor class of the assignee: user, app, or external. |
assigneeId | ID | |
assigneeName | String | |
dueAt | String | Resolved absolute due time (ISO 8601 Zulu). |
completedAt | String | |
cost | String | Cost as a decimal string, posted at the cost effective date. |
costCurrency | String | |
costEffectiveDate | String | |
createdAt | String! | |
updatedAt | String! | |
checklist | [TaskChecklistItem!]! | |
customFields | [TaskCustomField!]! | Namespaced, typed custom fields set by apps on this task. |
TaskChecklistItem
| Field | Type | Description |
|---|---|---|
id | ID! | |
label | String! | |
position | Int! | |
isDone | Boolean! | |
doneAt | String |
TaskCustomField
A namespaced, typed custom field on a task. value is stringified; parse per type.
| Field | Type | Description |
|---|---|---|
namespace | String! | |
key | String! | |
type | String! | string, integer, float, boolean, date, datetime, or json. |
value | String |
TaskConnection
| Field | Type | Description |
|---|---|---|
nodes | [Task!]! | |
pageInfo | PageInfo! |
TaskMutationResult
| Field | Type | Description |
|---|---|---|
task | Task | |
userErrors | [UserError!]! |
AiModelInfo
A catalog model apps may request in aiGenerate.
| Field | Type | Description |
|---|---|---|
key | String! | |
isDefault | Boolean! | True for the model used when aiGenerate omits model. |
AiGeneratePayload
| Field | Type | Description |
|---|---|---|
text | String | The generated text. Null when userErrors is non-empty. |
usage | AiUsage | |
userErrors | [UserError!]! |
AiUsage
| Field | Type | Description |
|---|---|---|
inputTokens | Int! | |
outputTokens | Int! | |
creditsCharged | Float! | Exact fractional credits metered for this call. |
InboundMessageResult
| Field | Type | Description |
|---|---|---|
conversationId | ID | |
messageId | ID | |
userErrors | [UserError!]! |
MessageStatusResult
| Field | Type | Description |
|---|---|---|
ok | Boolean! | |
userErrors | [UserError!]! |
App
An installed app instance, scoped to the team that installed it.
| Field | Type | Description |
|---|---|---|
id | ID! | |
name | String! | |
type | String! | |
teamSlug | String! | The slug of the team that installed this app. |
Input types
ChannelIntegrationCreateInput
| Field | Type | Description |
|---|---|---|
propertyId | ID! | |
externalPropertyId | String! | The property/account identifier on the external channel. |
settings | String | JSON-encoded provider-specific settings, e.g. {"syncFrequencyMinutes": 15}. |
ChannelListingLinkInput
| Field | Type | Description |
|---|---|---|
integrationId | ID! | |
unitTypeId | ID! | |
externalRoomTypeId | String! | |
externalRatePlanId | String |
ReservationInput
| Field | Type | Description |
|---|---|---|
integrationId | ID! | |
externalId | String! | The reservation id on the external channel. |
revisionId | String! | Monotonic revision identifier from the channel; compared lexicographically, stale revisions no-op. |
status | ReservationStatus! | |
checkIn | String! | |
checkOut | String! | |
currency | String! | |
paymentCollect | PaymentCollect! | How the guest paid: collected by the channel (ota) or by the property. |
externalPaymentId | String | |
guest | ReservationGuestInput! | |
totalAmount | Float! | |
rooms | [ReservationRoomInput!]! |
ReservationGuestInput
| Field | Type | Description |
|---|---|---|
firstName | String! | |
lastName | String! | |
email | String | |
phone | String |
ReservationRoomInput
| Field | Type | Description |
|---|---|---|
externalRoomTypeId | String! | |
externalRatePlanId | String | |
adults | Int! | |
children | Int! | |
nights | [ReservationNightInput!]! | Per-night prices set by the channel — the platform never re-prices. |
ReservationNightInput
| Field | Type | Description |
|---|---|---|
date | String! | |
price | Float! |
RatesUpdateInput
| Field | Type | Description |
|---|---|---|
unitTypeId | ID! | |
from | String! | ISO date (YYYY-MM-DD), inclusive. |
to | String! | ISO date (YYYY-MM-DD), inclusive. At most 366 days after from. |
rate | Float | Nightly rate override. Explicit null reverts to the base rate. |
minStay | Int | |
maxStay | Int | |
closedToArrival | Boolean | |
closedToDeparture | Boolean | |
stopSell | Boolean |
BookingQuoteInput
A stay to price: one unit type, a date range, and the party.
| Field | Type | Description |
|---|---|---|
unitTypeId | ID! | |
checkIn | String! | Check-in date, ISO (YYYY-MM-DD). |
checkOut | String! | Check-out date, ISO (YYYY-MM-DD). Must be after checkIn. |
adults | Int! | Adults in the party (>= 1). |
children | Int! | |
units | Int! | Number of units of this type to book (>= 1). |
BookingGuestInput
| Field | Type | Description |
|---|---|---|
firstName | String! | |
lastName | String! | |
email | String! | |
phone | String |
BookingCreateInput
| Field | Type | Description |
|---|---|---|
unitTypeId | ID! | |
checkIn | String! | |
checkOut | String! | |
adults | Int! | |
children | Int! | |
units | Int! | |
guest | BookingGuestInput! | |
message | String | Optional guest message / special requests, stored on the booking or inquiry. |
idempotencyKey | String | Optional idempotency key. Retries with the same key return the original booking. |
TaskFilterInput
| Field | Type | Description |
|---|---|---|
propertyId | ID | |
reservationId | ID | Filter to a reservation (booking). |
type | String | Registry type slug, e.g. cleaning. |
canonicalStatus | [TaskStatus!] | Limit to these canonical statuses. |
assigneeType | String | Actor class of the assignee: user, app, or external. |
assigneeId | ID | |
dueFrom | String | ISO date/datetime; due on or after. |
dueTo | String | ISO date/datetime; due on or before. |
updatedSince | String | ISO datetime; tasks updated at/after this instant — use to resync after downtime. |
TaskCreateInput
| Field | Type | Description |
|---|---|---|
type | String! | Registry type slug, e.g. cleaning. |
title | String! | |
propertyId | ID | |
reservationId | ID | |
dueAt | String | ISO date/datetime. |
priority | String | |
notes | String | |
assigneeType | String | |
assigneeId | ID | |
assigneeName | String |
TaskUpdateInput
| Field | Type | Description |
|---|---|---|
id | ID! | |
title | String | |
type | String | |
priority | String | |
notes | String | |
dueAt | String | |
propertyId | ID | |
reservationId | ID |
TaskAssignInput
| Field | Type | Description |
|---|---|---|
id | ID! | |
assigneeType | String! | Actor class of the assignee: user, app, or external. |
assigneeId | ID | |
assigneeName | String |
AiGenerateInput
| Field | Type | Description |
|---|---|---|
system | String | System instructions for the completion. |
prompt | String | The user prompt. Compose any context or history into this string. |
model | String | Catalog model key from aiModels. Omit for the platform default. |
maxOutputTokens | Int | Requested output-token ceiling. Values above the platform maximum are clamped. |
InboundMessageInput
| Field | Type | Description |
|---|---|---|
channel | String! | A channel key this app declares in its manifest. |
externalThreadId | String! | Provider thread id (e.g. PSID). Identifies the conversation. |
senderIdentifier | String! | Provider user id. Identifies the contact. |
body | String | |
bodyFormat | String | text (default) or another format the channel supports. |
attachments | [AttachmentInput!] | |
externalMessageId | String | Provider message id; used for idempotency. |
sentAt | String | ISO-8601 timestamp; defaults to now. |
contactHints | ContactHintsInput |
ContactHintsInput
| Field | Type | Description |
|---|---|---|
firstName | String | |
lastName | String | |
displayName | String | |
email | String | |
phone | String | E.164 phone, used for contact matching. |
avatarUrl | String |
AttachmentInput
| Field | Type | Description |
|---|---|---|
url | String! | |
type | String | |
name | String |
MessageStatusInput
| Field | Type | Description |
|---|---|---|
externalMessageId | String! | |
status | String! | delivered | read | failed |
Enums
ReservationStatus
| Value | Description |
|---|---|
NEW | |
MODIFIED | |
CANCELLED |
PaymentCollect
| Value | Description |
|---|---|
OTA | |
PROPERTY |
BookingOutcome
| Value | Description |
|---|---|
HELD | A held, unpaid booking was created; pay at paymentUrl to confirm. |
INQUIRY | A booking request (inquiry) was filed for the host to review. |
TaskStatus
Platform-owned canonical task lifecycle. Apps may attach a displayLabel / substatus on top, but this canonical status is what all core logic keys off.
| Value | Description |
|---|---|
OPEN | |
ASSIGNED | |
IN_PROGRESS | |
BLOCKED | |
COMPLETED | |
CANCELLED | |
VERIFIED |