Reference
API reference
Generated from the OpenAPI 3.1 specification. Each endpoint lists its scope, parameters, request body, responses and ready-to-run code.
STRYK Partner API Version 1.0.0
- Base URL
https://app.staystryk.com/api/partner/v1- Specification
- OpenAPI, YAML OpenAPI, JSON
The STRYK Partner API connects booking sites, apps and integrations to one hotel in STRYK. It reads the property, availability and prices and creates bookings exactly like the STRYK booking engine prices them. Every API key belongs to exactly one hotel; the hotel creates and revokes keys in STRYK under Channels → API.
Guides and quickstart: https://staystryk.com/developers
## Conventions
- Authentication: Authorization: Bearer stryk_live_…. The key is shown once when it is created. Keys carry explicit scopes; a write scope never implies the read scope. When the hotel rotates a key, the old key stays valid for 24 hours by default (or is revoked at once). - Hotel: always the hotel of the key. Never send a hotel id. - Times: instants are RFC 3339 in UTC (2026-11-04T08:15:00.000Z); offsets are accepted on input. Stay dates are YYYY-MM-DD in the hotel's time zone (GET /hotel → timezone). - Money: {"amount": "123.45", "currency": "EUR"}, a decimal string with two fraction digits. - Pagination: limit (1-200, default 50) and cursor; responses are {"data": [...], "nextCursor": "…" | null, "hasMore": bool}, ordered by updatedAt, then id. updated_since returns items with updatedAt >= value; deduplicate on id + updatedAt. - Concurrency: single resources return an ETag and the same value as version. If-None-Match answers 304; PATCH requires If-Match (428 when missing, 412 when stale). - Idempotency: POST /bookings and POST /bookings/{id}/cancel require an Idempotency-Key (stored 24 h). Retrying with the same key and body replays the first response with Idempotent-Replayed: true; another body with the same key returns 422. - Errors: RFC 9457 application/problem+json with a stable code and the requestId. - Limits: 120 requests per 60 s per key by default; STRYK can set a different tier per key on request (GET /me → rateLimit, RateLimit-* headers on every response, Retry-After on 429); request bodies up to 64 KiB, application/json only. - Prices: STRYK always calculates prices. Send expectedTotal to make sure the guest pays what you showed. - Payments: v1 accepts no payment data. Bookings start with an open balance that is settled at the hotel or through STRYK payment links. - Versioning: additive changes (new fields, endpoints, enum values, event types) happen without a new version, ignore unknown fields. Breaking changes only in /v2, announced at least six months ahead with Deprecation and Sunset headers. - Test data: there is no separate sandbox. Use a key with read scopes only, and run write tests on a test property or a far-future date range, then cancel the bookings.
27 endpoints
Account
The calling key.
GET/meDescribe the calling key
/meDescribe the calling keyReturns the key, its scopes, the hotel it belongs to and the rate limit. Works with every valid key and is the recommended connection test.
Scopes: Any valid keyoperationId getMe
Responses
200The calling key.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
keyIdstring (uuid)requiredKey id.
keyNamestringrequiredName given by the hotel.
keyPrefixstring | nullrequiredPublic prefix (first 8 characters after stryk_live_).
scopesarray<string>requiredGranted scopes.
Values:
"property:read","property:write","availability:read","availability:write","rates:read","rates:write","bookings:read","bookings:write","guests:read","guests:write","payments:read","payments:write","invoices:read"hotelHotelRefrequiredHotel the API key belongs to.
Show fields (2)
idstringrequiredHotel id.
namestring | nullrequiredDisplay name.
expiresAtstring | null (date-time)requiredExpiry, null if the key does not expire.
rateLimitRateLimitrequiredRate limit of the key.
Show fields (2)
limitintegerrequiredRequests per window for this key (default 120; a different tier is set by STRYK on request).
windowSecondsintegerrequiredWindow length in seconds.
{ "keyId": "0b9d4e8a-6f53-4c55-9a0e-3d1f0d6c2a11", "keyName": "Website booking widget", "keyPrefix": "Ab3dEf7h", "scopes": ["property:read", "availability:read", "rates:read", "bookings:read", "bookings:write"], "hotel": { "id": "hotel-alpenblick", "name": "Hotel Alpenblick" }, "expiresAt": null, "rateLimit": { "limit": 120, "windowSeconds": 60 } }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/me' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/me', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/me",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"keyId": "0b9d4e8a-6f53-4c55-9a0e-3d1f0d6c2a11",
"keyName": "Website booking widget",
"keyPrefix": "Ab3dEf7h",
"scopes": ["property:read", "availability:read", "rates:read", "bookings:read", "bookings:write"],
"hotel": {
"id": "hotel-alpenblick",
"name": "Hotel Alpenblick"
},
"expiresAt": null,
"rateLimit": {
"limit": 120,
"windowSeconds": 60
}
}Property
Hotel profile, room types, units and their housekeeping status.
GET/hotelGet the hotel profile
/hotelGet the hotel profileName, address, time zone, currency, languages, check-in/out times and contact data.
Scopes: property:readoperationId getHotel
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Hotel.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstringrequiredHotel id.
namestring | nullrequiredDisplay name.
legalNamestring | nullLegal (invoice) name when it differs from the display name.
addressAddressrequiredPostal address.
Show fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
timezonestringrequiredIANA time zone, e.g. Europe/Vienna.
currencystringrequiredHotel currency (ISO 4217).
languagesarray<string>requiredGuest languages the hotel maintains content for (ISO 639-1).
checkInFromstring | nullEarliest check-in time HH:MM (hotel-local).
checkOutUntilstring | nullLatest check-out time HH:MM (hotel-local).
contactContactrequiredPublic contact data of the hotel.
Show fields (3)
emailstring | nullE-mail.
phonestring | nullPhone.
websitestring | nullWebsite URL.
versionstringrequiredETag value without quotes.
{ "id": "hotel-alpenblick", "name": "Hotel Alpenblick", "legalName": "Alpenblick Hotelbetriebs GmbH", "address": { "street": "Dorfstraße 12", "postalCode": "6020", "city": "Innsbruck", "country": "AT" }, "timezone": "Europe/Vienna", "currency": "EUR", "languages": ["de", "en"], "checkInFrom": "15:00", "checkOutUntil": "11:00", "contact": { "email": "info@alpenblick.example", "phone": "+43 512 123456", "website": "https://alpenblick.example" }, "version": "4f1c2a9b0d3e5f6a7b8c9d0e" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/hotel' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/hotel', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/hotel",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "hotel-alpenblick",
"name": "Hotel Alpenblick",
"legalName": "Alpenblick Hotelbetriebs GmbH",
"address": {
"street": "Dorfstraße 12",
"postalCode": "6020",
"city": "Innsbruck",
"country": "AT"
},
"timezone": "Europe/Vienna",
"currency": "EUR",
"languages": ["de", "en"],
"checkInFrom": "15:00",
"checkOutUntil": "11:00",
"contact": {
"email": "info@alpenblick.example",
"phone": "+43 512 123456",
"website": "https://alpenblick.example"
},
"version": "4f1c2a9b0d3e5f6a7b8c9d0e"
}GET/room-typesList room types
/room-typesList room typesAll room categories including inactive ones (active=false). Ordered by id; room types have no change timestamp in v1, so updated_since is not supported, compare version.
Scopes: property:readoperationId listRoomTypes
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
Responses
200Room types.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<RoomType>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (15)
idstring (uuid)requiredRoom type id.
namestringrequiredName.
codestring | nullShort code.
descriptionobjectrequiredDescription by language code (ISO 639-1);
undwhen the language is unknown.maxOccupancyintegerrequiredMaximum guests including extra beds.
maxAdultsintegerrequiredMaximum adults in any allowed occupancy.
maxChildrenintegerrequiredMaximum children in any allowed occupancy.
standardOccupancyintegerrequiredOccupancy the base price refers to.
bedConfigurationarray<string>requiredBeds, e.g. double_bed, twin_beds, sofa_bed.
sizeSqminteger | nullSize in square metres.
amenitiesarray<Amenity>requiredShow fields (2)
codestring | nullrequiredStable amenity key.
namestring | nullrequiredLabel in the hotel language.
imagesarray<Image>requiredEmpty when the hotel has no booking-engine address.
Show fields (3)
urlstring (uri)requiredPublic HTTPS URL.
altstring | nullAlternative text.
positionintegerrequiredSort position, 0 first.
unitCountintegerrequiredActive units of this type.
activebooleanrequiredSellable category.
versionstringrequiredETag value without quotes.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "name": "Doppelzimmer Bergblick", "code": "DBL", "description": { "de": "Helles Doppelzimmer mit Balkon.", "en": "Bright double room with balcony." }, "maxOccupancy": 3, "maxAdults": 2, "maxChildren": 1, "standardOccupancy": 2, "bedConfiguration": ["double_bed", "sofa_bed"], "sizeSqm": 28, "amenities": [ { "code": "balcony", "name": "Balkon" }, { "code": "wifi", "name": "WLAN" } ], "images": [ { "url": "https://app.staystryk.com/api/public/booking/alpenblick/room-photos/0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f", "alt": "Doppelzimmer Bergblick", "position": 0 } ], "unitCount": 12, "active": true, "version": "a1b2c3d4e5f6a7b8c9d0e1f2" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/room-types' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/room-types', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/room-types",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"name": "Doppelzimmer Bergblick",
"code": "DBL",
"description": {
"de": "Helles Doppelzimmer mit Balkon.",
"en": "Bright double room with balcony."
},
"maxOccupancy": 3,
"maxAdults": 2,
"maxChildren": 1,
"standardOccupancy": 2,
"bedConfiguration": ["double_bed", "sofa_bed"],
"sizeSqm": 28,
"amenities": [
{
"code": "balcony",
"name": "Balkon"
},
{
"code": "wifi",
"name": "WLAN"
}
],
"images": [
{
"url": "https://app.staystryk.com/api/public/booking/alpenblick/room-photos/0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"alt": "Doppelzimmer Bergblick",
"position": 0
}
],
"unitCount": 12,
"active": true,
"version": "a1b2c3d4e5f6a7b8c9d0e1f2"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}GET/room-types/{roomTypeId}Get a room type
/room-types/{roomTypeId}Get a room typeOne room type with occupancy, beds, amenities and images.
Scopes: property:readoperationId getRoomType
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
roomTypeIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Room type.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstring (uuid)requiredRoom type id.
namestringrequiredName.
codestring | nullShort code.
descriptionobjectrequiredDescription by language code (ISO 639-1);
undwhen the language is unknown.maxOccupancyintegerrequiredMaximum guests including extra beds.
maxAdultsintegerrequiredMaximum adults in any allowed occupancy.
maxChildrenintegerrequiredMaximum children in any allowed occupancy.
standardOccupancyintegerrequiredOccupancy the base price refers to.
bedConfigurationarray<string>requiredBeds, e.g. double_bed, twin_beds, sofa_bed.
sizeSqminteger | nullSize in square metres.
amenitiesarray<Amenity>requiredShow fields (2)
codestring | nullrequiredStable amenity key.
namestring | nullrequiredLabel in the hotel language.
imagesarray<Image>requiredEmpty when the hotel has no booking-engine address.
Show fields (3)
urlstring (uri)requiredPublic HTTPS URL.
altstring | nullAlternative text.
positionintegerrequiredSort position, 0 first.
unitCountintegerrequiredActive units of this type.
activebooleanrequiredSellable category.
versionstringrequiredETag value without quotes.
{ "id": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "name": "Doppelzimmer Bergblick", "code": "DBL", "description": { "de": "Helles Doppelzimmer mit Balkon.", "en": "Bright double room with balcony." }, "maxOccupancy": 3, "maxAdults": 2, "maxChildren": 1, "standardOccupancy": 2, "bedConfiguration": ["double_bed", "sofa_bed"], "sizeSqm": 28, "amenities": [ { "code": "balcony", "name": "Balkon" }, { "code": "wifi", "name": "WLAN" } ], "images": [ { "url": "https://app.staystryk.com/api/public/booking/alpenblick/room-photos/0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f", "alt": "Doppelzimmer Bergblick", "position": 0 } ], "unitCount": 12, "active": true, "version": "a1b2c3d4e5f6a7b8c9d0e1f2" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/room-types/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/room-types/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/room-types/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"name": "Doppelzimmer Bergblick",
"code": "DBL",
"description": {
"de": "Helles Doppelzimmer mit Balkon.",
"en": "Bright double room with balcony."
},
"maxOccupancy": 3,
"maxAdults": 2,
"maxChildren": 1,
"standardOccupancy": 2,
"bedConfiguration": ["double_bed", "sofa_bed"],
"sizeSqm": 28,
"amenities": [
{
"code": "balcony",
"name": "Balkon"
},
{
"code": "wifi",
"name": "WLAN"
}
],
"images": [
{
"url": "https://app.staystryk.com/api/public/booking/alpenblick/room-photos/0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"alt": "Doppelzimmer Bergblick",
"position": 0
}
],
"unitCount": 12,
"active": true,
"version": "a1b2c3d4e5f6a7b8c9d0e1f2"
}GET/unitsList units
/unitsList unitsRooms and apartments (no housekeeping internals), ordered by updatedAt, id.
Scopes: property:readoperationId listUnits
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
updated_since | query | string (date-time) | RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt. |
roomTypeId | query | string (uuid) | Only this room type. |
Responses
200Units.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<Unit>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (8)
idstring (uuid)requiredUnit id.
numberstringrequiredRoom number.
roomTypeIdstring (uuid)requiredRoom type.
floorinteger | nullFloor.
activebooleanrequiredIn operation.
housekeepingStatusstring | nullHousekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.
updatedAtstring (date-time)requiredLast change of the room master data.
versionstringrequiredETag value without quotes; changes with master data and housekeeping status.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "number": "204", "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "floor": 2, "active": true, "updatedAt": "2026-10-28T09:12:44.512Z", "version": "0e1f2a3b4c5d6e7f8a9b0c1d" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/units?updated_since=2026-11-01T00%3A00%3A00Z' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/units?updated_since=2026-11-01T00%3A00%3A00Z', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/units",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"updated_since": "2026-11-01T00:00:00Z"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"number": "204",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"floor": 2,
"active": true,
"updatedAt": "2026-10-28T09:12:44.512Z",
"version": "0e1f2a3b4c5d6e7f8a9b0c1d"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}GET/units/{unitId}Get a unit
/units/{unitId}Get a unitOne room or apartment.
Scopes: property:readoperationId getUnit
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
unitIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Unit.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstring (uuid)requiredUnit id.
numberstringrequiredRoom number.
roomTypeIdstring (uuid)requiredRoom type.
floorinteger | nullFloor.
activebooleanrequiredIn operation.
housekeepingStatusstring | nullHousekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.
updatedAtstring (date-time)requiredLast change of the room master data.
versionstringrequiredETag value without quotes; changes with master data and housekeeping status.
{ "id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "number": "204", "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "floor": 2, "active": true, "updatedAt": "2026-10-28T09:12:44.512Z", "version": "0e1f2a3b4c5d6e7f8a9b0c1d" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"number": "204",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"floor": 2,
"active": true,
"updatedAt": "2026-10-28T09:12:44.512Z",
"version": "0e1f2a3b4c5d6e7f8a9b0c1d"
}PATCH/units/{unitId}Set the housekeeping status of a unit
/units/{unitId}Set the housekeeping status of a unitSets the housekeeping status through the hotel's housekeeping workflow (occupancy rules, blocked or inactive units → 409/422, status log, cleaning cycle). Requires If-Match. Room master data cannot be changed.
Scopes: property:writeoperationId updateUnit
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
unitIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-Matchrequired | header | string | ETag of the version you read. Missing → 428, stale → 412. |
Idempotency-Key | header | string | Optional idempotency key, same rules as for POST. |
Request body
New housekeeping status.
housekeepingStatusstringrequiredBuilt-in housekeeping status.
Values:
"vacant_dirty","vacant_clean","vacant_inspected","occupied_service_required","occupied_serviced","do_not_disturb","deep_clean","linen_change","minibar_check","turndown_service"
Responses
200Updated unit.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredUnit id.
numberstringrequiredRoom number.
roomTypeIdstring (uuid)requiredRoom type.
floorinteger | nullFloor.
activebooleanrequiredIn operation.
housekeepingStatusstring | nullHousekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.
updatedAtstring (date-time)requiredLast change of the room master data.
versionstringrequiredETag value without quotes; changes with master data and housekeeping status.
{ "id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "number": "204", "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "floor": 2, "active": true, "housekeepingStatus": "vacant_clean", "updatedAt": "2026-10-28T09:12:44.512Z", "version": "5d6e7f8a9b0c1d2e3f4a5b6c" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }412If-Match does not match the current version.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_failed", "title": "Precondition failed", "status": 412, "detail": "The resource changed since you read it. Fetch it again and retry with the new ETag.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }428If-Match header missing.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_required", "title": "Precondition required", "status": 428, "detail": "Send the current ETag in the If-Match header.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_required", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X PATCH 'https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'If-Match: "7c1e2d3f4a5b6c7d8e9f0a1b"' \
-H 'Content-Type: application/json' \
--data '{
"housekeepingStatus": "vacant_clean"
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'If-Match': '"7c1e2d3f4a5b6c7d8e9f0a1b"',
'Content-Type': 'application/json',
},
body: JSON.stringify({
housekeepingStatus: 'vacant_clean',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.patch(
"https://app.staystryk.com/api/partner/v1/units/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"If-Match": "\"7c1e2d3f4a5b6c7d8e9f0a1b\"",
},
json={
"housekeepingStatus": "vacant_clean",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"number": "204",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"floor": 2,
"active": true,
"housekeepingStatus": "vacant_clean",
"updatedAt": "2026-10-28T09:12:44.512Z",
"version": "5d6e7f8a9b0c1d2e3f4a5b6c"
}Availability & Rates
Sellable availability, stay restrictions, daily rates and rate plans; restrictions and daily prices can be written.
GET/availabilityGet availability
/availabilityGet availabilitySellable units and stay restrictions per active room type and night, from the same availability source the STRYK booking engine and channel distribution use. Maximum range 366 days.
Scopes: availability:readoperationId getAvailability
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
fromrequired | query | string (date) | First date (YYYY-MM-DD, hotel-local). |
torequired | query | string (date) | Last date, inclusive; the range covers at most 366 days. |
roomTypeId | query | string (uuid) | Only this room type. |
Responses
200Availability.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
fromstring (date)requiredtostring (date)requireddataarray<AvailabilityDay>requiredShow fields (7)
roomTypeIdstring (uuid)requireddatestring (date)requiredNight (hotel-local).
availableintegerrequiredUnits still sellable for this night.
closedbooleanrequiredClosed for sale.
minStayintegerrequiredMinimum nights for arrivals on this date.
closedToArrivalbooleanrequiredNo arrival on this date.
closedToDeparturebooleanrequiredNo departure on this date.
{ "from": "2026-12-01", "to": "2026-12-02", "data": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "date": "2026-12-01", "available": 4, "closed": false, "minStay": 2, "closedToArrival": false, "closedToDeparture": false }, { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "date": "2026-12-02", "available": 3, "closed": false, "minStay": 2, "closedToArrival": false, "closedToDeparture": true } ] }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/availability?from=2026-12-01&to=2026-12-31' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/availability?from=2026-12-01&to=2026-12-31', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/availability",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"from": "2026-12-01", "to": "2026-12-31"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"from": "2026-12-01",
"to": "2026-12-02",
"data": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"date": "2026-12-01",
"available": 4,
"closed": false,
"minStay": 2,
"closedToArrival": false,
"closedToDeparture": false
},
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"date": "2026-12-02",
"available": 3,
"closed": false,
"minStay": 2,
"closedToArrival": false,
"closedToDeparture": true
}
]
}GET/ratesGet daily rates
/ratesGet daily ratesOne-night accommodation prices per room type and API rate plan at the room type's standard occupancy (sales channel api, the calculation channel distribution uses). For the exact price of a stay (length-of-stay rules, children, tourist tax, mandatory fees) use POST /quotes.
Scopes: rates:readoperationId getRates
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
fromrequired | query | string (date) | First date (YYYY-MM-DD, hotel-local). |
torequired | query | string (date) | Last date, inclusive; the range covers at most 366 days. |
roomTypeId | query | string (uuid) | Only this room type. |
ratePlanId | query | string (uuid) | Only this rate plan. |
Responses
200Rates.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
fromstring (date)requiredtostring (date)requireddataarray<RateDay>requiredShow fields (5)
roomTypeIdstring (uuid)requiredratePlanIdstring | null (uuid)requiredNull when no rate plan is sold through the API (base price).
datestring (date)requiredpriceobjectrequiredAccommodation price of one night.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
occupancyintegerrequiredGuests the price refers to.
{ "from": "2026-12-01", "to": "2026-12-02", "data": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "date": "2026-12-01", "price": { "amount": "140.00", "currency": "EUR" }, "occupancy": 2 }, { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "date": "2026-12-02", "price": { "amount": "150.00", "currency": "EUR" }, "occupancy": 2 } ] }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/rates?from=2026-12-01&to=2026-12-31' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/rates?from=2026-12-01&to=2026-12-31', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/rates",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"from": "2026-12-01", "to": "2026-12-31"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"from": "2026-12-01",
"to": "2026-12-02",
"data": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"date": "2026-12-01",
"price": {
"amount": "140.00",
"currency": "EUR"
},
"occupancy": 2
},
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"date": "2026-12-02",
"price": {
"amount": "150.00",
"currency": "EUR"
},
"occupancy": 2
}
]
}GET/rate-plansList rate plans
/rate-plansList rate plansRate plans sold through the API sales channel, including inactive ones.
Scopes: rates:readoperationId listRatePlans
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
updated_since | query | string (date-time) | RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt. |
Responses
200Rate plans.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<RatePlan>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (9)
idstring (uuid)requiredRate plan id.
namestringrequiredName.
codestring | nullShort code.
descriptionstring | nullDescription.
roomTypeIdsarray<string (uuid)>requiredRoom types the plan applies to; empty means all.
mealPlanstring | nullMeal plan.
Values:
"breakfast","room_only",nullcancellationPolicyCancellationPolicy | nullShow fields (3)
summarystring | nullGuest-facing summary in the hotel language.
refundableboolean | nullFree cancellation is possible at some point.
freeCancellationHoursBeforeinteger | nullFree cancellation until this many hours before arrival.
activebooleanrequiredCurrently sellable.
updatedAtstring (date-time)requiredLast change.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "name": "Flexibel mit Frühstück", "code": "FLEX-BB", "description": "Flexible rate including breakfast.", "roomTypeIds": ["3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "7a1d9c3e-2b4f-4e6a-8c0d-1e2f3a4b5c6d"], "mealPlan": "breakfast", "cancellationPolicy": { "summary": "Free cancellation until 7 days before arrival, then 80 %.", "refundable": true, "freeCancellationHoursBefore": 168 }, "active": true, "updatedAt": "2026-10-30T14:02:10.000Z" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/rate-plans?updated_since=2026-11-01T00%3A00%3A00Z' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/rate-plans?updated_since=2026-11-01T00%3A00%3A00Z', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/rate-plans",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"updated_since": "2026-11-01T00:00:00Z"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"name": "Flexibel mit Frühstück",
"code": "FLEX-BB",
"description": "Flexible rate including breakfast.",
"roomTypeIds": ["3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "7a1d9c3e-2b4f-4e6a-8c0d-1e2f3a4b5c6d"],
"mealPlan": "breakfast",
"cancellationPolicy": {
"summary": "Free cancellation until 7 days before arrival, then 80 %.",
"refundable": true,
"freeCancellationHoursBefore": 168
},
"active": true,
"updatedAt": "2026-10-30T14:02:10.000Z"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}Quotes
Exact price of a stay before booking.
POST/quotesPrice a stay
/quotesPrice a stayCalculates the price exactly as POST /bookings would (room assignment preview, stay restrictions, rate plan, children, discount code, tourist tax, mandatory fees). Read only: nothing is stored and no inventory is held. A stay that cannot be sold returns 200 with available: false and reasons.
Scopes: rates:readoperationId createQuote
Request body
Stay to price.
checkInstring (date)requiredArrival (hotel-local), not before today.
checkOutstring (date)requiredDeparture, after checkIn (max. 365 nights).
roomTypeIdstring (uuid)requiredratePlanIdstring | null (uuid)Optional rate plan sold through the API.
adultsintegerrequiredAdults (>= 1).
childrenAgesarray<integer>Age of each child (0-17).
discountCodestring | nullHotel discount code.
Responses
200Quote.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
availablebooleanrequiredFalse: see reasons; prices are null.
reasonsarray<QuoteReason>requiredShow fields (2)
codestringrequiredReason code.
Values:
"sold_out","min_stay_not_met","closed_to_arrival","closed_to_departure","rate_plan_not_applicable","not_bookable"messagestringrequiredEnglish explanation.
roomTypeIdstring (uuid)requiredratePlanIdstring | null (uuid)requiredcheckInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredtotalMoney | nullrequiredAmount the booking will cost: accommodation plus taxes and fees not included.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
accommodationMoney | nullrequiredAccommodation price after discounts.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
taxesAndFeesarray<TaxOrFee>requiredShow fields (3)
namestringrequiredLabel in the hotel language.
amountMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
includedbooleanrequiredTrue: already contained in accommodation; false: added on top in total.
nightlyarray<NightlyPrice>requiredShow fields (2)
datestring (date)requiredpriceMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
cancellationPolicyCancellationPolicy | nullrequiredShow fields (3)
summarystring | nullGuest-facing summary in the hotel language.
refundableboolean | nullFree cancellation is possible at some point.
freeCancellationHoursBeforeinteger | nullFree cancellation until this many hours before arrival.
{ "available": true, "reasons": [], "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "total": { "amount": "447.60", "currency": "EUR" }, "accommodation": { "amount": "420.00", "currency": "EUR" }, "taxesAndFees": [ { "name": "Ortstaxe", "amount": { "amount": "7.60", "currency": "EUR" }, "included": false }, { "name": "Endreinigung", "amount": { "amount": "20.00", "currency": "EUR" }, "included": false } ], "nightly": [ { "date": "2026-12-01", "price": { "amount": "140.00", "currency": "EUR" } }, { "date": "2026-12-02", "price": { "amount": "140.00", "currency": "EUR" } }, { "date": "2026-12-03", "price": { "amount": "140.00", "currency": "EUR" } } ], "cancellationPolicy": { "summary": "Free cancellation until 7 days before arrival, then 80 %.", "refundable": true, "freeCancellationHoursBefore": 168 } }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X POST 'https://app.staystryk.com/api/partner/v1/quotes' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"childrenAges": [6]
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/quotes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
checkIn: '2026-12-01',
checkOut: '2026-12-04',
roomTypeId: '3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f',
ratePlanId: '9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a',
adults: 2,
childrenAges: [6],
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.post(
"https://app.staystryk.com/api/partner/v1/quotes",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
json={
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"childrenAges": [6],
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"available": true,
"reasons": [],
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"total": {
"amount": "447.60",
"currency": "EUR"
},
"accommodation": {
"amount": "420.00",
"currency": "EUR"
},
"taxesAndFees": [
{
"name": "Ortstaxe",
"amount": {
"amount": "7.60",
"currency": "EUR"
},
"included": false
},
{
"name": "Endreinigung",
"amount": {
"amount": "20.00",
"currency": "EUR"
},
"included": false
}
],
"nightly": [
{
"date": "2026-12-01",
"price": {
"amount": "140.00",
"currency": "EUR"
}
},
{
"date": "2026-12-02",
"price": {
"amount": "140.00",
"currency": "EUR"
}
},
{
"date": "2026-12-03",
"price": {
"amount": "140.00",
"currency": "EUR"
}
}
],
"cancellationPolicy": {
"summary": "Free cancellation until 7 days before arrival, then 80 %.",
"refundable": true,
"freeCancellationHoursBefore": 168
}
}Bookings
Read, create, update and cancel bookings.
GET/bookingsList bookings
/bookingsList bookingsAll bookings of the hotel (every sales channel), ordered by updatedAt, id. Use updated_since for incremental sync.
Scopes: bookings:readoperationId listBookings
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
updated_since | query | string (date-time) | RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt. |
status | query | string | - |
arrivalFrom | query | string (date) | checkIn >= date. |
arrivalTo | query | string (date) | checkIn <= date. |
externalReference | query | string | Exact external reference. |
Responses
200Bookings.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<Booking>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (21)
idstring (uuid)requiredreferencestringrequiredBooking number shown to the hotel and the guest.
statusstringrequiredBooking status.
Values:
"pending","tentative","confirmed","checked_in","checked_out","cancelled","no_show"channelstringrequiredSales path.
Values:
"direct","manual","channels","api"externalReferencestring | nullrequiredPartner reference (unique per hotel).
checkInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredadultsintegerrequiredchildrenintegerrequiredchildrenAgesarray<integer>requiredroomsarray<BookingRoom>requiredShow fields (5)
roomTypeIdstring (uuid)requiredunitIdstring | null (uuid)requiredAssigned unit.
ratePlanIdstring | null (uuid)requiredadultsintegerrequiredchildrenintegerrequired
guestBookingGuestrequiredPrimary guest snapshot of the booking.
Show fields (5)
idstring | null (uuid)requiredGuest profile, if linked.
firstNamestring | nullrequiredlastNamestring | nullrequiredemailstring | nullrequiredphonestring | nullrequired
totalobjectrequiredBooking total calculated by STRYK.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidobjectrequiredSettled amount (all payment paths).
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingobjectrequiredtotal minus paid, never negative.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
notesstring | nullrequiredcancellationBookingCancellation | nullrequiredShow fields (2)
cancelledAtstring | null (date-time)requiredfeeMoney | nullrequiredCancellation fee according to the hotel's policy.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "reference": "B-2026-01842", "status": "confirmed", "channel": "api", "externalReference": "WEB-1234", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "adults": 2, "children": 1, "childrenAges": [6], "rooms": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "adults": 2, "children": 1 } ], "guest": { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "email": "anna.muster@example.com", "phone": "+43 660 1234567" }, "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "0.00", "currency": "EUR" }, "outstanding": { "amount": "447.60", "currency": "EUR" }, "notes": "Late arrival around 22:00.", "cancellation": null, "createdAt": "2026-11-04T08:15:00.000Z", "updatedAt": "2026-11-04T08:15:00.000Z", "version": "7c1e2d3f4a5b6c7d8e9f0a1b" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/bookings?updated_since=2026-11-01T00%3A00%3A00Z' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings?updated_since=2026-11-01T00%3A00%3A00Z', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/bookings",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"updated_since": "2026-11-01T00:00:00Z"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"reference": "B-2026-01842",
"status": "confirmed",
"channel": "api",
"externalReference": "WEB-1234",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"adults": 2,
"children": 1,
"childrenAges": [6],
"rooms": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"children": 1
}
],
"guest": {
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567"
},
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "0.00",
"currency": "EUR"
},
"outstanding": {
"amount": "447.60",
"currency": "EUR"
},
"notes": "Late arrival around 22:00.",
"cancellation": null,
"createdAt": "2026-11-04T08:15:00.000Z",
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "7c1e2d3f4a5b6c7d8e9f0a1b"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}POST/bookingsCreate a booking
/bookingsCreate a bookingCreates a booking with sales channel api. STRYK calculates the price (never the client) and assigns a unit atomically. Send expectedTotal with the price you showed the guest: a different server price returns 409 conflict with currentTotal. No payment is taken; the booking starts with an open balance. By default STRYK sends no booking confirmation e-mail for API bookings (automations the hotel configured for new bookings still run). Set notifyGuest: true to have STRYK send its standard booking confirmation to guest.email, the same message the STRYK booking engine sends, in the hotel's default language. An idempotent replay never sends it a second time.
Scopes: bookings:writeoperationId createBooking
Headers
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Keyrequired | header | string | Unique key per logical write (1-160 characters A-Z a-z 0-9 . _ : -), stored 24 h. Retrying with the same key and body replays the first response. |
Request body
New booking.
roomTypeIdstring (uuid)requiredratePlanIdstring | null (uuid)checkInstring (date)requiredcheckOutstring (date)requiredadultsintegerrequiredchildrenAgesarray<integer>guestGuestInputrequiredGuest of a new booking.
Show fields (6)
firstNamestringrequiredlastNamestringrequiredemailstring (email)requiredGuest e-mail.
phonestring | nullcountrystring | nullResidence country (ISO 3166-1 alpha-2).
addressAddress | nullShow fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
notesstring | nullexternalReferencestring | nullYour reference, unique per hotel.
statusstring | nullInitial status (default confirmed).
Values:
"confirmed","tentative",nullexpectedTotalMoney | nullPrice you showed the guest; a mismatch returns 409 conflict with currentTotal.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
discountCodestring | nullnotifyGuestboolean | nullSend STRYK's standard booking confirmation to
guest.email(default false). Uses the hotel's booking-confirmation template and default language; tentative bookings receive the "booking received" message instead. Sent once per booking, never again on an idempotent replay.
Responses
201Booking created.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
Location- URL of the created resource.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredreferencestringrequiredBooking number shown to the hotel and the guest.
statusstringrequiredBooking status.
Values:
"pending","tentative","confirmed","checked_in","checked_out","cancelled","no_show"channelstringrequiredSales path.
Values:
"direct","manual","channels","api"externalReferencestring | nullrequiredPartner reference (unique per hotel).
checkInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredadultsintegerrequiredchildrenintegerrequiredchildrenAgesarray<integer>requiredroomsarray<BookingRoom>requiredShow fields (5)
roomTypeIdstring (uuid)requiredunitIdstring | null (uuid)requiredAssigned unit.
ratePlanIdstring | null (uuid)requiredadultsintegerrequiredchildrenintegerrequired
guestBookingGuestrequiredPrimary guest snapshot of the booking.
Show fields (5)
idstring | null (uuid)requiredGuest profile, if linked.
firstNamestring | nullrequiredlastNamestring | nullrequiredemailstring | nullrequiredphonestring | nullrequired
totalobjectrequiredBooking total calculated by STRYK.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidobjectrequiredSettled amount (all payment paths).
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingobjectrequiredtotal minus paid, never negative.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
notesstring | nullrequiredcancellationBookingCancellation | nullrequiredShow fields (2)
cancelledAtstring | null (date-time)requiredfeeMoney | nullrequiredCancellation fee according to the hotel's policy.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "reference": "B-2026-01842", "status": "confirmed", "channel": "api", "externalReference": "WEB-1234", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "adults": 2, "children": 1, "childrenAges": [6], "rooms": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "adults": 2, "children": 1 } ], "guest": { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "email": "anna.muster@example.com", "phone": "+43 660 1234567" }, "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "0.00", "currency": "EUR" }, "outstanding": { "amount": "447.60", "currency": "EUR" }, "notes": "Late arrival around 22:00.", "cancellation": null, "createdAt": "2026-11-04T08:15:00.000Z", "updatedAt": "2026-11-04T08:15:00.000Z", "version": "7c1e2d3f4a5b6c7d8e9f0a1b" }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X POST 'https://app.staystryk.com/api/partner/v1/bookings' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Idempotency-Key: web-order-1234-create' \
-H 'Content-Type: application/json' \
--data '{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"adults": 2,
"childrenAges": [6],
"guest": {
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567",
"country": "AT",
"address": {
"street": "Hauptplatz 1",
"postalCode": "8010",
"city": "Graz",
"country": "AT"
}
},
"notes": "Late arrival around 22:00.",
"externalReference": "WEB-1234",
"status": "confirmed",
"expectedTotal": {
"amount": "447.60",
"currency": "EUR"
},
"notifyGuest": true
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Idempotency-Key': 'web-order-1234-create',
'Content-Type': 'application/json',
},
body: JSON.stringify({
roomTypeId: '3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f',
ratePlanId: '9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a',
checkIn: '2026-12-01',
checkOut: '2026-12-04',
adults: 2,
childrenAges: [6],
guest: {
firstName: 'Anna',
lastName: 'Muster',
email: 'anna.muster@example.com',
phone: '+43 660 1234567',
country: 'AT',
address: {
street: 'Hauptplatz 1',
postalCode: '8010',
city: 'Graz',
country: 'AT',
},
},
notes: 'Late arrival around 22:00.',
externalReference: 'WEB-1234',
status: 'confirmed',
expectedTotal: {
amount: '447.60',
currency: 'EUR',
},
notifyGuest: true,
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.post(
"https://app.staystryk.com/api/partner/v1/bookings",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"Idempotency-Key": "web-order-1234-create",
},
json={
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"adults": 2,
"childrenAges": [6],
"guest": {
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567",
"country": "AT",
"address": {
"street": "Hauptplatz 1",
"postalCode": "8010",
"city": "Graz",
"country": "AT",
},
},
"notes": "Late arrival around 22:00.",
"externalReference": "WEB-1234",
"status": "confirmed",
"expectedTotal": {
"amount": "447.60",
"currency": "EUR",
},
"notifyGuest": True,
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"reference": "B-2026-01842",
"status": "confirmed",
"channel": "api",
"externalReference": "WEB-1234",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"adults": 2,
"children": 1,
"childrenAges": [6],
"rooms": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"children": 1
}
],
"guest": {
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567"
},
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "0.00",
"currency": "EUR"
},
"outstanding": {
"amount": "447.60",
"currency": "EUR"
},
"notes": "Late arrival around 22:00.",
"cancellation": null,
"createdAt": "2026-11-04T08:15:00.000Z",
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "7c1e2d3f4a5b6c7d8e9f0a1b"
}GET/bookings/{bookingId}Get a booking
/bookings/{bookingId}Get a bookingOne booking with ETag.
Scopes: bookings:readoperationId getBooking
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
bookingIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Booking.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstring (uuid)requiredreferencestringrequiredBooking number shown to the hotel and the guest.
statusstringrequiredBooking status.
Values:
"pending","tentative","confirmed","checked_in","checked_out","cancelled","no_show"channelstringrequiredSales path.
Values:
"direct","manual","channels","api"externalReferencestring | nullrequiredPartner reference (unique per hotel).
checkInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredadultsintegerrequiredchildrenintegerrequiredchildrenAgesarray<integer>requiredroomsarray<BookingRoom>requiredShow fields (5)
roomTypeIdstring (uuid)requiredunitIdstring | null (uuid)requiredAssigned unit.
ratePlanIdstring | null (uuid)requiredadultsintegerrequiredchildrenintegerrequired
guestBookingGuestrequiredPrimary guest snapshot of the booking.
Show fields (5)
idstring | null (uuid)requiredGuest profile, if linked.
firstNamestring | nullrequiredlastNamestring | nullrequiredemailstring | nullrequiredphonestring | nullrequired
totalobjectrequiredBooking total calculated by STRYK.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidobjectrequiredSettled amount (all payment paths).
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingobjectrequiredtotal minus paid, never negative.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
notesstring | nullrequiredcancellationBookingCancellation | nullrequiredShow fields (2)
cancelledAtstring | null (date-time)requiredfeeMoney | nullrequiredCancellation fee according to the hotel's policy.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "reference": "B-2026-01842", "status": "confirmed", "channel": "api", "externalReference": "WEB-1234", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "adults": 2, "children": 1, "childrenAges": [6], "rooms": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "adults": 2, "children": 1 } ], "guest": { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "email": "anna.muster@example.com", "phone": "+43 660 1234567" }, "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "0.00", "currency": "EUR" }, "outstanding": { "amount": "447.60", "currency": "EUR" }, "notes": "Late arrival around 22:00.", "cancellation": null, "createdAt": "2026-11-04T08:15:00.000Z", "updatedAt": "2026-11-04T08:15:00.000Z", "version": "7c1e2d3f4a5b6c7d8e9f0a1b" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"reference": "B-2026-01842",
"status": "confirmed",
"channel": "api",
"externalReference": "WEB-1234",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"adults": 2,
"children": 1,
"childrenAges": [6],
"rooms": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"children": 1
}
],
"guest": {
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567"
},
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "0.00",
"currency": "EUR"
},
"outstanding": {
"amount": "447.60",
"currency": "EUR"
},
"notes": "Late arrival around 22:00.",
"cancellation": null,
"createdAt": "2026-11-04T08:15:00.000Z",
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "7c1e2d3f4a5b6c7d8e9f0a1b"
}PATCH/bookings/{bookingId}Update a booking
/bookings/{bookingId}Update a bookingChanges guest contact data, notes and the external reference. Dates, room type and occupancy cannot be changed in v1 (cancel and rebook, or ask the hotel). Requires If-Match. Bookings that are checked in, checked out, cancelled or no-show return 409 booking_not_modifiable.
Scopes: bookings:writeoperationId updateBooking
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
bookingIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-Matchrequired | header | string | ETag of the version you read. Missing → 428, stale → 412. |
Idempotency-Key | header | string | Optional idempotency key, same rules as for POST. |
Request body
Fields to change.
guestBookingGuestPatch | nullShow fields (4)
firstNamestring | nulllastNamestring | nullemailstring | null (email)phonestring | null
notesstring | nullexternalReferencestring | null
Responses
200Updated booking.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredreferencestringrequiredBooking number shown to the hotel and the guest.
statusstringrequiredBooking status.
Values:
"pending","tentative","confirmed","checked_in","checked_out","cancelled","no_show"channelstringrequiredSales path.
Values:
"direct","manual","channels","api"externalReferencestring | nullrequiredPartner reference (unique per hotel).
checkInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredadultsintegerrequiredchildrenintegerrequiredchildrenAgesarray<integer>requiredroomsarray<BookingRoom>requiredShow fields (5)
roomTypeIdstring (uuid)requiredunitIdstring | null (uuid)requiredAssigned unit.
ratePlanIdstring | null (uuid)requiredadultsintegerrequiredchildrenintegerrequired
guestBookingGuestrequiredPrimary guest snapshot of the booking.
Show fields (5)
idstring | null (uuid)requiredGuest profile, if linked.
firstNamestring | nullrequiredlastNamestring | nullrequiredemailstring | nullrequiredphonestring | nullrequired
totalobjectrequiredBooking total calculated by STRYK.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidobjectrequiredSettled amount (all payment paths).
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingobjectrequiredtotal minus paid, never negative.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
notesstring | nullrequiredcancellationBookingCancellation | nullrequiredShow fields (2)
cancelledAtstring | null (date-time)requiredfeeMoney | nullrequiredCancellation fee according to the hotel's policy.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "reference": "B-2026-01842", "status": "confirmed", "channel": "api", "externalReference": "WEB-1234", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "adults": 2, "children": 1, "childrenAges": [6], "rooms": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "adults": 2, "children": 1 } ], "guest": { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "email": "anna.muster@example.com", "phone": "+43 660 1234567" }, "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "0.00", "currency": "EUR" }, "outstanding": { "amount": "447.60", "currency": "EUR" }, "notes": "Late arrival around 22:00.", "cancellation": null, "createdAt": "2026-11-04T08:15:00.000Z", "updatedAt": "2026-11-04T08:15:00.000Z", "version": "7c1e2d3f4a5b6c7d8e9f0a1b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }412If-Match does not match the current version.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_failed", "title": "Precondition failed", "status": 412, "detail": "The resource changed since you read it. Fetch it again and retry with the new ETag.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }428If-Match header missing.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_required", "title": "Precondition required", "status": 428, "detail": "Send the current ETag in the If-Match header.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_required", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X PATCH 'https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'If-Match: "7c1e2d3f4a5b6c7d8e9f0a1b"' \
-H 'Content-Type: application/json' \
--data '{
"guest": {
"phone": "+43 660 7654321"
},
"notes": "Arrival by train, around 18:00.",
"externalReference": "WEB-1234"
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'If-Match': '"7c1e2d3f4a5b6c7d8e9f0a1b"',
'Content-Type': 'application/json',
},
body: JSON.stringify({
guest: {
phone: '+43 660 7654321',
},
notes: 'Arrival by train, around 18:00.',
externalReference: 'WEB-1234',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.patch(
"https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"If-Match": "\"7c1e2d3f4a5b6c7d8e9f0a1b\"",
},
json={
"guest": {
"phone": "+43 660 7654321",
},
"notes": "Arrival by train, around 18:00.",
"externalReference": "WEB-1234",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"reference": "B-2026-01842",
"status": "confirmed",
"channel": "api",
"externalReference": "WEB-1234",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"adults": 2,
"children": 1,
"childrenAges": [6],
"rooms": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"children": 1
}
],
"guest": {
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567"
},
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "0.00",
"currency": "EUR"
},
"outstanding": {
"amount": "447.60",
"currency": "EUR"
},
"notes": "Late arrival around 22:00.",
"cancellation": null,
"createdAt": "2026-11-04T08:15:00.000Z",
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "7c1e2d3f4a5b6c7d8e9f0a1b"
}POST/bookings/{bookingId}/cancelCancel a booking
/bookings/{bookingId}/cancelCancel a bookingCancels through the hotel's cancellation workflow: the cancellation policy and fee of the booking apply, availability is released and the hotel's guest notification for cancellations is sent. Only confirmed bookings before the stay can be cancelled; others return 409 booking_not_modifiable.
Scopes: bookings:writeoperationId cancelBooking
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
bookingIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Keyrequired | header | string | Unique key per logical write (1-160 characters A-Z a-z 0-9 . _ : -), stored 24 h. Retrying with the same key and body replays the first response. |
Request body
Optional reason.
reasonstring | nullReason for the hotel's log.
Responses
200Cancelled booking.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredreferencestringrequiredBooking number shown to the hotel and the guest.
statusstringrequiredBooking status.
Values:
"pending","tentative","confirmed","checked_in","checked_out","cancelled","no_show"channelstringrequiredSales path.
Values:
"direct","manual","channels","api"externalReferencestring | nullrequiredPartner reference (unique per hotel).
checkInstring (date)requiredcheckOutstring (date)requirednightsintegerrequiredadultsintegerrequiredchildrenintegerrequiredchildrenAgesarray<integer>requiredroomsarray<BookingRoom>requiredShow fields (5)
roomTypeIdstring (uuid)requiredunitIdstring | null (uuid)requiredAssigned unit.
ratePlanIdstring | null (uuid)requiredadultsintegerrequiredchildrenintegerrequired
guestBookingGuestrequiredPrimary guest snapshot of the booking.
Show fields (5)
idstring | null (uuid)requiredGuest profile, if linked.
firstNamestring | nullrequiredlastNamestring | nullrequiredemailstring | nullrequiredphonestring | nullrequired
totalobjectrequiredBooking total calculated by STRYK.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidobjectrequiredSettled amount (all payment paths).
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingobjectrequiredtotal minus paid, never negative.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
notesstring | nullrequiredcancellationBookingCancellation | nullrequiredShow fields (2)
cancelledAtstring | null (date-time)requiredfeeMoney | nullrequiredCancellation fee according to the hotel's policy.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)requiredupdatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "reference": "B-2026-01842", "status": "cancelled", "channel": "api", "externalReference": "WEB-1234", "checkIn": "2026-12-01", "checkOut": "2026-12-04", "nights": 3, "adults": 2, "children": 1, "childrenAges": [6], "rooms": [ { "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f", "ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a", "adults": 2, "children": 1 } ], "guest": { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "email": "anna.muster@example.com", "phone": "+43 660 1234567" }, "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "0.00", "currency": "EUR" }, "outstanding": { "amount": "447.60", "currency": "EUR" }, "notes": "Late arrival around 22:00.", "cancellation": { "cancelledAt": "2026-11-10T10:00:00.000Z", "fee": { "amount": "0.00", "currency": "EUR" } }, "createdAt": "2026-11-04T08:15:00.000Z", "updatedAt": "2026-11-10T10:00:00.000Z", "version": "9a8b7c6d5e4f3a2b1c0d9e8f" }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X POST 'https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/cancel' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Idempotency-Key: web-order-1234-create' \
-H 'Content-Type: application/json' \
--data '{
"reason": "Guest cancelled on the partner website."
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Idempotency-Key': 'web-order-1234-create',
'Content-Type': 'application/json',
},
body: JSON.stringify({
reason: 'Guest cancelled on the partner website.',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.post(
"https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/cancel",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"Idempotency-Key": "web-order-1234-create",
},
json={
"reason": "Guest cancelled on the partner website.",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"reference": "B-2026-01842",
"status": "cancelled",
"channel": "api",
"externalReference": "WEB-1234",
"checkIn": "2026-12-01",
"checkOut": "2026-12-04",
"nights": 3,
"adults": 2,
"children": 1,
"childrenAges": [6],
"rooms": [
{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"unitId": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"ratePlanId": "9e8d7c6b-5a49-4382-8170-6f5e4d3c2b1a",
"adults": 2,
"children": 1
}
],
"guest": {
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567"
},
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "0.00",
"currency": "EUR"
},
"outstanding": {
"amount": "447.60",
"currency": "EUR"
},
"notes": "Late arrival around 22:00.",
"cancellation": {
"cancelledAt": "2026-11-10T10:00:00.000Z",
"fee": {
"amount": "0.00",
"currency": "EUR"
}
},
"createdAt": "2026-11-04T08:15:00.000Z",
"updatedAt": "2026-11-10T10:00:00.000Z",
"version": "9a8b7c6d5e4f3a2b1c0d9e8f"
}Guests
GDPR-minimal guest profiles.
GET/guestsList guests
/guestsList guestsGuest profiles (GDPR-minimal), ordered by updatedAt, id. Erased guests and guests with restricted processing are not visible.
Scopes: guests:readoperationId listGuests
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
updated_since | query | string (date-time) | RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt. |
email | query | string | Exact e-mail (case-insensitive). |
Responses
200Guests.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<Guest>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (10)
idstring (uuid)requiredfirstNamestring | nullrequiredlastNamestring | nullrequiredsalutationstring | nullemailstring | nullphonestring | nullcountrystring | nullISO 3166-1 alpha-2.
addressAddress | nullShow fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
updatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "salutation": "Frau", "email": "anna.muster@example.com", "phone": "+43 660 1234567", "country": "AT", "address": { "street": "Hauptplatz 1", "postalCode": "8010", "city": "Graz", "country": "AT" }, "updatedAt": "2026-11-04T08:15:00.000Z", "version": "3e4f5a6b7c8d9e0f1a2b3c4d" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/guests?updated_since=2026-11-01T00%3A00%3A00Z' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/guests?updated_since=2026-11-01T00%3A00%3A00Z', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/guests",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"updated_since": "2026-11-01T00:00:00Z"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"salutation": "Frau",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567",
"country": "AT",
"address": {
"street": "Hauptplatz 1",
"postalCode": "8010",
"city": "Graz",
"country": "AT"
},
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "3e4f5a6b7c8d9e0f1a2b3c4d"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}GET/guests/{guestId}Get a guest
/guests/{guestId}Get a guestOne guest profile with ETag.
Scopes: guests:readoperationId getGuest
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
guestIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Guest.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstring (uuid)requiredfirstNamestring | nullrequiredlastNamestring | nullrequiredsalutationstring | nullemailstring | nullphonestring | nullcountrystring | nullISO 3166-1 alpha-2.
addressAddress | nullShow fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
updatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "salutation": "Frau", "email": "anna.muster@example.com", "phone": "+43 660 1234567", "country": "AT", "address": { "street": "Hauptplatz 1", "postalCode": "8010", "city": "Graz", "country": "AT" }, "updatedAt": "2026-11-04T08:15:00.000Z", "version": "3e4f5a6b7c8d9e0f1a2b3c4d" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"salutation": "Frau",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567",
"country": "AT",
"address": {
"street": "Hauptplatz 1",
"postalCode": "8010",
"city": "Graz",
"country": "AT"
},
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "3e4f5a6b7c8d9e0f1a2b3c4d"
}PATCH/guests/{guestId}Update guest contact data
/guests/{guestId}Update guest contact dataChanges name, salutation, e-mail, phone, country and address of a guest profile. Requires If-Match.
Scopes: guests:writeoperationId updateGuest
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
guestIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-Matchrequired | header | string | ETag of the version you read. Missing → 428, stale → 412. |
Idempotency-Key | header | string | Optional idempotency key, same rules as for POST. |
Request body
Fields to change.
firstNamestring | nulllastNamestring | nullsalutationstring | nullemailstring | null (email)phonestring | nullcountrystring | nulladdressAddress | nullShow fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
Responses
200Updated guest.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredfirstNamestring | nullrequiredlastNamestring | nullrequiredsalutationstring | nullemailstring | nullphonestring | nullcountrystring | nullISO 3166-1 alpha-2.
addressAddress | nullShow fields (4)
streetstring | nullStreet and number.
postalCodestring | nullPostal code.
citystring | nullCity.
countrystring | nullISO 3166-1 alpha-2 country code.
updatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e", "firstName": "Anna", "lastName": "Muster", "salutation": "Frau", "email": "anna.muster@example.com", "phone": "+43 660 1234567", "country": "AT", "address": { "street": "Hauptplatz 1", "postalCode": "8010", "city": "Graz", "country": "AT" }, "updatedAt": "2026-11-04T08:15:00.000Z", "version": "3e4f5a6b7c8d9e0f1a2b3c4d" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }412If-Match does not match the current version.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_failed", "title": "Precondition failed", "status": 412, "detail": "The resource changed since you read it. Fetch it again and retry with the new ETag.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }428If-Match header missing.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#precondition_required", "title": "Precondition required", "status": 428, "detail": "Send the current ETag in the If-Match header.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "precondition_required", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X PATCH 'https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'If-Match: "7c1e2d3f4a5b6c7d8e9f0a1b"' \
-H 'Content-Type: application/json' \
--data '{
"email": "anna.muster@example.org",
"phone": "+43 660 7654321"
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'If-Match': '"7c1e2d3f4a5b6c7d8e9f0a1b"',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'anna.muster@example.org',
phone: '+43 660 7654321',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.patch(
"https://app.staystryk.com/api/partner/v1/guests/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"If-Match": "\"7c1e2d3f4a5b6c7d8e9f0a1b\"",
},
json={
"email": "anna.muster@example.org",
"phone": "+43 660 7654321",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e",
"firstName": "Anna",
"lastName": "Muster",
"salutation": "Frau",
"email": "anna.muster@example.com",
"phone": "+43 660 1234567",
"country": "AT",
"address": {
"street": "Hauptplatz 1",
"postalCode": "8010",
"city": "Graz",
"country": "AT"
},
"updatedAt": "2026-11-04T08:15:00.000Z",
"version": "3e4f5a6b7c8d9e0f1a2b3c4d"
}Payments
Payment status of bookings; bank transfers on issued invoices.
GET/bookings/{bookingId}/paymentsGet the payment status of a booking
/bookings/{bookingId}/paymentsGet the payment status of a bookingTotal, paid and outstanding amount plus online payments. Read only; the API never accepts payment data.
Scopes: payments:readoperationId getBookingPayments
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
bookingIdrequired | path | string (uuid) | - |
Responses
200Payment status.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
bookingIdstring (uuid)requiredstatusstringrequiredValues:
"unpaid","partially_paid","paid","refunded","overpaid"totalMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paymentsarray<Payment>requiredOnline payments (max. 50). Front-desk payments are part of paid only.
Show fields (5)
idstring (uuid)requiredstatusstringrequiredValues:
"requires_action","authorized","captured","partially_refunded","refunded","failed","cancelled","expired","unknown"methodstringrequiredValues:
"bank_transfer","provider_checkout","credit_card","paypal","google_pay","apple_pay","eps","point_of_sale","other"amountMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
createdAtstring (date-time)required
{ "bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "status": "partially_paid", "total": { "amount": "447.60", "currency": "EUR" }, "paid": { "amount": "100.00", "currency": "EUR" }, "outstanding": { "amount": "347.60", "currency": "EUR" }, "payments": [ { "id": "6e5d4c3b-2a19-4f8e-9d7c-6b5a4f3e2d1c", "status": "captured", "method": "credit_card", "amount": { "amount": "100.00", "currency": "EUR" }, "createdAt": "2026-11-04T08:20:31.000Z" } ] }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/bookings/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"status": "partially_paid",
"total": {
"amount": "447.60",
"currency": "EUR"
},
"paid": {
"amount": "100.00",
"currency": "EUR"
},
"outstanding": {
"amount": "347.60",
"currency": "EUR"
},
"payments": [
{
"id": "6e5d4c3b-2a19-4f8e-9d7c-6b5a4f3e2d1c",
"status": "captured",
"method": "credit_card",
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"createdAt": "2026-11-04T08:20:31.000Z"
}
]
}POST/invoices/{invoiceId}/paymentsRecord a bank transfer on an invoice
/invoices/{invoiceId}/paymentsRecord a bank transfer on an invoiceRecords a received bank transfer on an issued invoice through the hotel's finance owner (open amount, accounting, receivables, booking paid amount → payment.updated). Only bank transfers; cash and card payments need the hotel's register receipt and are not accepted. The amount must not exceed the open amount. Requires Idempotency-Key.
Scopes: payments:writeoperationId createInvoicePayment
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
invoiceIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Keyrequired | header | string | Unique key per logical write (1-160 characters A-Z a-z 0-9 . _ : -), stored 24 h. Retrying with the same key and body replays the first response. |
Request body
Received bank transfer.
amountMoneyrequiredAmount in the invoice currency, at most the open amount.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
paidAtstring | null (date)Value date (default today).
referencestring | nullBank reference (max. 140).
Responses
201Recorded payment.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
invoiceIdstring (uuid)requiredInvoice.
methodstringrequiredAlways bank_transfer.
amountMoneyrequiredRecorded amount.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
invoiceStatusstringrequiredInvoice status afterwards (issued, partially_paid, paid, …).
outstandingMoneyrequiredOpen amount afterwards.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
{ "invoiceId": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e", "method": "bank_transfer", "amount": { "amount": "447.60", "currency": "EUR" }, "invoiceStatus": "paid", "outstanding": { "amount": "0.00", "currency": "EUR" } }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X POST 'https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Idempotency-Key: web-order-1234-create' \
-H 'Content-Type: application/json' \
--data '{
"amount": {
"amount": "447.60",
"currency": "EUR"
},
"paidAt": "2026-11-04",
"reference": "SEPA E2E 20261104-0042"
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Idempotency-Key': 'web-order-1234-create',
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: {
amount: '447.60',
currency: 'EUR',
},
paidAt: '2026-11-04',
reference: 'SEPA E2E 20261104-0042',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.post(
"https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f/payments",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"Idempotency-Key": "web-order-1234-create",
},
json={
"amount": {
"amount": "447.60",
"currency": "EUR",
},
"paidAt": "2026-11-04",
"reference": "SEPA E2E 20261104-0042",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"invoiceId": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
"method": "bank_transfer",
"amount": {
"amount": "447.60",
"currency": "EUR"
},
"invoiceStatus": "paid",
"outstanding": {
"amount": "0.00",
"currency": "EUR"
}
}Invoices
Issued invoices (read only; invoices are fiscal documents of the hotel).
GET/invoicesList invoices
/invoicesList invoicesIssued invoices, corrections and credit notes (never drafts), ordered by updatedAt, id.
Scopes: invoices:readoperationId listInvoices
Parameters, query
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size 1-200 (default 50). |
cursor | query | string | nextCursor of the previous page. Keep all other parameters unchanged. |
updated_since | query | string (date-time) | RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt. |
bookingId | query | string (uuid) | Only documents of this booking. |
Responses
200Invoices.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<Invoice>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (12)
idstring (uuid)requirednumberstring | nullrequiredInvoice number.
typestringrequiredValues:
"invoice","correction","credit_note"bookingIdstring | null (uuid)requiredstatusstringrequiredValues:
"issued","partially_paid","paid","overdue","cancelled","credited"issuedAtstring | null (date-time)requiredtotalobjectrequiredGross amount.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
netMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
taxMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
updatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "number": "RE-2026-00412", "type": "invoice", "bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "status": "partially_paid", "issuedAt": "2026-12-04T10:05:00.000Z", "total": { "amount": "447.60", "currency": "EUR" }, "net": { "amount": "398.16", "currency": "EUR" }, "tax": { "amount": "49.44", "currency": "EUR" }, "outstanding": { "amount": "347.60", "currency": "EUR" }, "updatedAt": "2026-12-04T10:05:00.000Z", "version": "5d6e7f8a9b0c1d2e3f4a5b6c" } ], "nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM", "hasMore": true }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/invoices?updated_since=2026-11-01T00%3A00%3A00Z' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/invoices?updated_since=2026-11-01T00%3A00%3A00Z', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/invoices",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
params={"updated_since": "2026-11-01T00:00:00Z"},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"number": "RE-2026-00412",
"type": "invoice",
"bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"status": "partially_paid",
"issuedAt": "2026-12-04T10:05:00.000Z",
"total": {
"amount": "447.60",
"currency": "EUR"
},
"net": {
"amount": "398.16",
"currency": "EUR"
},
"tax": {
"amount": "49.44",
"currency": "EUR"
},
"outstanding": {
"amount": "347.60",
"currency": "EUR"
},
"updatedAt": "2026-12-04T10:05:00.000Z",
"version": "5d6e7f8a9b0c1d2e3f4a5b6c"
}
],
"nextCursor": "djF8MjAyNi0xMS0wNFQwODoxNTowMFp8NWIyZTlmMWM",
"hasMore": true
}GET/invoices/{invoiceId}Get an invoice
/invoices/{invoiceId}Get an invoiceHeader and totals of one issued document. No PDF in v1.
Scopes: invoices:readoperationId getInvoice
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
invoiceIdrequired | path | string (uuid) | - |
Headers
| Name | In | Type | Description |
|---|---|---|---|
If-None-Match | header | string | ETag you hold; 304 when unchanged. |
Responses
200Invoice.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
idstring (uuid)requirednumberstring | nullrequiredInvoice number.
typestringrequiredValues:
"invoice","correction","credit_note"bookingIdstring | null (uuid)requiredstatusstringrequiredValues:
"issued","partially_paid","paid","overdue","cancelled","credited"issuedAtstring | null (date-time)requiredtotalobjectrequiredGross amount.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
netMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
taxMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
outstandingMoneyrequiredMoney amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
updatedAtstring (date-time)requiredversionstringrequiredETag value without quotes.
{ "id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "number": "RE-2026-00412", "type": "invoice", "bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "status": "partially_paid", "issuedAt": "2026-12-04T10:05:00.000Z", "total": { "amount": "447.60", "currency": "EUR" }, "net": { "amount": "398.16", "currency": "EUR" }, "tax": { "amount": "49.44", "currency": "EUR" }, "outstanding": { "amount": "347.60", "currency": "EUR" }, "updatedAt": "2026-12-04T10:05:00.000Z", "version": "5d6e7f8a9b0c1d2e3f4a5b6c" }304Not modified (If-None-Match matched).
RateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
ETag- Strong entity tag of the returned version.
401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/invoices/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"number": "RE-2026-00412",
"type": "invoice",
"bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"status": "partially_paid",
"issuedAt": "2026-12-04T10:05:00.000Z",
"total": {
"amount": "447.60",
"currency": "EUR"
},
"net": {
"amount": "398.16",
"currency": "EUR"
},
"tax": {
"amount": "49.44",
"currency": "EUR"
},
"outstanding": {
"amount": "347.60",
"currency": "EUR"
},
"updatedAt": "2026-12-04T10:05:00.000Z",
"version": "5d6e7f8a9b0c1d2e3f4a5b6c"
}Webhooks
Signed thin events STRYK sends to your endpoint.
GET/webhook-event-typesList webhook event types
/webhook-event-typesList webhook event typesAll event types a webhook endpoint can subscribe to. Endpoints are managed by the hotel in STRYK (Channels → API).
Scopes: Any valid keyoperationId listWebhookEventTypes
Responses
200Event types.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
dataarray<WebhookEventTypeInfo>requiredItems of this page, ordered by updatedAt ascending, then id.
Show fields (2)
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"descriptionstringrequiredWhat triggers the event.
nextCursorstring | nullrequiredOpaque cursor for the next page; null on the last page.
hasMorebooleanrequiredTrue when another page exists.
{ "data": [ { "type": "booking.created", "description": "A booking was created (by the hotel, a channel, the booking engine or the API)." }, { "type": "booking.updated", "description": "Booking data changed: dates, room type, guests, status, notes or price." }, { "type": "booking.cancelled", "description": "A booking was cancelled." } ], "nextCursor": null, "hasMore": false }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl 'https://app.staystryk.com/api/partner/v1/webhook-event-types' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/webhook-event-types', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.get(
"https://app.staystryk.com/api/partner/v1/webhook-event-types",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"data": [
{
"type": "booking.created",
"description": "A booking was created (by the hotel, a channel, the booking engine or the API)."
},
{
"type": "booking.updated",
"description": "Booking data changed: dates, room type, guests, status, notes or price."
},
{
"type": "booking.cancelled",
"description": "A booking was cancelled."
}
],
"nextCursor": null,
"hasMore": false
}Availability
POST/availability/restrictionsCreate an availability restriction
/availability/restrictionsCreate an availability restrictionCloses a room type, caps its sellable units or closes it to arrival or departure for an inclusive date range (at most 500 days). Goes through the hotel's availability owner, so the change reaches the booking engine, channels and availability.changed at once. The key can delete only restrictions it created.
Scopes: availability:writeoperationId createRestriction
Headers
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Keyrequired | header | string | Unique key per logical write (1-160 characters A-Z a-z 0-9 . _ : -), stored 24 h. Retrying with the same key and body replays the first response. |
Request body
Restriction to create.
roomTypeIdstring (uuid)requiredActive room type.
typestringrequiredclosure(not sellable),capacity_cap(at mostcapacityunits),closed_to_arrival,closed_to_departure.Values:
"closure","capacity_cap","closed_to_arrival","closed_to_departure"fromstring (date)requiredFirst day (inclusive).
tostring (date)requiredLast day (inclusive), at most 500 days after from.
capacityinteger | nullOnly for capacity_cap; 0 to active units − 1.
namestring | nullLabel shown to the hotel (max. 120).
Responses
201Created restriction.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
idstring (uuid)requiredRestriction id.
roomTypeIdstring (uuid)requiredRoom type.
typestringrequiredRestriction type.
fromstring (date)requiredFirst day.
tostring (date)requiredLast day.
capacityinteger | nullCap for capacity_cap.
namestring | nullLabel.
createdAtstring (date-time)requiredCreation time.
{ "id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d", "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "type": "capacity_cap", "from": "2026-12-24", "to": "2026-12-26", "capacity": 2, "name": "RMS cap Christmas", "createdAt": "2026-11-05T09:00:00.000Z" }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X POST 'https://app.staystryk.com/api/partner/v1/availability/restrictions' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Idempotency-Key: web-order-1234-create' \
-H 'Content-Type: application/json' \
--data '{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"type": "capacity_cap",
"from": "2026-12-24",
"to": "2026-12-26",
"capacity": 2,
"name": "RMS cap Christmas"
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/availability/restrictions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Idempotency-Key': 'web-order-1234-create',
'Content-Type': 'application/json',
},
body: JSON.stringify({
roomTypeId: '3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f',
type: 'capacity_cap',
from: '2026-12-24',
to: '2026-12-26',
capacity: 2,
name: 'RMS cap Christmas',
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.post(
"https://app.staystryk.com/api/partner/v1/availability/restrictions",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
"Idempotency-Key": "web-order-1234-create",
},
json={
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"type": "capacity_cap",
"from": "2026-12-24",
"to": "2026-12-26",
"capacity": 2,
"name": "RMS cap Christmas",
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"type": "capacity_cap",
"from": "2026-12-24",
"to": "2026-12-26",
"capacity": 2,
"name": "RMS cap Christmas",
"createdAt": "2026-11-05T09:00:00.000Z"
}DELETE/availability/restrictions/{restrictionId}Delete a restriction created by this key
/availability/restrictions/{restrictionId}Delete a restriction created by this keyRemoves a restriction this API key created and returns it as it was. Restrictions of the hotel or of Intelligent Pricing answer 404.
Scopes: availability:writeoperationId deleteRestriction
Parameters, path
| Name | In | Type | Description |
|---|---|---|---|
restrictionIdrequired | path | string (uuid) | - |
Responses
200Deleted restriction.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
idstring (uuid)requiredRestriction id.
roomTypeIdstring (uuid)requiredRoom type.
typestringrequiredRestriction type.
fromstring (date)requiredFirst day.
tostring (date)requiredLast day.
capacityinteger | nullCap for capacity_cap.
namestring | nullLabel.
createdAtstring (date-time)requiredCreation time.
{ "id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d", "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "type": "capacity_cap", "from": "2026-12-24", "to": "2026-12-26", "capacity": 2, "name": "RMS cap Christmas", "createdAt": "2026-11-05T09:00:00.000Z" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X DELETE 'https://app.staystryk.com/api/partner/v1/availability/restrictions/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f' \
-H "Authorization: Bearer $STRYK_API_KEY"const response = await fetch('https://app.staystryk.com/api/partner/v1/availability/restrictions/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
},
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}import os
import requests
response = requests.delete(
"https://app.staystryk.com/api/partner/v1/availability/restrictions/3f1c2b9a-6d4e-4b8a-9c7e-1a2b3c4d5e6f",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
timeout=30,
)
response.raise_for_status(){
"id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"type": "capacity_cap",
"from": "2026-12-24",
"to": "2026-12-26",
"capacity": 2,
"name": "RMS cap Christmas",
"createdAt": "2026-11-05T09:00:00.000Z"
}PUT/ratesSet daily prices of a room type
/ratesSet daily prices of a room typeSets or resets (price null) the daily price of a room type for up to 366 days from today, through the hotel's price owner (category bounds, channel distribution, pricing audit). The currency must be the hotel currency. Rate rules and rate plans are not changed. Emits rate.changed.
Scopes: rates:writeoperationId updateRates
Headers
| Name | In | Type | Description |
|---|---|---|---|
Idempotency-Key | header | string | Optional idempotency key, same rules as for POST. |
Request body
Daily prices.
roomTypeIdstring (uuid)requiredActive room type.
pricesarray<RatePriceInput>required1-366 days, each date once, within 366 days.
Show fields (2)
datestring (date)requiredDay (today or later).
priceMoney | nullPrice per night in the hotel currency, or null.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
Responses
200Result.
application/jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Idempotent-Replayed- true when the response is the stored result of an earlier request with the same Idempotency-Key.
roomTypeIdstring (uuid)requiredRoom type.
fromstring (date)requiredFirst affected day.
tostring (date)requiredLast affected day.
changedintegerrequiredDays with a new price.
unchangedintegerrequiredDays that already had this price or no price to reset.
resetintegerrequiredDays reset to the rate rules.
{ "roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f", "from": "2026-12-24", "to": "2026-12-25", "changed": 1, "unchanged": 0, "reset": 1 }400Bad request: malformed JSON, invalid cursor or missing Idempotency-Key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#invalid_cursor", "title": "Invalid cursor", "status": 400, "detail": "The cursor is invalid or expired. Restart the listing without cursor.", "instance": "/api/partner/v1/bookings", "code": "invalid_cursor", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }401Missing, unknown, revoked or expired API key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Send a valid API key in the Authorization header: Bearer stryk_live_….", "instance": "/api/partner/v1/bookings", "code": "unauthorized", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }403The key lacks the scope, the IP is not allowed or the channel module is disabled.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#insufficient_scope", "title": "Insufficient scope", "status": 403, "detail": "This API key lacks the scope bookings:write.", "instance": "/api/partner/v1/bookings", "code": "insufficient_scope", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }404The resource does not exist for this hotel.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#not_found", "title": "Not found", "status": 404, "detail": "Booking was not found.", "instance": "/api/partner/v1/bookings/5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a", "code": "not_found", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }409Conflict with the current state.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#conflict", "title": "Conflict", "status": 409, "detail": "expectedTotal does not match the current price of the stay.", "instance": "/api/partner/v1/bookings", "code": "conflict", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "currentTotal": { "amount": "459.60", "currency": "EUR" } }413Body larger than 64 KiB.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#payload_too_large", "title": "Payload too large", "status": 413, "detail": "The request body may have at most 64 KiB.", "instance": "/api/partner/v1/bookings", "code": "payload_too_large", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }415Body is not application/json.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#unsupported_media_type", "title": "Unsupported media type", "status": 415, "detail": "Send the body as application/json.", "instance": "/api/partner/v1/bookings", "code": "unsupported_media_type", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }422The request contains invalid fields.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#validation_failed", "title": "Validation failed", "status": 422, "detail": "The request contains invalid fields.", "instance": "/api/partner/v1/bookings", "code": "validation_failed", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b", "errors": [ { "field": "checkOut", "message": "checkOut must be after checkIn." } ] }429Too many requests for this key.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
Retry-After- Seconds to wait before retrying.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#rate_limited", "title": "Too many requests", "status": 429, "detail": "Rate limit of 120 requests per 60 seconds exceeded.", "instance": "/api/partner/v1/bookings", "code": "rate_limited", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }500Unexpected server error.
application/problem+jsonRateLimit-Limit- Requests allowed per window for this key (default 120).
RateLimit-Remaining- Requests left in the current window.
RateLimit-Reset- Seconds until the window resets.
X-Request-Id- Request id (also in problem bodies); quote it to support.
typestring (uri)requiredURI of the error documentation.
titlestringrequiredShort summary of the error class.
statusintegerrequiredHTTP status code.
detailstringHuman-readable explanation of this occurrence.
instancestringRequest path.
codestringrequiredStable machine-readable error code.
Values:
"unauthorized","key_expired","ip_not_allowed","insufficient_scope","module_disabled","not_found","method_not_allowed","conflict","idempotency_in_progress","not_available","booking_not_modifiable","precondition_failed","payload_too_large","unsupported_media_type","validation_failed","idempotency_key_reused","precondition_required","rate_limited","idempotency_key_required","invalid_cursor","bad_request","internal_error","service_unavailable"requestIdstringrequiredSame value as the X-Request-Id response header; quote it to support.
errorsarray<object>Field errors for validation_failed.
Show fields (2)
fieldstringrequiredRequest field (dot notation).
messagestringrequiredWhat is wrong with it.
currentTotalobjectconflict on POST /bookings: the current server price.
Show fields (2)
amountstringrequiredDecimal string, exactly two fraction digits.
currencystringrequiredISO 4217 currency code.
bookingIdstring (uuid)conflict on an already used externalReference: the booking that uses it.
{ "type": "https://staystryk.com/developers/errors#internal_error", "title": "Internal error", "status": 500, "detail": "An unexpected error occurred. Retry later or contact the hotel.", "instance": "/api/partner/v1/bookings", "code": "internal_error", "requestId": "6f1d2c3b-4a5e-4f60-8a7b-9c0d1e2f3a4b" }
curl -X PUT 'https://app.staystryk.com/api/partner/v1/rates' \
-H "Authorization: Bearer $STRYK_API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"prices": [
{
"date": "2026-12-24",
"price": {
"amount": "219.00",
"currency": "EUR"
}
},
{
"date": "2026-12-25",
"price": null
}
]
}'const response = await fetch('https://app.staystryk.com/api/partner/v1/rates', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.STRYK_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
roomTypeId: '3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f',
prices: [
{
date: '2026-12-24',
price: {
amount: '219.00',
currency: 'EUR',
},
},
{
date: '2026-12-25',
price: null,
},
],
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.code}: ${problem.detail} (request ${problem.requestId})`);
}
const data = await response.json();import os
import requests
response = requests.put(
"https://app.staystryk.com/api/partner/v1/rates",
headers={
"Authorization": f"Bearer {os.environ['STRYK_API_KEY']}",
},
json={
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"prices": [
{
"date": "2026-12-24",
"price": {
"amount": "219.00",
"currency": "EUR",
},
},
{
"date": "2026-12-25",
"price": None,
},
],
},
timeout=30,
)
response.raise_for_status()
data = response.json(){
"roomTypeId": "3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f",
"from": "2026-12-24",
"to": "2026-12-25",
"changed": 1,
"unchanged": 0,
"reset": 1
}Webhook events
Signature verification and retries
POSTbooking.createdbooking.created
booking.createdbooking.createdA booking was created (by the hotel, a channel, the booking engine or the API). Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "booking.created",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "booking",
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a"
}
}POSTbooking.updatedbooking.updated
booking.updatedbooking.updatedBooking data changed: dates, room type, guests, status, notes or price. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "booking.updated",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "booking",
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a",
"changes": ["status"]
}
}POSTbooking.cancelledbooking.cancelled
booking.cancelledbooking.cancelledA booking was cancelled. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "booking.cancelled",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "booking",
"id": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a"
}
}POSTguest.updatedguest.updated
guest.updatedguest.updatedContact data of a guest profile changed. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "guest.updated",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "guest",
"id": "8f7e6d5c-4b3a-4291-8f0e-9d8c7b6a5f4e"
}
}POSTavailability.changedavailability.changed
availability.changedavailability.changedSellable availability or stay restrictions changed for room types and a date range. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "availability.changed",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "availability",
"roomTypeIds": ["3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f"],
"from": "2026-12-01",
"to": "2026-12-07"
}
}POSTrate.changedrate.changed
rate.changedrate.changedDaily prices or rate plans changed for room types and a date range. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "rate.changed",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "rate",
"roomTypeIds": ["3f6c2b1e-8d4a-4c1b-9e2f-5a7b8c9d0e1f"],
"from": "2026-12-01",
"to": "2026-12-07"
}
}POSTpayment.updatedpayment.updated
payment.updatedpayment.updatedThe payment status of a booking changed. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "payment.updated",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "payment",
"bookingId": "5b2e9f1c-7d3a-4e8b-a6c4-0f1e2d3c4b5a"
}
}POSTunit.updatedunit.updated
unit.updatedunit.updatedThe housekeeping status of a unit changed (any source). Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "unit.updated",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "unit",
"id": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"changes": ["housekeeping"]
}
}POSTwebhook.testwebhook.test
webhook.testwebhook.testTest event sent from the channel settings to verify the endpoint and the signature. Respond with any 2xx within 10 seconds; other answers are retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts).
Delivery headers
| Name | In | Type | Description |
|---|---|---|---|
STRYK-Event-Idrequired | header | string | Event id (same as body id). |
STRYK-Event-Typerequired | header | string | Event type. |
STRYK-Delivery-Idrequired | header | string | Id of this delivery (differs per endpoint). |
STRYK-Delivery-Attemptrequired | header | string | Attempt number, 1-8. |
STRYK-Signaturerequired | header | string | t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. During a secret rotation two v1 values are sent for 24 h. Reject timestamps older than 300 s; compare in constant time. |
Payload
idstringrequiredEvent id (evt_<uuid>); deduplicate on it.
typestringrequiredWebhook event type.
Values:
"booking.created","booking.updated","booking.cancelled","guest.updated","availability.changed","rate.changed","payment.updated","unit.updated","webhook.test"apiVersionstringrequiredcreatedAtstring (date-time)requiredhotelIdstringrequireddataobjectrequiredShow fields (8)
objectstringrequiredValues:
"booking","guest","availability","rate","payment","webhook"idstringObject id (booking, guest and webhook.test events).
bookingIdstring (uuid)payment.updated: booking whose payment status changed; read GET /bookings/{bookingId}/payments.
changesarray<string>booking.updated: changed areas (status, rooms, guest, details, deleted). Coalesced updates unite the areas.
Values:
"status","rooms","guest","details","deleted"roomTypeIdsarray<string (uuid)>availability/rate: affected room types.
ratePlanIdsarray<string (uuid)>rate.changed after a rate plan change: affected rate plans.
fromstring (date)availability/rate: first affected date.
tostring (date)availability/rate: last affected date.
Responses
- 2XXDelivery accepted.
{
"id": "evt_2c9a7b6e-1d4f-4e3a-9b8c-7d6e5f4a3b2c",
"type": "webhook.test",
"apiVersion": "v1",
"createdAt": "2026-11-04T08:15:01.204Z",
"hotelId": "hotel-alpenblick",
"data": {
"object": "webhook",
"id": "4d3c2b1a-0f9e-4d8c-8b7a-6f5e4d3c2b1a"
}
}